Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Podstawy dostosowywania: tensory i operacje

Zobacz na TensorFlow.org Uruchom w Google Colab Wyświetl źródło na GitHub Pobierz notatnik

To jest wprowadzający samouczek TensorFlow, który pokazuje, jak:

  • Zaimportuj wymagany pakiet
  • Twórz i używaj tensorów
  • Użyj akceleracji GPU
  • Zademonstruj tf.data.Dataset

Importuj TensorFlow

Aby rozpocząć, zaimportuj moduł tensorflow . Od wersji TensorFlow 2 przyspieszone wykonywanie jest domyślnie włączone. Umożliwia to bardziej interaktywną nakładkę na TensorFlow, której szczegóły omówimy znacznie później.

import tensorflow as tf

Tensory

Tensor to wielowymiarowa tablica. Podobnie jak obiekty NumPy ndarray obiekty tf.Tensor mają typ danych i kształt. Ponadto tf.Tensor s mogą znajdować się w pamięci akceleratora (podobnie jak GPU). TensorFlow oferuje bogatą bibliotekę operacji ( tf.add , tf.matmul , tf.linalg.inv itp.), Które wykorzystują i generują tf.Tensor s. Te operacje automatycznie konwertują natywne typy Pythona, na przykład:

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)

Każdy tf.Tensor ma kształt i typ danych:

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'>

Najbardziej oczywiste różnice między tablicami NumPy a tf.Tensor to:

  1. Tensory mogą być wspierane przez pamięć akceleratora (np. GPU, TPU).
  2. Tensory są niezmienne.

Zgodność z NumPy

Konwersja między TensorFlow tf.Tensor s a NumPy ndarray jest łatwa:

  • Operacje TensorFlow automatycznie konwertują NumPy ndarrays na Tensory.
  • Operacje NumPy automatycznie konwertują Tensory na NumPy ndarrays.

Tensory są jawnie konwertowane na NumPy ndarrays przy użyciu ich metody .numpy() . Te konwersje są zazwyczaj tanie, ponieważ tablica i tf.Tensor współużytkują podstawową reprezentację pamięci, jeśli to możliwe. Jednak udostępnianie podstawowej reprezentacji nie zawsze jest możliwe, ponieważ tf.Tensor może być hostowany w pamięci GPU, podczas gdy tablice NumPy są zawsze obsługiwane przez pamięć hosta, a konwersja obejmuje kopię z GPU do pamięci hosta.

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.]]

Akceleracja GPU

Wiele operacji TensorFlow jest przyspieszanych przy użyciu GPU do obliczeń. Bez żadnych adnotacji TensorFlow automatycznie decyduje, czy użyć GPU, czy CPU do operacji - kopiując tensor między CPU a pamięcią GPU, jeśli to konieczne. Tensory wytwarzane przez operację są zwykle wspierane przez pamięć urządzenia, na którym operacja została wykonana, na przykład:

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

print("Is there a GPU available: "),
print(tf.config.experimental.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

Nazwy urządzeń

Właściwość Tensor.device udostępnia w pełni kwalifikowaną nazwę ciągu urządzenia, na którym znajduje się zawartość tensora. Ta nazwa koduje wiele szczegółów, takich jak identyfikator adresu sieciowego hosta, na którym jest wykonywany ten program, oraz urządzenie na tym hoście. Jest to wymagane do rozproszonego wykonywania programu TensorFlow. Ciąg kończy się na GPU:<N> jeśli tensor jest umieszczony na N GPU na hoście.

Jawne umiejscowienie urządzenia

W TensorFlow umieszczanie odnosi się do sposobu, w jaki poszczególne operacje są przypisywane (umieszczane na) urządzeniu do wykonania. Jak wspomniano, gdy nie ma wyraźnych wskazówek, TensorFlow automatycznie decyduje, które urządzenie wykonać operację i kopiuje tensory do tego urządzenia, jeśli jest to konieczne. Jednak operacje TensorFlow można bezpośrednio umieścić na określonych urządzeniach za pomocą menedżera kontekstu tf.device , na przykład:

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.experimental.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: 102.06ms
On GPU:
10 loops: 231.87ms

Zestawy danych

Ta sekcja używa interfejsu API tf.data.Dataset do tworzenia potoku do dostarczania danych do modelu. tf.data.Dataset API tf.data.Dataset służy do tworzenia wydajnych, złożonych potoków wejściowych z prostych elementów wielokrotnego użytku, które będą zasilać pętle szkoleniowe lub oceny modelu.

Utwórz źródłowy Dataset

Utwórz źródłowy zestaw danych przy użyciu jednej z funkcji fabrycznych, takich jak Dataset.from_tensors , Dataset.from_tensor_slices , lub za pomocą obiektów, które odczytują pliki, takie jak TextLineDataset lub TFRecordDataset . Aby uzyskać więcej informacji, zobacz przewodnik dotyczący zestawu danych TensorFlow .

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)

Zastosuj transformacje

Użyj funkcji transformacji, takich jak map , batch i shuffle aby zastosować transformacje do rekordów zestawu danych.

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

ds_file = ds_file.batch(2)

Powtarzać

Obiekty tf.data.Dataset obsługują iterację pętli po rekordach:

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 4], shape=(2,), dtype=int32)
tf.Tensor([16  9], 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)