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

tf.GradientTape

Wersja TensorFlow 1 Wyświetl źródło na GitHub

Rejestrowanie operacji dla automatycznego różnicowania.

Używany w notebookach

Używany w przewodniku Używany w samouczkach

Operacje są rejestrowane, jeśli są wykonywane w ramach tego menedżera kontekstu i co najmniej jedno z ich danych wejściowych jest „obserwowane”.

Szkolne zmienne (utworzone przez tf.Variable lub tf.compat.v1.get_variable , gdzie tf.compat.v1.get_variable trainable=True jest wartością domyślną w obu przypadkach) są automatycznie obserwowane. Tensory można obserwować ręcznie, wywołując metodę watch w tym menedżerze kontekstu.

Na przykład rozważmy funkcję y = x * x . Gradient przy x = 3.0 można obliczyć jako:

 x = tf.constant(3.0)
with tf.GradientTape() as g:
  g.watch(x)
  y = x * x
dy_dx = g.gradient(y, x) # Will compute to 6.0
 

GradientTapes można zagnieżdżać w celu obliczenia pochodnych wyższego rzędu. Na przykład,

 x = tf.constant(3.0)
with tf.GradientTape() as g:
  g.watch(x)
  with tf.GradientTape() as gg:
    gg.watch(x)
    y = x * x
  dy_dx = gg.gradient(y, x)     # Will compute to 6.0
d2y_dx2 = g.gradient(dy_dx, x)  # Will compute to 2.0
 

Domyślnie zasoby przechowywane przez GradientTape są zwalniane natychmiast po wywołaniu metody GradientTape.gradient (). Aby obliczyć wiele gradientów w ramach tego samego obliczenia, utwórz trwałą taśmę gradientową. Pozwala to na wielokrotne wywołania metody gradient (), ponieważ zasoby są zwalniane, gdy obiekt taśmowy jest usuwany z pamięci. Na przykład:

 x = tf.constant(3.0)
with tf.GradientTape(persistent=True) as g:
  g.watch(x)
  y = x * x
  z = y * y
dz_dx = g.gradient(z, x)  # 108.0 (4*x^3 at x = 3)
dy_dx = g.gradient(y, x)  # 6.0
del g  # Drop the reference to the tape
 

Domyślnie GradientTape będzie automatycznie obserwować wszelkie możliwe do nauczenia zmienne, do których dostęp jest uzyskiwany w kontekście. Jeśli chcesz precyzyjnie kontrolować, które zmienne są obserwowane, możesz wyłączyć automatyczne śledzenie, przekazując watch_accessed_variables=False do konstruktora taśmy:

 with tf.GradientTape(watch_accessed_variables=False) as tape:
  tape.watch(variable_a)
  y = variable_a ** 2  # Gradients will be available for `variable_a`.
  z = variable_b ** 3  # No gradients will be available since `variable_b` is
                       # not being watched.
 

Zauważ, że używając modeli, powinieneś upewnić się, że twoje zmienne istnieją, gdy używasz watch_accessed_variables=False . W przeciwnym razie łatwo jest sprawić, by pierwsza iteracja nie miała żadnych gradientów:

 a = tf.keras.layers.Dense(32)
b = tf.keras.layers.Dense(32)

with tf.GradientTape(watch_accessed_variables=False) as tape:
  tape.watch(a.variables)  # Since `a.build` has not been called at this point
                           # `a.variables` will return an empty list and the
                           # tape will not be watching anything.
  result = b(a(inputs))
  tape.gradient(result, a.variables)  # The result of this computation will be
                                      # a list of `None`s since a's variables
                                      # are not being watched.
 

Zauważ, że tylko tensory z rzeczywistymi lub złożonymi dtypami są rozróżnialne.

persistent Boolean kontrolujący, czy tworzona jest trwała taśma gradientowa. Domyślnie fałsz, co oznacza, że ​​co najwyżej jedno wywołanie metody gradient () na tym obiekcie.
watch_accessed_variables Boolean kontrolujący, czy taśma będzie automatycznie watch wszelkie (możliwe do nauczenia) zmienne, do których uzyskano dostęp, gdy taśma jest aktywna. Domyślne wartości True, co oznacza, że ​​gradienty mogą być wymagane z dowolnego wyniku obliczonego na taśmie uzyskanego z odczytu Variable możliwej do nauczenia. Jeśli fałszywi użytkownicy muszą jawnie watch Variable których chcą zażądać gradientów.

Metody

batch_jacobian

Pokaż źródło

Oblicza i stosy na przykład jakobianów.

Zobacz artykuł na Wikipedii dla definicji jakobianina. Ta funkcja jest zasadniczo skuteczną implementacją następujących elementów:

tf.stack([self.jacobian(y[i], x[i]) for i in range(x.shape[0])]) .

Zauważ, że w porównaniu z GradientTape.jacobian który oblicza gradient każdej wartości wyjściowej w stosunku do każdej wartości wejściowej, ta funkcja jest użyteczna, gdy target[i,...] jest niezależny od source[j,...] dla j != i To założenie pozwala na bardziej wydajne obliczenia w porównaniu z GradientTape.jacobian . Wyjście, jak również aktywacje pośrednie, są mniej wymiarowe i pozwalają uniknąć zbędnych zer, które przy założeniu niezależności skutkowałyby obliczeniami jakobianów.

Przykładowe użycie:

 with tf.GradientTape() as g:
  x = tf.constant([[1., 2.], [3., 4.]], dtype=tf.float32)
  g.watch(x)
  y = x * x
batch_jacobian = g.batch_jacobian(y, x)
# batch_jacobian is [[[2,  0], [0,  4]], [[6,  0], [0,  8]]]
 

Args
target Tensor o randze 2 lub wyższej i kształcie [b, y1, ..., y_n]. target[i,...] powinien zależeć tylko od source[i,...] .
source Tensor o randze 2 lub wyższej i kształcie [b, x1, ..., x_m].
unconnected_gradients wartość, która może zawierać „none” lub „zero” i zmienia wartość, która zostanie zwrócona, jeśli cel i źródła nie są połączone. Możliwe wartości i efekty są wyszczególnione w „UnconnectedGradients” i domyślnie jest to „none”.
parallel_iterations Pokrętło do kontrolowania liczby iteracji wysyłanych równolegle. To pokrętło może służyć do kontrolowania całkowitego zużycia pamięci.
experimental_use_pfor Jeśli prawda, używa pfor do obliczania jakobianu. W przeciwnym razie używa tf.while_loop.

Zwroty
Tensor t o kształcie [b, y_1, ..., y_n, x1, ..., x_m] gdzie t[i, ...] jest jakobianem target[i, ...] wrt source[i, ...] , czyli ułożone na przykład jakobianów.

Podnosi
RuntimeError W przypadku wywołania na nietrwałej taśmie z włączonym przyspieszonym wykonywaniem i bez włączania Experimental_use_pfor.
ValueError Jeśli wektoryzacja obliczeń jakobianowych nie powiedzie się lub jeśli pierwszy wymiar target i source nie pasuje.

gradient

Pokaż źródło

Oblicza gradient przy użyciu operacji zarejestrowanych w kontekście tej taśmy.

Args
target lista lub zagnieżdżona struktura tensorów lub zmiennych do rozróżnienia.
sources lista lub zagnieżdżona struktura tensorów lub zmiennych. target będzie zróżnicowany względem elementów w sources .
output_gradients lista gradientów, po jednym dla każdego elementu celu. Domyślnie brak.
unconnected_gradients wartość, która może zawierać „none” lub „zero” i zmienia wartość, która zostanie zwrócona, jeśli cel i źródła nie są połączone. Możliwe wartości i efekty są wyszczególnione w „UnconnectedGradients” i domyślnie jest to „none”.

Zwroty
lista lub zagnieżdżona struktura Tensors (lub IndexedSlices lub None), po jednym dla każdego elementu w sources . Zwracana struktura jest taka sama jak struktura sources .

Podnosi
RuntimeError jeśli jest wywoływana w kontekście taśmy lub jeśli jest wywoływana więcej niż jeden raz na