Dasar-dasar penyesuaian: tensor dan operasi

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Ini adalah tutorial pengantar TensorFlow yang menunjukkan cara:

  • Impor paket yang diperlukan
  • Membuat dan menggunakan tensor
  • Gunakan akselerasi GPU
  • Mendemonstrasikan tf.data.Dataset

Impor TensorFlow

Untuk memulai, impor modul tensorflow . Mulai TensorFlow 2, eksekusi bersemangat diaktifkan secara default. Ini memungkinkan antarmuka yang lebih interaktif untuk TensorFlow, detailnya akan kita bahas nanti.

import tensorflow as tf

Tensor

Tensor adalah array multidimensi. Mirip dengan objek ndarray NumPy, objek tf.Tensor memiliki tipe data dan bentuk. Selain itu, tf.Tensor s dapat berada di memori akselerator (seperti GPU). TensorFlow menawarkan perpustakaan operasi yang kaya ( tf.add , tf.matmul , tf.linalg.inv dll.) yang menggunakan dan menghasilkan tf.Tensor s. Operasi ini secara otomatis mengonversi tipe Python asli, misalnya:

print(tf.add(1, 2))
print(tf.add([1, 2], [3, 4]))
print(tf.square(5))
print(tf.reduce_sum([1, 2, 3]))

# Operator overloading is also supported
print(tf.square(2) + tf.square(3))
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor([4 6], shape=(2,), dtype=int32)
tf.Tensor(25, shape=(), dtype=int32)
tf.Tensor(6, shape=(), dtype=int32)
tf.Tensor(13, shape=(), dtype=int32)

Setiap tf.Tensor memiliki bentuk dan tipe data:

x = tf.matmul([[1]], [[2, 3]])
print(x)
print(x.shape)
print(x.dtype)
tf.Tensor([[2 3]], shape=(1, 2), dtype=int32)
(1, 2)
<dtype: 'int32'>

Perbedaan paling jelas antara array NumPy dan tf.Tensor s adalah:

  1. Tensor dapat didukung oleh memori akselerator (seperti GPU, TPU).
  2. Tensor tidak dapat diubah.

Kompatibilitas NumPy

Mengonversi antara TensorFlow tf.Tensor s dan NumPy ndarray itu mudah:

  • Operasi TensorFlow secara otomatis mengonversi NumPy ndarrays ke Tensor.
  • Operasi NumPy secara otomatis mengonversi Tensor ke ndarray NumPy.

Tensor secara eksplisit dikonversi ke NumPy ndarrays menggunakan metode .numpy() mereka. Konversi ini biasanya murah karena array dan tf.Tensor berbagi representasi memori yang mendasarinya, jika memungkinkan. Namun, berbagi representasi yang mendasarinya tidak selalu memungkinkan karena tf.Tensor dapat di-host di memori GPU sementara array NumPy selalu didukung oleh memori host, dan konversi melibatkan salinan dari GPU ke memori host.

import numpy as np

ndarray = np.ones([3, 3])

print("TensorFlow operations convert numpy arrays to Tensors automatically")
tensor = tf.multiply(ndarray, 42)
print(tensor)


print("And NumPy operations convert Tensors to numpy arrays automatically")
print(np.add(tensor, 1))

print("The .numpy() method explicitly converts a Tensor to a numpy array")
print(tensor.numpy())
TensorFlow operations convert numpy arrays to Tensors automatically
tf.Tensor(
[[42. 42. 42.]
 [42. 42. 42.]
 [42. 42. 42.]], shape=(3, 3), dtype=float64)
And NumPy operations convert Tensors to numpy arrays automatically
[[43. 43. 43.]
 [43. 43. 43.]
 [43. 43. 43.]]
The .numpy() method explicitly converts a Tensor to a numpy array
[[42. 42. 42.]
 [42. 42. 42.]
 [42. 42. 42.]]

Akselerasi GPU

Banyak operasi TensorFlow dipercepat menggunakan GPU untuk komputasi. Tanpa anotasi apa pun, TensorFlow secara otomatis memutuskan apakah akan menggunakan GPU atau CPU untuk suatu operasi—menyalin tensor antara CPU dan memori GPU, jika perlu. Tensor yang dihasilkan oleh suatu operasi biasanya didukung oleh memori perangkat tempat operasi dijalankan, misalnya:

x = tf.random.uniform([3, 3])

print("Is there a GPU available: "),
print(tf.config.list_physical_devices("GPU"))

print("Is the Tensor on GPU #0:  "),
print(x.device.endswith('GPU:0'))
Is there a GPU available: 
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
Is the Tensor on GPU #0:  
True

Nama Perangkat

Properti Tensor.device memberikan nama string yang sepenuhnya memenuhi syarat untuk perangkat yang menghosting konten tensor. Nama ini mengkodekan banyak detail, seperti pengidentifikasi alamat jaringan host tempat program ini dijalankan dan perangkat di dalam host tersebut. Ini diperlukan untuk eksekusi terdistribusi dari program TensorFlow. String diakhiri dengan GPU:<N> jika tensor ditempatkan pada GPU ke- N pada host.

Penempatan Perangkat Eksplisit

Di TensorFlow, penempatan mengacu pada bagaimana masing-masing operasi ditetapkan (ditempatkan pada) perangkat untuk dieksekusi. Seperti yang disebutkan, jika tidak ada panduan eksplisit yang diberikan, TensorFlow secara otomatis memutuskan perangkat mana yang akan menjalankan operasi dan menyalin tensor ke perangkat tersebut, jika diperlukan. Namun, operasi TensorFlow dapat ditempatkan secara eksplisit pada perangkat tertentu menggunakan pengelola konteks tf.device , misalnya:

import time

def time_matmul(x):
  start = time.time()
  for loop in range(10):
    tf.matmul(x, x)

  result = time.time()-start

  print("10 loops: {:0.2f}ms".format(1000*result))

# Force execution on CPU
print("On CPU:")
with tf.device("CPU:0"):
  x = tf.random.uniform([1000, 1000])
  assert x.device.endswith("CPU:0")
  time_matmul(x)

# Force execution on GPU #0 if available
if tf.config.list_physical_devices("GPU"):
  print("On GPU:")
  with tf.device("GPU:0"): # Or GPU:1 for the 2nd GPU, GPU:2 for the 3rd etc.
    x = tf.random.uniform([1000, 1000])
    assert x.device.endswith("GPU:0")
    time_matmul(x)
On CPU:
10 loops: 91.47ms
On GPU:
10 loops: 388.16ms

Kumpulan data

Bagian ini menggunakan tf.data.Dataset API untuk membangun pipeline untuk memasukkan data ke model Anda. tf.data.Dataset API digunakan untuk membuat pipeline input yang kompleks dan berkinerja tinggi dari bagian sederhana yang dapat digunakan kembali yang akan memberi makan loop pelatihan atau evaluasi model Anda.

Buat Dataset sumber

Buat kumpulan data sumber menggunakan salah satu fungsi pabrik seperti Dataset.from_tensors , Dataset.from_tensor_slices , atau menggunakan objek yang membaca dari file seperti TextLineDataset atau TFRecordDataset . Lihat panduan Kumpulan Data TensorFlow untuk informasi selengkapnya.

ds_tensors = tf.data.Dataset.from_tensor_slices([1, 2, 3, 4, 5, 6])

# Create a CSV file
import tempfile
_, filename = tempfile.mkstemp()

with open(filename, 'w') as f:
  f.write("""Line 1
Line 2
Line 3
  """)

ds_file = tf.data.TextLineDataset(filename)

Terapkan transformasi

Gunakan fungsi transformasi seperti map , batch , dan shuffle untuk menerapkan transformasi ke catatan kumpulan data.

ds_tensors = ds_tensors.map(tf.square).shuffle(2).batch(2)

ds_file = ds_file.batch(2)

Pengulangan

Objek tf.data.Dataset mendukung iterasi untuk mengulang rekaman:

print('Elements of ds_tensors:')
for x in ds_tensors:
  print(x)

print('\nElements in ds_file:')
for x in ds_file:
  print(x)
Elements of ds_tensors:
tf.Tensor([1 9], shape=(2,), dtype=int32)
tf.Tensor([16  4], shape=(2,), dtype=int32)
tf.Tensor([25 36], shape=(2,), dtype=int32)

Elements in ds_file:
tf.Tensor([b'Line 1' b'Line 2'], shape=(2,), dtype=string)
tf.Tensor([b'Line 3' b'  '], shape=(2,), dtype=string)