Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

tf.fungsi

Versi TensorFlow 1 Lihat sumber di GitHub

Mengkompilasi fungsi ke dalam grafik TensorFlow yang dapat dipanggil.

Digunakan di notebook

Digunakan dalam panduan ini Digunakan dalam tutorial

tf.function membangun callable yang mengeksekusi grafik TensorFlow ( tf.Graph ) yang dibuat dengan melacak-mengkompilasi operasi TensorFlow di func , secara efektif menjalankan func sebagai grafik TensorFlow.

Contoh penggunaan:

@tf.function
def f(x, y):
  return x ** 2 + y
x = tf.constant([2, 3])
y = tf.constant([3, -2])
f(x, y)
<tf.Tensor: ... numpy=array([7, 7], ...)>

fitur

func dapat menggunakan aliran kontrol yang bergantung pada data, termasuk if , for , while break , continue dan return pernyataan:

@tf.function
def f(x):
  if tf.reduce_sum(x) > 0:
    return x * x
  else:
    return -x // 2
f(tf.constant(-2))
<tf.Tensor: ... numpy=1>

Penutupan func dapat mencakup objek tf.Tensor dan tf.Variable :

@tf.function
def f():
  return x ** 2 + y
x = tf.constant([-2, -3])
y = tf.Variable([3, -2])
f()
<tf.Tensor: ... numpy=array([7, 7], ...)>

func juga dapat menggunakan ops dengan efek samping, seperti tf.print , tf.Variable dan lainnya:

v = tf.Variable(1)
@tf.function
def f(x):
  for i in tf.range(x):
    v.assign_add(i)
f(3)
v
<tf.Variable ... numpy=4>
l = []
@tf.function
def f(x):
  for i in x:
    l.append(i + 1)    # Caution! Will only happen once when tracing
f(tf.constant([1, 2, 3]))
l
[<tf.Tensor ...>]

Sebagai gantinya, gunakan koleksi tf.TensorArray seperti tf.TensorArray :

@tf.function
def f(x):
  ta = tf.TensorArray(dtype=tf.int32, size=0, dynamic_size=True)
  for i in range(len(x)):
    ta = ta.write(i, x[i] + 1)
  return ta.stack()
f(tf.constant([1, 2, 3]))
<tf.Tensor: ..., numpy=array([2, 3, 4], ...)>

tf.function polimorfik

Secara internal, tf.function dapat membangun lebih dari satu grafik, untuk mendukung argumen dengan tipe atau bentuk data yang berbeda, karena TensorFlow dapat membuat grafik yang lebih efisien yang berspesialisasi pada bentuk dan dtipe. tf.function juga memperlakukan nilai Python murni apa pun sebagai objek buram, dan membuat grafik terpisah untuk setiap rangkaian argumen Python yang dihadapinya.

Untuk mendapatkan grafik individual, gunakan metode get_concrete_function dari callable yang dibuat oleh tf.function . Ini dapat dipanggil dengan argumen yang sama dengan func dan mengembalikan objek tf.Graph khusus:

@tf.function
def f(x):
  return x + 1
isinstance(f.get_concrete_function(1).graph, tf.Graph)
True
@tf.function
def f(x):
  return tf.abs(x)
f1 = f.get_concrete_function(1)
f2 = f.get_concrete_function(2)  # Slow - builds new graph
f1 is f2
False
f1 = f.get_concrete_function(tf.constant(1))
f2 = f.get_concrete_function(tf.constant(2))  # Fast - reuses f1
f1 is f2
True

Argumen numerik Python seharusnya hanya digunakan ketika mereka mengambil beberapa nilai yang berbeda, seperti hyperparameter seperti jumlah lapisan dalam jaringan saraf.

Masukan tanda tangan

Untuk argumen Tensor, tf.function instantiates grafik terpisah untuk setiap set unik bentuk input dan tipe data. Contoh di bawah ini membuat dua grafik terpisah, masing-masing dikhususkan untuk bentuk yang berbeda:

@tf.function
def f(x):
  return x + 1
vector = tf.constant([1.0, 1.0])
matrix = tf.constant([[3.0]])
f.get_concrete_function(vector) is f.get_concrete_function(matrix)
False

"Tanda tangan input" dapat secara opsional disediakan untuk tf.function untuk mengontrol grafik yang dilacak. Masukan tanda tangan menentukan bentuk dan jenis setiap argumen Tensor ke fungsi menggunakan objek tf.TensorSpec . Bentuk yang lebih umum dapat digunakan. Ini berguna untuk menghindari pembuatan banyak grafik ketika Tensor memiliki bentuk dinamis. Ini juga membatasi bentuk dan tipe data dari Tensor yang dapat digunakan:

@tf.function(
    input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
def f(x):
  return x + 1
vector = tf.constant([1.0, 1.0])
matrix = tf.constant([[3.0]])
f.get_concrete_function(vector) is f.get_concrete_function(matrix)
True

Variabel hanya dapat dibuat sekali

tf.function hanya memungkinkan membuat objek tf.Variable baru ketika dipanggil untuk pertama kalinya:

class MyModule(tf.Module):
  def __init__(self):
    self.v = None

  @tf.function
  def __call__(self, x):
    if self.v is None:
      self.v = tf.Variable(tf.ones_like(x))
    return self.v * x

Secara umum, disarankan untuk membuat objek stateful seperti tf.Variable luar tf.function dan meneruskannya sebagai argumen.

func fungsi yang akan dikompilasi. Jika func adalah None, tf.function mengembalikan dekorator yang dapat dipanggil dengan argumen tunggal - func . Dengan kata lain, tf.function(input_signature=...)(func) setara dengan tf.function(func, input_signature=...) . Yang pertama dapat digunakan sebagai dekorator.
input_signature Urutan yang mungkin bersarang dari objek tf.TensorSpec menentukan bentuk dan tipe dari Tensor yang akan disuplai ke fungsi ini. Jika None , fungsi terpisah akan di