Lihat di TensorFlow.org | Jalankan di Google Colab | Lihat sumber di GitHub | Unduh buku catatan |
import tensorflow as tf
import numpy as np
Tensor adalah array multi-dimensi dengan tipe seragam (disebut dtype
). Anda dapat melihat semua dtypes
didukung di tf.dtypes.DType
.
Jika Anda terbiasa dengan NumPy , tensor (semacam) seperti np.arrays
.
Semua tensor tidak dapat diubah seperti angka dan string Python: Anda tidak akan pernah dapat memperbarui konten tensor, hanya membuat yang baru.
Dasar-dasar
Mari kita buat beberapa tensor dasar.
Berikut adalah tensor "skalar" atau "peringkat-0". Skalar berisi satu nilai, dan tidak ada "sumbu".
# This will be an int32 tensor by default; see "dtypes" below.
rank_0_tensor = tf.constant(4)
print(rank_0_tensor)
tf.Tensor(4, shape=(), dtype=int32)
Tensor "vektor" atau "peringkat-1" seperti daftar nilai. Sebuah vektor memiliki satu sumbu:
# Let's make this a float tensor.
rank_1_tensor = tf.constant([2.0, 3.0, 4.0])
print(rank_1_tensor)
tf.Tensor([2. 3. 4.], shape=(3,), dtype=float32)
Tensor "matriks" atau "peringkat-2" memiliki dua sumbu:
# If you want to be specific, you can set the dtype (see below) at creation time
rank_2_tensor = tf.constant([[1, 2],
[3, 4],
[5, 6]], dtype=tf.float16)
print(rank_2_tensor)
tf.Tensor( [[1. 2.] [3. 4.] [5. 6.]], shape=(3, 2), dtype=float16)
Sebuah skalar, bentuk: [] | Sebuah vektor, bentuk: [3] | Sebuah matriks, bentuk: [3, 2] |
---|---|---|
Tensor mungkin memiliki lebih banyak sumbu; di sini adalah tensor dengan tiga sumbu:
# There can be an arbitrary number of
# axes (sometimes called "dimensions")
rank_3_tensor = tf.constant([
[[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]],
[[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[20, 21, 22, 23, 24],
[25, 26, 27, 28, 29]],])
print(rank_3_tensor)
tf.Tensor( [[[ 0 1 2 3 4] [ 5 6 7 8 9]] [[10 11 12 13 14] [15 16 17 18 19]] [[20 21 22 23 24] [25 26 27 28 29]]], shape=(3, 2, 5), dtype=int32)
Ada banyak cara untuk memvisualisasikan tensor dengan lebih dari dua sumbu.
Tensor 3-sumbu, bentuk: [3, 2, 5] | ||
---|---|---|
Anda dapat mengonversi tensor ke array NumPy menggunakan np.array
atau tensor.numpy
:
np.array(rank_2_tensor)
array([[1., 2.], [3., 4.], [5., 6.]], dtype=float16)
rank_2_tensor.numpy()
array([[1., 2.], [3., 4.], [5., 6.]], dtype=float16)
Tensor sering mengandung float dan int, tetapi memiliki banyak jenis lainnya, termasuk:
- bilangan kompleks
- string
Kelas tf.Tensor
dasar membutuhkan tensor untuk menjadi "persegi panjang"---yaitu, di sepanjang setiap sumbu, setiap elemen berukuran sama. Namun, ada jenis tensor khusus yang dapat menangani berbagai bentuk:
- Tensor kasar (lihat RaggedTensor di bawah)
- Tensor jarang (lihat SparseTensor di bawah)
Anda dapat mengerjakan matematika dasar tentang tensor, termasuk penjumlahan, perkalian elemen, dan perkalian matriks.
a = tf.constant([[1, 2],
[3, 4]])
b = tf.constant([[1, 1],
[1, 1]]) # Could have also said `tf.ones([2,2])`
print(tf.add(a, b), "\n")
print(tf.multiply(a, b), "\n")
print(tf.matmul(a, b), "\n")
tf.Tensor( [[2 3] [4 5]], shape=(2, 2), dtype=int32) tf.Tensor( [[1 2] [3 4]], shape=(2, 2), dtype=int32) tf.Tensor( [[3 3] [7 7]], shape=(2, 2), dtype=int32)
print(a + b, "\n") # element-wise addition
print(a * b, "\n") # element-wise multiplication
print(a @ b, "\n") # matrix multiplication
tf.Tensor( [[2 3] [4 5]], shape=(2, 2), dtype=int32) tf.Tensor( [[1 2] [3 4]], shape=(2, 2), dtype=int32) tf.Tensor( [[3 3] [7 7]], shape=(2, 2), dtype=int32)
Tensor digunakan dalam semua jenis operasi (ops).
c = tf.constant([[4.0, 5.0], [10.0, 1.0]])
# Find the largest value
print(tf.reduce_max(c))
# Find the index of the largest value
print(tf.argmax(c))
# Compute the softmax
print(tf.nn.softmax(c))
tf.Tensor(10.0, shape=(), dtype=float32) tf.Tensor([1 0], shape=(2,), dtype=int64) tf.Tensor( [[2.6894143e-01 7.3105854e-01] [9.9987662e-01 1.2339458e-04]], shape=(2, 2), dtype=float32)
Tentang bentuk
Tensor memiliki bentuk. Beberapa kosakata:
- Bentuk : Panjang (jumlah elemen) dari masing-masing sumbu tensor.
- Rank : Jumlah sumbu tensor. Sebuah skalar memiliki rank 0, sebuah vektor memiliki rank 1, sebuah matriks memiliki rank 2.
- Sumbu atau Dimensi : Dimensi tertentu dari sebuah tensor.
- Ukuran : Jumlah total item dalam tensor, vektor bentuk produk.
Objek Tensor dan tf.TensorShape
memiliki properti yang nyaman untuk mengakses ini:
rank_4_tensor = tf.zeros([3, 2, 4, 5])
Tensor peringkat-4, bentuk: [3, 2, 4, 5] | |
---|---|
print("Type of every element:", rank_4_tensor.dtype)
print("Number of axes:", rank_4_tensor.ndim)
print("Shape of tensor:", rank_4_tensor.shape)
print("Elements along axis 0 of tensor:", rank_4_tensor.shape[0])
print("Elements along the last axis of tensor:", rank_4_tensor.shape[-1])
print("Total number of elements (3*2*4*5): ", tf.size(rank_4_tensor).numpy())
Type of every element: <dtype: 'float32'> Number of axes: 4 Shape of tensor: (3, 2, 4, 5) Elements along axis 0 of tensor: 3 Elements along the last axis of tensor: 5 Total number of elements (3*2*4*5): 120
Sementara sumbu sering disebut dengan indeksnya, Anda harus selalu melacak arti masing-masing. Seringkali sumbu diurutkan dari global ke lokal: Sumbu batch terlebih dahulu, diikuti oleh dimensi spasial, dan fitur untuk setiap lokasi terakhir. Dengan cara ini, vektor fitur adalah wilayah memori yang berdekatan.
Urutan sumbu khas |
---|
pengindeksan
Pengindeksan sumbu tunggal
TensorFlow mengikuti aturan pengindeksan Python standar, mirip dengan pengindeksan daftar atau string di Python , dan aturan dasar untuk pengindeksan NumPy.
- indeks mulai dari
0
- indeks negatif menghitung mundur dari akhir
- titik dua,
:
, digunakan untuk irisan:start:stop:step
rank_1_tensor = tf.constant([0, 1, 1, 2, 3, 5, 8, 13, 21, 34])
print(rank_1_tensor.numpy())
[ 0 1 1 2 3 5 8 13 21 34]
Pengindeksan dengan skalar menghilangkan sumbu:
print("First:", rank_1_tensor[0].numpy())
print("Second:", rank_1_tensor[1].numpy())
print("Last:", rank_1_tensor[-1].numpy())
First: 0 Second: 1 Last: 34
Pengindeksan dengan :
slice menjaga sumbu:
print("Everything:", rank_1_tensor[:].numpy())
print("Before 4:", rank_1_tensor[:4].numpy())
print("From 4 to the end:", rank_1_tensor[4:].numpy())
print("From 2, before 7:", rank_1_tensor[2:7].numpy())
print("Every other item:", rank_1_tensor[::2].numpy())
print("Reversed:", rank_1_tensor[::-1].numpy())
Everything: [ 0 1 1 2 3 5 8 13 21 34] Before 4: [0 1 1 2] From 4 to the end: [ 3 5 8 13 21 34] From 2, before 7: [1 2 3 5 8] Every other item: [ 0 1 3 8 21] Reversed: [34 21 13 8 5 3 2 1 1 0]
Pengindeksan multi-sumbu
Tensor peringkat yang lebih tinggi diindeks dengan melewati beberapa indeks.
Aturan yang sama persis seperti dalam kasus sumbu tunggal berlaku untuk setiap sumbu secara independen.
print(rank_2_tensor.numpy())
[[1. 2.] [3. 4.] [5. 6.]]
Melewati bilangan bulat untuk setiap indeks, hasilnya adalah skalar.
# Pull out a single value from a 2-rank tensor
print(rank_2_tensor[1, 1].numpy())
4.0
Anda dapat mengindeks menggunakan kombinasi bilangan bulat dan irisan:
# Get row and column tensors
print("Second row:", rank_2_tensor[1, :].numpy())
print("Second column:", rank_2_tensor[:, 1].numpy())
print("Last row:", rank_2_tensor[-1, :].numpy())
print("First item in last column:", rank_2_tensor[0, -1].numpy())
print("Skip the first row:")
print(rank_2_tensor[1:, :].numpy(), "\n")
Second row: [3. 4.] Second column: [2. 4. 6.] Last row: [5. 6.] First item in last column: 2.0 Skip the first row: [[3. 4.] [5. 6.]]
Berikut adalah contoh dengan tensor 3-sumbu:
print(rank_3_tensor[:, :, 4])
tf.Tensor( [[ 4 9] [14 19] [24 29]], shape=(3, 2), dtype=int32)
Memilih fitur terakhir di semua lokasi di setiap contoh dalam kumpulan | |
---|---|
Baca panduan pemotongan tensor untuk mempelajari cara menerapkan pengindeksan untuk memanipulasi elemen individual dalam tensor Anda.
Memanipulasi Bentuk
Membentuk kembali tensor sangat bermanfaat.
# Shape returns a `TensorShape` object that shows the size along each axis
x = tf.constant([[1], [2], [3]])
print(x.shape)
(3, 1)
# You can convert this object into a Python list, too
print(x.shape.as_list())
[3, 1]
Anda dapat membentuk kembali tensor menjadi bentuk baru. Operasi tf.reshape
cepat dan murah karena data yang mendasarinya tidak perlu diduplikasi.
# You can reshape a tensor to a new shape.
# Note that you're passing in a list
reshaped = tf.reshape(x, [1, 3])
print(x.shape)
print(reshaped.shape)
(3, 1) (1, 3)
Data mempertahankan tata letaknya dalam memori dan tensor baru dibuat, dengan bentuk yang diminta, menunjuk ke data yang sama. TensorFlow menggunakan urutan memori "baris-utama" gaya-C, di mana penambahan indeks paling kanan sesuai dengan satu langkah dalam memori.
print(rank_3_tensor)
tf.Tensor( [[[ 0 1 2 3 4] [ 5 6 7 8 9]] [[10 11 12 13 14] [15 16 17 18 19]] [[20 21 22 23 24] [25 26 27 28 29]]], shape=(3, 2, 5), dtype=int32)
Jika Anda meratakan tensor, Anda dapat melihat urutannya dalam memori.
# A `-1` passed in the `shape` argument says "Whatever fits".
print(tf.reshape(rank_3_tensor, [-1]))
tf.Tensor( [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29], shape=(30,), dtype=int32)
Biasanya satu-satunya penggunaan tf.reshape
yang masuk akal adalah untuk menggabungkan atau membagi sumbu yang berdekatan (atau menambah/menghapus 1
detik).
Untuk tensor 3x2x5 ini, membentuk kembali menjadi (3x2)x5 atau 3x(2x5) adalah hal yang wajar untuk dilakukan, karena irisan tidak bercampur:
print(tf.reshape(rank_3_tensor, [3*2, 5]), "\n")
print(tf.reshape(rank_3_tensor, [3, -1]))
tf.Tensor( [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19] [20 21 22 23 24] [25 26 27 28 29]], shape=(6, 5), dtype=int32) tf.Tensor( [[ 0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19] [20 21 22 23 24 25 26 27 28 29]], shape=(3, 10), dtype=int32)
Beberapa bentuk yang bagus. | ||
---|---|---|
Pembentukan ulang akan "berfungsi" untuk bentuk baru apa pun dengan jumlah total elemen yang sama, tetapi itu tidak akan berguna jika Anda tidak menghormati urutan sumbu.
Mengganti sumbu di tf.reshape
tidak berfungsi; Anda perlu tf.transpose
untuk itu.
# Bad examples: don't do this
# You can't reorder axes with reshape.
print(tf.reshape(rank_3_tensor, [2, 3, 5]), "\n")
# This is a mess
print(tf.reshape(rank_3_tensor, [5, 6]), "\n")
# This doesn't work at all
try:
tf.reshape(rank_3_tensor, [7, -1])
except Exception as e:
print(f"{type(e).__name__}: {e}")
tf.Tensor( [[[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] [[15 16 17 18 19] [20 21 22 23 24] [25 26 27 28 29]]], shape=(2, 3, 5), dtype=int32) tf.Tensor( [[ 0 1 2 3 4 5] [ 6 7 8 9 10 11] [12 13 14 15 16 17] [18 19 20 21 22 23] [24 25 26 27 28 29]], shape=(5, 6), dtype=int32) InvalidArgumentError: Input to reshape is a tensor with 30 values, but the requested shape requires a multiple of 7 [Op:Reshape]
Beberapa bentuk buruk. | ||
---|---|---|
Anda mungkin menemukan bentuk yang tidak ditentukan sepenuhnya. Entah bentuknya berisi None
(panjang sumbu tidak diketahui) atau bentuk keseluruhannya None
(peringkat tensor tidak diketahui).
Kecuali untuk tf.RaggedTensor , bentuk seperti itu hanya akan muncul dalam konteks API pembuatan grafik simbolis TensorFlow:
Lebih lanjut tentang DTypes
Untuk memeriksa tipe data tf.Tensor
gunakan properti Tensor.dtype
.
Saat membuat tf.Tensor
dari objek Python, Anda dapat menentukan tipe data secara opsional.
Jika tidak, TensorFlow akan memilih tipe data yang dapat mewakili data Anda. TensorFlow mengonversi bilangan bulat Python menjadi tf.int32
dan bilangan floating point Python menjadi tf.float32
. Jika tidak, TensorFlow menggunakan aturan yang sama yang digunakan NumPy saat mengonversi ke array.
Anda dapat mentransmisikan dari jenis ke jenis.
the_f64_tensor = tf.constant([2.2, 3.3, 4.4], dtype=tf.float64)
the_f16_tensor = tf.cast(the_f64_tensor, dtype=tf.float16)
# Now, cast to an uint8 and lose the decimal precision
the_u8_tensor = tf.cast(the_f16_tensor, dtype=tf.uint8)
print(the_u8_tensor)
tf.Tensor([2 3 4], shape=(3,), dtype=uint8)
Penyiaran
Penyiaran adalah konsep yang dipinjam dari fitur yang setara di NumPy . Singkatnya, dalam kondisi tertentu, tensor yang lebih kecil "diregangkan" secara otomatis agar pas dengan tensor yang lebih besar saat menjalankan operasi gabungan pada tensor tersebut.
Kasus paling sederhana dan paling umum adalah ketika Anda mencoba mengalikan atau menambahkan tensor ke skalar. Dalam hal ini, skalar disiarkan menjadi bentuk yang sama dengan argumen lainnya.
x = tf.constant([1, 2, 3])
y = tf.constant(2)
z = tf.constant([2, 2, 2])
# All of these are the same computation
print(tf.multiply(x, 2))
print(x * y)
print(x * z)
tf.Tensor([2 4 6], shape=(3,), dtype=int32) tf.Tensor([2 4 6], shape=(3,), dtype=int32) tf.Tensor([2 4 6], shape=(3,), dtype=int32)
Demikian juga, sumbu dengan panjang 1 dapat direntangkan agar sesuai dengan argumen lainnya. Kedua argumen dapat diregangkan dalam perhitungan yang sama.
Dalam hal ini matriks 3x1 adalah elemen-bijaksana dikalikan dengan matriks 1x4 untuk menghasilkan matriks 3x4. Perhatikan bagaimana 1 di depan adalah opsional: Bentuk y adalah [4]
.
# These are the same computations
x = tf.reshape(x,[3,1])
y = tf.range(1, 5)
print(x, "\n")
print(y, "\n")
print(tf.multiply(x, y))
tf.Tensor( [[1] [2] [3]], shape=(3, 1), dtype=int32) tf.Tensor([1 2 3 4], shape=(4,), dtype=int32) tf.Tensor( [[ 1 2 3 4] [ 2 4 6 8] [ 3 6 9 12]], shape=(3, 4), dtype=int32)
Penambahan yang disiarkan: a [3, 1] kali a [1, 4] menghasilkan [3,4] |
---|
Berikut adalah operasi yang sama tanpa penyiaran:
x_stretch = tf.constant([[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]])
y_stretch = tf.constant([[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]])
print(x_stretch * y_stretch) # Again, operator overloading
tf.Tensor( [[ 1 2 3 4] [ 2 4 6 8] [ 3 6 9 12]], shape=(3, 4), dtype=int32)
Sebagian besar waktu, penyiaran efisien waktu dan ruang, karena operasi siaran tidak pernah mewujudkan tensor yang diperluas dalam memori.
Anda melihat seperti apa siaran menggunakan tf.broadcast_to
.
print(tf.broadcast_to(tf.constant([1, 2, 3]), [3, 3]))
tf.Tensor( [[1 2 3] [1 2 3] [1 2 3]], shape=(3, 3), dtype=int32)
Tidak seperti operasi matematika, misalnya, broadcast_to
tidak melakukan hal khusus untuk menghemat memori. Di sini, Anda mewujudkan tensor.
Ini bisa menjadi lebih rumit. Bagian dari buku Jake VanderPlas Buku Pegangan Ilmu Data Python ini menunjukkan lebih banyak trik penyiaran (sekali lagi di NumPy).
tf.convert_to_tensor
Kebanyakan operasi, seperti tf.matmul
dan tf.reshape
mengambil argumen dari kelas tf.Tensor
. Namun, Anda akan melihat dalam kasus di atas, objek Python yang berbentuk seperti tensor diterima.
Sebagian besar, tetapi tidak semua, ops memanggil convert_to_tensor
pada argumen non-tensor. Ada daftar konversi, dan sebagian besar kelas objek seperti ndarray
NumPy , TensorShape
, daftar Python, dan tf.Variable
semuanya akan dikonversi secara otomatis.
Lihat tf.register_tensor_conversion_function
untuk detail selengkapnya, dan jika Anda memiliki tipe sendiri, Anda ingin secara otomatis mengonversi ke tensor.
Tensor Ragged
Sebuah tensor dengan variabel jumlah elemen sepanjang beberapa sumbu disebut "ragged". Gunakan tf.ragged.RaggedTensor
untuk data yang tidak rata.
Misalnya, Ini tidak dapat direpresentasikan sebagai tensor biasa:
Sebuah tf.RaggedTensor , bentuk: [4, None] |
---|
ragged_list = [
[0, 1, 2, 3],
[4, 5],
[6, 7, 8],
[9]]
try:
tensor = tf.constant(ragged_list)
except Exception as e:
print(f"{type(e).__name__}: {e}")
ValueError: Can't convert non-rectangular Python sequence to Tensor.
Alih-alih membuat tf.RaggedTensor
menggunakan tf.ragged.constant
:
ragged_tensor = tf.ragged.constant(ragged_list)
print(ragged_tensor)
<tf.RaggedTensor [[0, 1, 2, 3], [4, 5], [6, 7, 8], [9]]>
Bentuk tf.RaggedTensor
akan berisi beberapa sumbu dengan panjang yang tidak diketahui:
print(ragged_tensor.shape)
(4, None)
Tensor string
tf.string
adalah dtype
, artinya Anda dapat merepresentasikan data sebagai string (array byte dengan panjang variabel) dalam tensor.
String bersifat atomik dan tidak dapat diindeks seperti string Python. Panjang string bukan salah satu sumbu tensor. Lihat tf.strings
untuk fungsi untuk memanipulasinya.
Berikut ini adalah tensor string skalar:
# Tensors can be strings, too here is a scalar string.
scalar_string_tensor = tf.constant("Gray wolf")
print(scalar_string_tensor)
tf.Tensor(b'Gray wolf', shape=(), dtype=string)
Dan vektor string:
Sebuah vektor string, bentuk: [3,] |
---|
# If you have three string tensors of different lengths, this is OK.
tensor_of_strings = tf.constant(["Gray wolf",
"Quick brown fox",
"Lazy dog"])
# Note that the shape is (3,). The string length is not included.
print(tensor_of_strings)
tf.Tensor([b'Gray wolf' b'Quick brown fox' b'Lazy dog'], shape=(3,), dtype=string)
Dalam cetakan di atas, awalan b
menunjukkan bahwa tf.string
dtype bukanlah string unicode, tetapi string-byte. Lihat Tutorial Unicode untuk mengetahui lebih lanjut tentang bekerja dengan teks unicode di TensorFlow.
Jika Anda melewati karakter unicode, mereka dikodekan utf-8.
tf.constant("🥳👍")
<tf.Tensor: shape=(), dtype=string, numpy=b'\xf0\x9f\xa5\xb3\xf0\x9f\x91\x8d'>
Beberapa fungsi dasar dengan string dapat ditemukan di tf.strings
, termasuk tf.strings.split
.
# You can use split to split a string into a set of tensors
print(tf.strings.split(scalar_string_tensor, sep=" "))
tf.Tensor([b'Gray' b'wolf'], shape=(2,), dtype=string)
# ...but it turns into a `RaggedTensor` if you split up a tensor of strings,
# as each string might be split into a different number of parts.
print(tf.strings.split(tensor_of_strings))
<tf.RaggedTensor [[b'Gray', b'wolf'], [b'Quick', b'brown', b'fox'], [b'Lazy', b'dog']]>
Tiga senar terbelah, bentuk: [3, None] |
---|
Dan tf.string.to_number
:
text = tf.constant("1 10 100")
print(tf.strings.to_number(tf.strings.split(text, " ")))
tf.Tensor([ 1. 10. 100.], shape=(3,), dtype=float32)
Meskipun Anda tidak dapat menggunakan tf.cast
untuk mengubah tensor string menjadi angka, Anda dapat mengubahnya menjadi byte, lalu menjadi angka.
byte_strings = tf.strings.bytes_split(tf.constant("Duck"))
byte_ints = tf.io.decode_raw(tf.constant("Duck"), tf.uint8)
print("Byte strings:", byte_strings)
print("Bytes:", byte_ints)
Byte strings: tf.Tensor([b'D' b'u' b'c' b'k'], shape=(4,), dtype=string) Bytes: tf.Tensor([ 68 117 99 107], shape=(4,), dtype=uint8)
# Or split it up as unicode and then decode it
unicode_bytes = tf.constant("アヒル 🦆")
unicode_char_bytes = tf.strings.unicode_split(unicode_bytes, "UTF-8")
unicode_values = tf.strings.unicode_decode(unicode_bytes, "UTF-8")
print("\nUnicode bytes:", unicode_bytes)
print("\nUnicode chars:", unicode_char_bytes)
print("\nUnicode values:", unicode_values)
Unicode bytes: tf.Tensor(b'\xe3\x82\xa2\xe3\x83\x92\xe3\x83\xab \xf0\x9f\xa6\x86', shape=(), dtype=string) Unicode chars: tf.Tensor([b'\xe3\x82\xa2' b'\xe3\x83\x92' b'\xe3\x83\xab' b' ' b'\xf0\x9f\xa6\x86'], shape=(5,), dtype=string) Unicode values: tf.Tensor([ 12450 12498 12523 32 129414], shape=(5,), dtype=int32)
tf.string
dtype digunakan untuk semua data byte mentah di TensorFlow. Modul tf.io
berisi fungsi untuk mengonversi data ke dan dari byte, termasuk decoding gambar dan parsing csv.
Tensor jarang
Terkadang, data Anda jarang, seperti ruang penyematan yang sangat luas. TensorFlow mendukung tf.sparse.SparseTensor
dan operasi terkait untuk menyimpan data yang jarang secara efisien.
Sebuah tf.SparseTensor , bentuk: [3, 4] |
---|
# Sparse tensors store values by index in a memory-efficient manner
sparse_tensor = tf.sparse.SparseTensor(indices=[[0, 0], [1, 2]],
values=[1, 2],
dense_shape=[3, 4])
print(sparse_tensor, "\n")
# You can convert sparse tensors to dense
print(tf.sparse.to_dense(sparse_tensor))
SparseTensor(indices=tf.Tensor( [[0 0] [1 2]], shape=(2, 2), dtype=int64), values=tf.Tensor([1 2], shape=(2,), dtype=int32), dense_shape=tf.Tensor([3 4], shape=(2,), dtype=int64)) tf.Tensor( [[1 0 0 0] [0 0 2 0] [0 0 0 0]], shape=(3, 4), dtype=int32)