TF2 iş akışlarında TF1.x modellerini kullanın

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın GitHub'da görüntüle Not defterini indir

Bu kılavuz, modelleme kodunuzda minimum değişiklikle istekli yürütme, tf.function ve dağıtım stratejileri gibi mevcut TF1.x modellerinizi TF2 iş akışlarında kullanmak için kullanabileceğiniz bir modelleme kodu şimine genel bir bakış ve örnekler sağlar.

Kullanım kapsamı

Bu kılavuzda açıklanan şim, aşağıdakilere dayanan TF1.x modelleri için tasarlanmıştır:

  1. değişken oluşturmayı ve yeniden kullanmayı kontrol etmek için tf.compat.v1.get_variable ve tf.compat.v1.variable_scope ve
  2. Takip etmek için tf.compat.v1.global_variables() , tf.compat.v1.trainable_variables , tf.compat.v1.losses.get_regularization_losses() ve tf.compat.v1.get_collection() gibi grafik toplama tabanlı API'ler ağırlıklar ve düzenlileştirme kayıpları

Bu, tf.compat.v1.layer , tf.contrib.layers API'leri ve TensorFlow-Slim üzerine inşa edilmiş çoğu modeli içerir.

Altlık, aşağıdaki TF1.x modelleri için gerekli DEĞİLDİR :

  1. Tüm eğitilebilir ağırlıklarını ve düzenlileştirme kayıplarını sırasıyla model.trainable_weights ve model.losses aracılığıyla izleyen bağımsız Keras modelleri.
  2. tf.Module s, module.trainable_variables aracılığıyla eğitilebilir tüm ağırlıklarını zaten takip eder ve yalnızca önceden oluşturulmadıysa ağırlıklar oluşturur.

Bu modellerin TF2'de istekli yürütme ve tf.function ile çalışması muhtemeldir.

Kurmak

TensorFlow ve diğer bağımlılıkları içe aktarın.

pip uninstall -y -q tensorflow
# Install tf-nightly as the DeterministicRandomTestTool is available only in
# Tensorflow 2.8

pip install -q tf-nightly
-yer tutucu2 l10n-yer
import tensorflow as tf
import tensorflow.compat.v1 as v1
import sys
import numpy as np

from contextlib import contextmanager

track_tf1_style_variables dekoratörü

Bu kılavuzda açıklanan anahtar şim tf.compat.v1.keras.utils.track_tf1_style_variables , TF1.x tarzı ağırlıkları izlemek için tf.keras.layers.Layer ve tf.Module ait yöntemler içinde kullanabileceğiniz bir dekoratördür ve düzenlileştirme kayıplarını yakalayın.

Bir tf.keras.layers.Layer veya tf.Module çağrı yöntemlerini tf.compat.v1.keras.utils.track_tf1_style_variables ile süslemek, tf.compat.v1.get_variable (ve tf.compat.v1.layers ) her çağrıda her zaman yeni bir değişken oluşturmak yerine dekore edilmiş yöntemin içinde doğru şekilde çalışmak için. Ayrıca katmanın veya modülün, dekore edilmiş yöntem içinde get_variable aracılığıyla oluşturulan veya erişilen ağırlıkları dolaylı olarak izlemesine neden olur.

Ağırlıkları kendilerinin standart layer.variable / module.variable /etc altında takip etmeye ek olarak. özellikler, yöntem bir tf.keras.layers.Layer öğesine aitse, get_variable veya tf.compat.v1.layers düzenleyici argümanları aracılığıyla belirtilen herhangi bir düzenlileştirme kayıpları, standart layer.losses özelliği altındaki katman tarafından izlenir.

Bu izleme mekanizması, Keras katmanları içinde büyük TF1.x stili model ileri geçiş kodu sınıflarının veya TF2 davranışları etkinleştirilmiş olsa bile tf.Module s'nin kullanılmasını sağlar.

kullanım örnekleri

Aşağıdaki kullanım örnekleri, tf.keras.layers.Layer yöntemlerini süslemek için kullanılan modelleme şimlerini göstermektedir, ancak özellikle Keras özellikleriyle etkileşime girdikleri durumlar dışında, tf.Module yöntemlerini dekore ederken de uygulanabilirler.

tf.compat.v1.get_variable ile oluşturulmuş katman

Doğrudan tf.compat.v1.get_variable üzerine aşağıdaki gibi uygulanan bir katmanınız olduğunu hayal edin:

def dense(self, inputs, units):
  out = inputs
  with tf.compat.v1.variable_scope("dense"):
    # The weights are created with a `regularizer`,
    kernel = tf.compat.v1.get_variable(
        shape=[out.shape[-1], units],
        regularizer=tf.keras.regularizers.L2(),
        initializer=tf.compat.v1.initializers.glorot_normal,
        name="kernel")
    bias = tf.compat.v1.get_variable(
        shape=[units,],
        initializer=tf.compat.v1.initializers.zeros,
        name="bias")
    out = tf.linalg.matmul(out, kernel)
    out = tf.compat.v1.nn.bias_add(out, bias)
  return out

Bir katmana dönüştürmek için şimi kullanın ve onu girdilerde çağırın.

class DenseLayer(tf.keras.layers.Layer):

  def __init__(self, units, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.units = units

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs):
    out = inputs
    with tf.compat.v1.variable_scope("dense"):
      # The weights are created with a `regularizer`,
      # so the layer should track their regularization losses
      kernel = tf.compat.v1.get_variable(
          shape=[out.shape[-1], self.units],
          regularizer=tf.keras.regularizers.L2(),
          initializer=tf.compat.v1.initializers.glorot_normal,
          name="kernel")
      bias = tf.compat.v1.get_variable(
          shape=[self.units,],
          initializer=tf.compat.v1.initializers.zeros,
          name="bias")
      out = tf.linalg.matmul(out, kernel)
      out = tf.compat.v1.nn.bias_add(out, bias)
    return out

layer = DenseLayer(10)
x = tf.random.normal(shape=(8, 20))
layer(x)
tutucu5 l10n-yer
WARNING:tensorflow:From /tmp/ipykernel_27038/795621215.py:7: The name tf.keras.utils.track_tf1_style_variables is deprecated. Please use tf.compat.v1.keras.utils.track_tf1_style_variables instead.
<tf.Tensor: shape=(8, 10), dtype=float32, numpy=
array([[-0.51018804, -0.58145535,  0.25050664, -0.09880018,  0.71741414,
        -0.08512568,  0.33404148,  0.50894034,  0.19362557,  0.03945067],
       [-0.66160053,  0.43442816, -0.6187523 ,  0.00753711,  1.3946855 ,
         0.22528797,  0.55661404, -1.6155301 ,  1.5854199 , -0.4165327 ],
       [ 0.15855707,  0.43848652,  0.04762229,  0.22020248,  0.88300526,
         0.31525093, -0.10912375,  0.03332198,  1.3462385 , -0.37986106],
       [ 0.02546233, -0.01084138,  0.0417656 ,  1.1082407 ,  0.926408  ,
         0.46938205,  1.0183189 ,  1.2039868 , -0.09619217, -0.50863194],
       [-1.6222394 ,  0.17156005, -0.07482994,  0.646423  ,  1.0284312 ,
         2.3619173 ,  0.6322627 ,  0.5350776 , -2.2700598 , -0.8211552 ],
       [-1.1044651 ,  0.7303245 ,  1.0183476 ,  1.2858934 ,  0.4575533 ,
         0.93400717,  0.5323913 , -0.01242167,  0.8308919 ,  0.03202473],
       [ 0.3880633 , -1.2345276 ,  0.7713047 , -0.33720714,  1.0418141 ,
        -1.055242  , -1.6942265 ,  1.705035  ,  0.8671215 ,  0.8162696 ],
       [ 0.02216246, -0.5235669 ,  0.01065174, -1.1682817 ,  0.44079733,
         0.25890222, -1.0779501 ,  0.37716752, -0.27636313, -0.6359312 ]],
      dtype=float32)>

Standart bir Keras katmanı gibi izlenen değişkenlere ve yakalanan düzenleme kayıplarına erişin.

layer.trainable_variables
layer.losses
tutucu7 l10n-yer
2021-12-04 02:24:42.941890: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
[<tf.Tensor: shape=(), dtype=float32, numpy=0.10789324>]

Katmanı her çağırdığınızda ağırlıkların yeniden kullanıldığını görmek için tüm ağırlıkları sıfıra ayarlayın ve katmanı yeniden çağırın.

print("Resetting variables to zero:", [var.name for var in layer.trainable_variables])

for var in layer.trainable_variables:
  var.assign(var * 0.0)

# Note: layer.losses is not a live view and
# will get reset only at each layer call
print("layer.losses:", layer.losses)
print("calling layer again.")
out = layer(x)
print("layer.losses: ", layer.losses)
out
tutucu9 l10n-yer
Resetting variables to zero: ['dense/bias:0', 'dense/kernel:0']
layer.losses: [<tf.Tensor: shape=(), dtype=float32, numpy=0.0>]
calling layer again.
layer.losses:  [<tf.Tensor: shape=(), dtype=float32, numpy=0.0>]
<tf.Tensor: shape=(8, 10), dtype=float32, numpy=
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)>

Dönüştürülen katmanı doğrudan Keras işlevsel model yapımında da kullanabilirsiniz.

inputs = tf.keras.Input(shape=(20))
outputs = DenseLayer(10)(inputs)
model = tf.keras.Model(inputs=inputs, outputs=outputs)

x = tf.random.normal(shape=(8, 20))
model(x)

# Access the model variables and regularization losses
model.weights
model.losses
tutucu11 l10n-yer
[<tf.Tensor: shape=(), dtype=float32, numpy=0.1345337>]

tf.compat.v1.layers ile oluşturulmuş model

Doğrudan tf.compat.v1.layers üzerine aşağıdaki gibi uygulanan bir katmanınız veya modeliniz olduğunu hayal edin:

def model(self, inputs, units):
  with tf.compat.v1.variable_scope('model'):
    out = tf.compat.v1.layers.conv2d(
        inputs, 3, 3,
        kernel_regularizer="l2")
    out = tf.compat.v1.layers.flatten(out)
    out = tf.compat.v1.layers.dense(
        out, units,
        kernel_regularizer="l2")
    return out

Bir katmana dönüştürmek için şimi kullanın ve onu girdilerde çağırın.

class CompatV1LayerModel(tf.keras.layers.Layer):

  def __init__(self, units, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.units = units

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs):
    with tf.compat.v1.variable_scope('model'):
      out = tf.compat.v1.layers.conv2d(
          inputs, 3, 3,
          kernel_regularizer="l2")
      out = tf.compat.v1.layers.flatten(out)
      out = tf.compat.v1.layers.dense(
          out, self.units,
          kernel_regularizer="l2")
      return out

layer = CompatV1LayerModel(10)
x = tf.random.normal(shape=(8, 5, 5, 5))
layer(x)
tutucu14 l10n-yer
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:12: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead.
  if sys.path[0] == '':
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/legacy_tf_layers/convolutional.py:575: UserWarning: `layer.apply` is deprecated and will be removed in a future version. Please use `layer.__call__` method instead.
  return layer.apply(inputs)
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:13: UserWarning: `tf.layers.flatten` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Flatten` instead.
  del sys.path[0]
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/legacy_tf_layers/core.py:541: UserWarning: `layer.apply` is deprecated and will be removed in a future version. Please use `layer.__call__` method instead.
  return layer.apply(inputs)
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:16: UserWarning: `tf.layers.dense` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dense` instead.
  app.launch_new_instance()
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/legacy_tf_layers/core.py:261: UserWarning: `layer.apply` is deprecated and will be removed in a future version. Please use `layer.__call__` method instead.
  return layer.apply(inputs)
<tf.Tensor: shape=(8, 10), dtype=float32, numpy=
array([[ 2.4439096 , -0.2912227 ,  1.5531251 ,  1.284059  ,  0.10077369,
        -0.4231838 ,  1.0458903 , -0.01530766,  0.07358164, -0.6108157 ],
       [-0.4576063 ,  0.34942552,  2.3044965 ,  1.1483003 , -1.2211238 ,
         0.5634397 ,  0.73821646, -0.07581732,  0.5747937 , -0.66470885],
       [-2.2948585 , -2.709268  ,  1.7494816 , -0.9808065 , -2.9099958 ,
         0.5067346 , -1.011502  ,  2.559535  , -3.0888772 ,  0.3522656 ],
       [ 1.7788265 ,  0.8846102 ,  0.45562026,  0.01498583, -0.12482446,
        -0.32868862, -0.7743829 ,  2.3106992 , -0.0997327 , -0.7715093 ],
       [ 0.40295708,  0.04771695, -0.21336336, -0.13069987,  2.279875  ,
         2.7284563 ,  0.6444641 , -1.1919906 ,  0.96321577,  1.0182515 ],
       [ 0.47900966,  0.04906505,  1.1335449 ,  0.2907704 ,  0.7732022 ,
         0.68217   ,  0.51932573, -0.45156685,  2.081223  ,  1.068861  ],
       [ 0.10084352,  1.6456002 ,  0.63820475,  1.5959243 ,  0.22463399,
         0.07713126,  0.7467398 , -1.5435244 ,  1.2494736 , -0.07683721],
       [ 2.1396816 ,  1.5613532 , -1.1726325 , -0.88917583,  1.6447946 ,
        -1.0071977 , -1.8496083 ,  1.1887017 ,  2.1971662 ,  2.1175954 ]],
      dtype=float32)>

Standart bir Keras katmanı gibi izlenen değişkenlere ve yakalanan düzenleme kayıplarına erişin.

layer.trainable_variables
layer.losses
tutucu16 l10n-yer
[<tf.Tensor: shape=(), dtype=float32, numpy=0.03623246>,
 <tf.Tensor: shape=(), dtype=float32, numpy=0.14618248>]

Katmanı her çağırdığınızda ağırlıkların yeniden kullanıldığını görmek için tüm ağırlıkları sıfıra ayarlayın ve katmanı yeniden çağırın.

print("Resetting variables to zero:", [var.name for var in layer.trainable_variables])

for var in layer.trainable_variables:
  var.assign(var * 0.0)

out = layer(x)
print("layer.losses: ", layer.losses)
out
tutucu18 l10n-yer
Resetting variables to zero: ['model/conv2d/bias:0', 'model/conv2d/kernel:0', 'model/dense/bias:0', 'model/dense/kernel:0']
layer.losses:  [<tf.Tensor: shape=(), dtype=float32, numpy=0.0>, <tf.Tensor: shape=(), dtype=float32, numpy=0.0>]
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:12: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead.
  if sys.path[0] == '':
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:13: UserWarning: `tf.layers.flatten` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Flatten` instead.
  del sys.path[0]
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:16: UserWarning: `tf.layers.dense` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dense` instead.
  app.launch_new_instance()
<tf.Tensor: shape=(8, 10), dtype=float32, numpy=
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)>

Dönüştürülen katmanı doğrudan Keras işlevsel model yapımında da kullanabilirsiniz.

inputs = tf.keras.Input(shape=(5, 5, 5))
outputs = CompatV1LayerModel(10)(inputs)
model = tf.keras.Model(inputs=inputs, outputs=outputs)

x = tf.random.normal(shape=(8, 5, 5, 5))
model(x)
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:12: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead.
  if sys.path[0] == '':
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/legacy_tf_layers/base.py:573: UserWarning: `layer.updates` will be removed in a future version. This property should not be used in TensorFlow 2.0, as `updates` are applied automatically.
  _add_elements_to_collection(self.updates, tf.compat.v1.GraphKeys.UPDATE_OPS)
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:13: UserWarning: `tf.layers.flatten` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Flatten` instead.
  del sys.path[0]
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:16: UserWarning: `tf.layers.dense` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dense` instead.
  app.launch_new_instance()
<tf.Tensor: shape=(8, 10), dtype=float32, numpy=
array([[ 0.19487001,  0.54727787,  1.1044168 , -0.6613899 , -0.26437742,
        -1.1580509 , -0.24707682,  0.97752655,  0.59436107,  0.13125825],
       [ 0.48974586, -1.3510125 ,  0.7186962 , -0.8996632 , -0.60448873,
         0.06332532,  0.31494308,  0.23021704, -1.9166642 ,  0.3890404 ],
       [-0.06499191, -0.21485235,  0.01158494,  1.4407377 , -0.0488929 ,
        -0.37594396, -0.4386894 , -0.08751169,  1.0905663 , -1.5450519 ],
       [-2.2749739 , -2.4603422 , -1.3834419 , -2.8800466 ,  0.8954872 ,
        -3.0429187 , -0.7885461 ,  1.6037437 , -3.1845028 , -1.0725503 ],
       [ 0.98735195, -0.45159122,  0.892656  ,  0.477053  ,  0.31193537,
        -0.44723228, -0.01815075, -0.47465172, -1.665448  , -2.105824  ],
       [-2.5408387 , -1.7552321 , -1.924145  , -0.6395873 ,  0.4081779 ,
        -0.48731515, -3.2637763 , -1.4409767 , -2.032539  ,  0.10204412],
       [ 2.1583526 ,  0.78955674, -0.07266375,  0.06652926,  2.1300716 ,
        -1.6256162 ,  0.56154627, -0.76179224,  2.2985756 , -1.5504618 ],
       [ 2.062847  ,  0.971378  , -1.0830508 ,  1.8224751 , -0.3542943 ,
         0.74113446, -0.6204865 ,  1.4503044 , -0.4979878 , -0.4383126 ]],
      dtype=float32)>
yer tutucu21 l10n-yer
# Access the model variables and regularization losses
model.weights
model.losses
[<tf.Tensor: shape=(), dtype=float32, numpy=0.03079858>,
 <tf.Tensor: shape=(), dtype=float32, numpy=0.12991619>]

Toplu normalleştirme güncellemelerini ve model training argümanlarını yakalayın

TF1.x'te toplu normalleştirmeyi şu şekilde gerçekleştirirsiniz:

  x_norm = tf.compat.v1.layers.batch_normalization(x, training=training)

  # ...

  update_ops = tf.compat.v1.get_collection(tf.GraphKeys.UPDATE_OPS)
  train_op = optimizer.minimize(loss)
  train_op = tf.group([train_op, update_ops])

Bunu not et:

  1. Toplu normalleştirme hareketli ortalama güncellemeleri, katmandan ayrı olarak çağrılan get_collection tarafından izlenir.
  2. tf.compat.v1.layers.batch_normalization bir training argümanı gerektirir (genellikle TF-Slim toplu normalleştirme katmanlarını kullanırken is_training olarak adlandırılır)

TF2'de, istekli yürütme ve otomatik kontrol bağımlılıkları nedeniyle, toplu normalleştirme hareketli ortalama güncellemeleri hemen yürütülecektir. Bunları güncelleme koleksiyonundan ayrı olarak toplamaya ve bunları açık denetim bağımlılıkları olarak eklemeye gerek yoktur.

Ek olarak, tf.keras.layers.Layer ileri geçiş yönteminize bir training argümanı verirseniz, Keras, diğer herhangi bir katmanda olduğu gibi mevcut eğitim aşamasını ve tüm iç içe katmanları ona geçirebilecektir. Keras'ın training argümanını nasıl ele aldığı hakkında daha fazla bilgi için tf.keras.Model için API belgelerine bakın.

tf.Module yöntemlerini süslüyorsanız, tüm training argümanlarını gerektiği gibi manuel olarak ilettiğinizden emin olmanız gerekir. Bununla birlikte, toplu normalleştirme hareketli ortalama güncellemeleri, açık kontrol bağımlılıklarına gerek kalmadan otomatik olarak uygulanmaya devam edecektir.

Aşağıdaki kod parçacıkları, toplu normalleştirme katmanlarının altlığa nasıl gömüleceğini ve bunun bir Keras modelinde kullanılmasının nasıl çalıştığını gösterir ( tf.keras.layers.Layer için geçerlidir).

class CompatV1BatchNorm(tf.keras.layers.Layer):

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs, training=None):
    print("Forward pass called with `training` =", training)
    with v1.variable_scope('batch_norm_layer'):
      return v1.layers.batch_normalization(x, training=training)
print("Constructing model")
inputs = tf.keras.Input(shape=(5, 5, 5))
outputs = CompatV1BatchNorm()(inputs)
model = tf.keras.Model(inputs=inputs, outputs=outputs)

print("Calling model in inference mode")
x = tf.random.normal(shape=(8, 5, 5, 5))
model(x, training=False)

print("Moving average variables before training: ",
      {var.name: var.read_value() for var in model.non_trainable_variables})

# Notice that when running TF2 and eager execution, the batchnorm layer directly
# updates the moving averages while training without needing any extra control
# dependencies
print("calling model in training mode")
model(x, training=True)

print("Moving average variables after training: ",
      {var.name: var.read_value() for var in model.non_trainable_variables})
-yer tutucu26 l10n-yer
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:7: UserWarning: `tf.layers.batch_normalization` is deprecated and will be removed in a future version. Please use `tf.keras.layers.BatchNormalization` instead. In particular, `tf.control_dependencies(tf.GraphKeys.UPDATE_OPS)` should not be used (consult the `tf.keras.layers.BatchNormalization` documentation).
  import sys
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/legacy_tf_layers/normalization.py:463: UserWarning: `layer.apply` is deprecated and will be removed in a future version. Please use `layer.__call__` method instead.
  return layer.apply(inputs, training=training)
Constructing model
Forward pass called with `training` = None
Calling model in inference mode
Forward pass called with `training` = False
Moving average variables before training:  {'batch_norm_layer/batch_normalization/moving_mean:0': <tf.Tensor: shape=(5,), dtype=float32, numpy=array([0., 0., 0., 0., 0.], dtype=float32)>, 'batch_norm_layer/batch_normalization/moving_variance:0': <tf.Tensor: shape=(5,), dtype=float32, numpy=array([1., 1., 1., 1., 1.], dtype=float32)>}
calling model in training mode
Forward pass called with `training` = True
Moving average variables after training:  {'batch_norm_layer/batch_normalization/moving_mean:0': <tf.Tensor: shape=(5,), dtype=float32, numpy=
array([-0.00177554, -0.00036542, -0.00099426, -0.00112544,  0.0008541 ],
      dtype=float32)>, 'batch_norm_layer/batch_normalization/moving_variance:0': <tf.Tensor: shape=(5,), dtype=float32, numpy=
array([1.0005339, 1.0003369, 0.9976748, 1.0001523, 1.0009514],
      dtype=float32)>}

Değişken kapsam tabanlı değişken yeniden kullanımı

get_variable dayalı ileri geçişte herhangi bir değişken oluşturma, değişken kapsamlarının TF1.x'te sahip olduğu aynı değişken adlandırma ve yeniden kullanım semantiğini koruyacaktır. Yukarıda belirtildiği gibi, otomatik olarak oluşturulmuş adlara sahip herhangi bir tf.compat.v1.layers için en az bir boş olmayan dış kapsamınız olduğu sürece bu doğrudur.

İstekli yürütme ve tf.function

Yukarıda görüldüğü gibi, tf.keras.layers.Layer ve tf.Module için dekore edilmiş yöntemler, istekli yürütmenin içinde çalışır ve ayrıca tf.function ile uyumludur. Bu, çalışırken ileri geçişinizde adım adım ilerlemek için pdb ve diğer etkileşimli araçları kullanabileceğiniz anlamına gelir.

Dağıtım stratejileri

@track_tf1_style_variables get_variable katman veya modül yöntemlerinin içindeki get_variable çağrıları, başlık altında standart tf.Variable değişken oluşturma kullanır. Bu, bunları MirroredStrategy ve tf.distribute gibi TPUStrategy ile kullanılabilen çeşitli dağıtım stratejileriyle kullanabileceğiniz anlamına gelir.

Dekore edilmiş çağrılarda tf.Variable s, tf.Module s, tf.keras.layers & tf.keras.models

Katman çağrınızı tf.compat.v1.keras.utils.track_tf1_style_variables içinde dekore etmek, yalnızca tf.compat.v1.get_variable aracılığıyla oluşturulan (ve yeniden kullanılan) değişkenlerin otomatik örtük izlemesini ekler. Tipik Keras katmanları ve çoğu tf.Module s tarafından kullanılanlar gibi tf.Variable çağrıları tarafından doğrudan oluşturulan ağırlıkları yakalamaz. Bu bölüm, bu iç içe geçmiş durumların nasıl ele alınacağını açıklar.

(Önceden var olan kullanımlar) tf.keras.layers ve tf.keras.models

Yuvalanmış Keras katmanlarının ve modellerinin önceden var olan kullanımları için tf.compat.v1.keras.utils.get_or_create_layer kullanın. Bu, yalnızca mevcut TF1.x iç içe Keras kullanımlarının geçişini kolaylaştırmak için önerilir; yeni kod, tf.Variables ve tf.Modules için aşağıda açıklandığı gibi açık öznitelik ayarını kullanmalıdır.

tf.compat.v1.keras.utils.get_or_create_layer kullanmak için, iç içe modelinizi oluşturan kodu bir yönteme sarın ve bunu yönteme iletin. Örnek:

class NestedModel(tf.keras.Model):

  def __init__(self, units, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.units = units

  def build_model(self):
    inp = tf.keras.Input(shape=(5, 5))
    dense_layer = tf.keras.layers.Dense(
        10, name="dense", kernel_regularizer="l2",
        kernel_initializer=tf.compat.v1.ones_initializer())
    model = tf.keras.Model(inputs=inp, outputs=dense_layer(inp))
    return model

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs):
    # Get or create a nested model without assigning it as an explicit property
    model = tf.compat.v1.keras.utils.get_or_create_layer(
        "dense_model", self.build_model)
    return model(inputs)

layer = NestedModel(10)
layer(tf.ones(shape=(5,5)))
tutucu28 l10n-yer
<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[5., 5., 5., 5., 5., 5., 5., 5., 5., 5.],
       [5., 5., 5., 5., 5., 5., 5., 5., 5., 5.],
       [5., 5., 5., 5., 5., 5., 5., 5., 5., 5.],
       [5., 5., 5., 5., 5., 5., 5., 5., 5., 5.],
       [5., 5., 5., 5., 5., 5., 5., 5., 5., 5.]], dtype=float32)>

Bu yöntem, bu iç içe katmanların doğru şekilde yeniden kullanılmasını ve tensorflow tarafından izlenmesini sağlar. @track_tf1_style_variables dekoratörünün uygun yöntemde hala gerekli olduğunu unutmayın. get_or_create_layer iletilen model oluşturucu yöntemi (bu durumda self.build_model ), hiçbir argüman almamalıdır.

Ağırlıklar izlenir:

assert len(layer.weights) == 2
weights = {x.name: x for x in layer.variables}

assert set(weights.keys()) == {"dense/bias:0", "dense/kernel:0"}

layer.weights
tutucu30 l10n-yer
[<tf.Variable 'dense/kernel:0' shape=(5, 10) dtype=float32, numpy=
 array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]], dtype=float32)>,
 <tf.Variable 'dense/bias:0' shape=(10,) dtype=float32, numpy=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)>]

Ve ayrıca düzenleme kaybı:

tf.add_n(layer.losses)
tutucu32 l10n-yer
<tf.Tensor: shape=(1,), dtype=float32, numpy=array([0.5], dtype=float32)>

Artımlı geçiş: tf.Variables ve tf.Modules

Süslü yöntemlerinize tf.Variable çağrıları veya tf.Module s yerleştirmeniz gerekiyorsa (örneğin, bu kılavuzda daha sonra açıklanan eski olmayan TF2 API'lerine artımlı geçişi izliyorsanız), bunları yine de açıkça izlemeniz gerekir, aşağıdaki gereksinimlerle:

  • Açıkça değişken/modül/katmanın yalnızca bir kez oluşturulduğundan emin olun
  • Tipik bir modül veya katman tanımlarken yaptığınız gibi, bunları açıkça örnek nitelikler olarak ekleyin
  • Takip eden çağrılarda önceden oluşturulmuş nesneyi açıkça yeniden kullanın

Bu, ağırlıkların her çağrıda yeni oluşturulmamasını ve doğru şekilde yeniden kullanılmasını sağlar. Ek olarak, bu aynı zamanda mevcut ağırlıkların ve düzenlileştirme kayıplarının da takip edilmesini sağlar.

Bunun nasıl görünebileceğine dair bir örnek:

class NestedLayer(tf.keras.layers.Layer):

  def __init__(self, units, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.units = units

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def __call__(self, inputs):
    out = inputs
    with tf.compat.v1.variable_scope("inner_dense"):
      # The weights are created with a `regularizer`,
      # so the layer should track their regularization losses
      kernel = tf.compat.v1.get_variable(
          shape=[out.shape[-1], self.units],
          regularizer=tf.keras.regularizers.L2(),
          initializer=tf.compat.v1.initializers.glorot_normal,
          name="kernel")
      bias = tf.compat.v1.get_variable(
          shape=[self.units,],
          initializer=tf.compat.v1.initializers.zeros,
          name="bias")
      out = tf.linalg.matmul(out, kernel)
      out = tf.compat.v1.nn.bias_add(out, bias)
    return out

class WrappedDenseLayer(tf.keras.layers.Layer):

  def __init__(self, units, **kwargs):
    super().__init__(**kwargs)
    self.units = units
    # Only create the nested tf.variable/module/layer/model
    # once, and then reuse it each time!
    self._dense_layer = NestedLayer(self.units)

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs):
    with tf.compat.v1.variable_scope('outer'):
      outputs = tf.compat.v1.layers.dense(inputs, 3)
      outputs = tf.compat.v1.layers.dense(inputs, 4)
      return self._dense_layer(outputs)

layer = WrappedDenseLayer(10)

layer(tf.ones(shape=(5, 5)))
tutucu34 l10n-yer
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:38: UserWarning: `tf.layers.dense` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dense` instead.
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:39: UserWarning: `tf.layers.dense` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dense` instead.
<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[-0.4987283 ,  0.06630042, -0.09875254,  0.20954818,  0.03599668,
         0.3980474 ,  0.11181635,  0.6891558 , -0.33903462,  0.15674731],
       [-0.4987283 ,  0.06630042, -0.09875254,  0.20954818,  0.03599668,
         0.3980474 ,  0.11181635,  0.6891558 , -0.33903462,  0.15674731],
       [-0.4987283 ,  0.06630042, -0.09875254,  0.20954818,  0.03599668,
         0.3980474 ,  0.11181635,  0.6891558 , -0.33903462,  0.15674731],
       [-0.4987283 ,  0.06630042, -0.09875254,  0.20954818,  0.03599668,
         0.3980474 ,  0.11181635,  0.6891558 , -0.33903462,  0.15674731],
       [-0.4987283 ,  0.06630042, -0.09875254,  0.20954818,  0.03599668,
         0.3980474 ,  0.11181635,  0.6891558 , -0.33903462,  0.15674731]],
      dtype=float32)>

track_tf1_style_variables dekoratörüyle dekore edilmiş olsa bile iç içe modülün açık bir şekilde izlenmesinin gerekli olduğunu unutmayın. Bunun nedeni, dekore edilmiş yöntemlerle her modülün/katmanın kendisiyle ilişkilendirilmiş kendi değişken deposuna sahip olmasıdır.

Ağırlıklar doğru bir şekilde izlenir:

assert len(layer.weights) == 6
weights = {x.name: x for x in layer.variables}

assert set(weights.keys()) == {"outer/inner_dense/bias:0",
                               "outer/inner_dense/kernel:0",
                               "outer/dense/bias:0",
                               "outer/dense/kernel:0",
                               "outer/dense_1/bias:0",
                               "outer/dense_1/kernel:0"}

layer.trainable_weights
tutucu36 l10n-yer
[<tf.Variable 'outer/inner_dense/bias:0' shape=(10,) dtype=float32, numpy=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)>,
 <tf.Variable 'outer/inner_dense/kernel:0' shape=(4, 10) dtype=float32, numpy=
 array([[-0.20786692,  0.14702448, -0.2577947 ,  0.1885891 ,  0.28935957,
          0.02086618, -0.20579144, -0.7509229 , -0.23490003,  0.00370591],
        [ 0.09247629, -0.37428686, -0.6002815 , -0.2702465 ,  0.20350575,
          0.34964404, -0.32633537,  0.50722903, -0.0419833 , -0.61815673],
        [ 0.24821116,  0.15504731, -0.12409697, -0.2506969 ,  0.22316858,
         -0.44847375, -0.08295754, -0.8262154 ,  0.7674222 , -0.40613693],
        [-0.7447006 ,  0.2992331 , -0.45639235,  0.0669547 ,  0.39443025,
          0.3182467 ,  0.10884362,  0.5395837 ,  0.32210502, -0.30076835]],
       dtype=float32)>,
 <tf.Variable 'outer/dense/bias:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>,
 <tf.Variable 'outer/dense/kernel:0' shape=(5, 3) dtype=float32, numpy=
 array([[ 0.6283595 , -0.80413634, -0.5471641 ],
        [ 0.25296038, -0.7657203 ,  0.5884425 ],
        [-0.7180575 , -0.29509914,  0.44014376],
        [ 0.81024987,  0.39888996,  0.80002993],
        [-0.32921118, -0.7010279 ,  0.820375  ]], dtype=float32)>,
 <tf.Variable 'outer/dense_1/bias:0' shape=(4,) dtype=float32, numpy=array([0., 0., 0., 0.], dtype=float32)>,
 <tf.Variable 'outer/dense_1/kernel:0' shape=(5, 4) dtype=float32, numpy=
 array([[ 0.7941524 , -0.58552563,  0.46828055, -0.44095916],
        [-0.16019303,  0.27973688, -0.60373306, -0.20117629],
        [ 0.6345844 ,  0.30732214,  0.18921828,  0.37930095],
        [-0.50815696, -0.2471816 , -0.10282421,  0.21441567],
        [-0.71987414,  0.18304104, -0.5701992 ,  0.4926386 ]],
       dtype=float32)>]

Düzenlileştirme kaybının yanı sıra:

layer.losses
tutucu38 l10n-yer
[<tf.Tensor: shape=(), dtype=float32, numpy=0.058749676>]

Bunun yerine tf.Module , Keras olmayan bir NestedLayer olsaydı, değişkenlerin izlenmeye devam edeceğini, ancak düzenlileştirme kayıplarının otomatik olarak izlenmeyeceğini, dolayısıyla bunları ayrı ayrı izlemeniz gerekeceğini unutmayın.

Değişken adları hakkında rehberlik

Açık tf.Variable çağrıları ve Keras katmanları, get_variable ve variable_scopes kombinasyonundan alışık olduğunuzdan farklı bir katman adı/değişken adı otomatik oluşturma mekanizması kullanır. Şim değişken adlarınızı get_variable tarafından oluşturulan değişkenler için TF1.x grafiklerinden TF2 istekli yürütme & tf.function geçerken bile eşleştirecek olsa da, tf.Variable çağrıları ve Keras katmanları için oluşturulan değişken adları için aynısını garanti edemez. yöntem dekoratörlerinize yerleştirirsiniz. TF2 istekli yürütme ve tf.function içinde birden çok değişkenin aynı adı paylaşması bile mümkündür.

Bu kılavuzda daha sonra yer alan doğruluğun doğrulanması ve TF1.x kontrol noktalarının eşlenmesi ile ilgili bölümleri takip ederken buna özellikle dikkat etmelisiniz.

Süslenmiş yöntemde tf.compat.v1.make_template kullanma

tf.compat.v1.make_template üzerinde daha ince bir katman olduğu için tf.compat.v1.keras.utils.track_tf1_style_variables yerine doğrudan tf.compat.v1.keras.utils.track_tf1_style_variables kullanmanız şiddetle tavsiye edilir .

Halihazırda tf.compat.v1.make_template dayanan önceki TF1.x kodu için bu bölümdeki yönergeleri izleyin.

tf.compat.v1.make_template kullanan kodu get_variable , track_tf1_style_variables dekoratörü, bu şablonları katman çağrılarında kullanmanıza ve ağırlıkları ve düzenlileştirme kayıplarını başarıyla izlemenize olanak tanır.

Ancak, make_template yalnızca bir kez çağırdığınızdan ve ardından her katman çağrısında aynı şablonu yeniden kullandığınızdan emin olun. Aksi takdirde, katmanı her çağırdığınızda yeni bir değişken kümesiyle birlikte yeni bir şablon oluşturulur.

Örneğin,

class CompatV1TemplateScaleByY(tf.keras.layers.Layer):

  def __init__(self, **kwargs):
    super().__init__(**kwargs)
    def my_op(x, scalar_name):
      var1 = tf.compat.v1.get_variable(scalar_name,
                            shape=[],
                            regularizer=tf.compat.v1.keras.regularizers.L2(),
                            initializer=tf.compat.v1.constant_initializer(1.5))
      return x * var1
    self.scale_by_y = tf.compat.v1.make_template('scale_by_y', my_op, scalar_name='y')

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs):
    with tf.compat.v1.variable_scope('layer'):
      # Using a scope ensures the `scale_by_y` name will not be incremented
      # for each instantiation of the layer.
      return self.scale_by_y(inputs)

layer = CompatV1TemplateScaleByY()

out = layer(tf.ones(shape=(2, 3)))
print("weights:", layer.weights)
print("regularization loss:", layer.losses)
print("output:", out)
tutucu40 l10n-yer
weights: [<tf.Variable 'layer/scale_by_y/y:0' shape=() dtype=float32, numpy=1.5>]
regularization loss: [<tf.Tensor: shape=(), dtype=float32, numpy=0.022499999>]
output: tf.Tensor(
[[1.5 1.5 1.5]
 [1.5 1.5 1.5]], shape=(2, 3), dtype=float32)

Yerel TF2'ye artımlı geçiş

Daha önce belirtildiği gibi, track_tf1_style_variables , TF2 stili nesne yönelimli tf.Variable / tf.keras.layers.Layer / tf.Module kullanımını eski tf.compat.v1.get_variable / tf.compat.v1.layers -style ile karıştırmanıza olanak tanır. aynı dekore edilmiş modül/katmanın içinde kullanım.

Bu, TF1.x modelinizi tamamen TF2 uyumlu hale getirdikten sonra, tüm yeni model bileşenlerini yerel ( tf.compat.v1 olmayan) TF2 API'leri ile yazabileceğiniz ve eski kodunuzla birlikte çalışmasını sağlayabileceğiniz anlamına gelir.

Ancak, eski model bileşenlerinizi değiştirmeye devam ederseniz, eski stil tf.compat.v1 kullanımınızı aşamalı olarak yeni yazılmış TF2 kodu için önerilen tamamen yerel nesne yönelimli API'lere geçirmeyi de seçebilirsiniz.

tf.compat.v1.get_variable kullanımı, bir self.add_weight katmanını/modelini dekore ediyorsanız tf.Variable çağrılarıyla veya Keras nesnelerini veya tf.Module s'yi dekore ediyorsanız tf.Variable çağrılarıyla değiştirilebilir.

Hem işlevsel stil hem de nesne yönelimli tf.compat.v1.layers , genellikle herhangi bir bağımsız değişken değişikliği gerekmeden eşdeğer tf.keras.layers katmanıyla değiştirilebilir.

Ayrıca, track_tf1_style_variables kullanabilen tamamen yerel API'lere aşamalı geçişiniz sırasında modelinizin parçalarını veya ortak kalıpları ayrı katmanlar/modüller halinde düşünebilirsiniz.

Slim ve katkıda bulunanlar hakkında bir not

Büyük miktarda eski TF 1.x kodu, TF 1.x ile tf.contrib.layers olarak paketlenmiş olan Slim kitaplığını kullanır. Slim kullanarak kodu yerel TF 2'ye dönüştürmek, v1.layers dönüştürmekten daha önemlidir. Aslında, Slim kodunuzu önce v1.layers , ardından Keras'a dönüştürmek mantıklı olabilir. Aşağıda, Slim kodunu dönüştürmek için bazı genel yönergeler bulunmaktadır.

  • Tüm argümanların açık olduğundan emin olun. Mümkünse arg_scopes kaldırın. Hala bunları kullanmanız gerekiyorsa, normalizer_fn ve activation_fn kendi katmanlarına ayırın.
  • Ayrılabilir konv katmanları, bir veya daha fazla farklı Keras katmanıyla eşlenir (derinlik yönünde, noktasal ve ayrılabilir Keras katmanları).
  • Slim ve v1.layers farklı argüman adlarına ve varsayılan değerlere sahiptir.
  • Bazı argümanların farklı ölçekleri olduğunu unutmayın.

Denetim noktası uyumluluğunu yok sayan Yerel TF2'ye geçiş

Aşağıdaki kod örneği, bir modelin denetim noktası uyumluluğu dikkate alınmadan tamamen yerel API'lere aşamalı olarak taşınmasını gösterir.

class CompatModel(tf.keras.layers.Layer):

  def __init__(self, units, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.units = units

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs, training=None):
    with tf.compat.v1.variable_scope('model'):
      out = tf.compat.v1.layers.conv2d(
          inputs, 3, 3,
          kernel_regularizer="l2")
      out = tf.compat.v1.layers.flatten(out)
      out = tf.compat.v1.layers.dropout(out, training=training)
      out = tf.compat.v1.layers.dense(
          out, self.units,
          kernel_regularizer="l2")
      return out

Ardından, compat.v1 API'lerini yerel nesne yönelimli eşdeğerleriyle parçalı bir şekilde değiştirin. Evrişim katmanını, katman oluşturucusunda oluşturulan bir Keras nesnesine değiştirerek başlayın.

class PartiallyMigratedModel(tf.keras.layers.Layer):

  def __init__(self, units, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.units = units
    self.conv_layer = tf.keras.layers.Conv2D(
      3, 3,
      kernel_regularizer="l2")

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs, training=None):
    with tf.compat.v1.variable_scope('model'):
      out = self.conv_layer(inputs)
      out = tf.compat.v1.layers.flatten(out)
      out = tf.compat.v1.layers.dropout(out, training=training)
      out = tf.compat.v1.layers.dense(
          out, self.units,
          kernel_regularizer="l2")
      return out

Bu artımlı değişikliğin modeli öncekiyle aynı davranışla bıraktığını doğrulamak için v1.keras.utils.DeterministicRandomTestTool sınıfını kullanın.

random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')
with random_tool.scope():
  layer = CompatModel(10)

  inputs = tf.random.normal(shape=(10, 5, 5, 5))
  original_output = layer(inputs)

  # Grab the regularization loss as well
  original_regularization_loss = tf.math.add_n(layer.losses)

print(original_regularization_loss)
tf.Tensor(0.17953834, shape=(), dtype=float32)
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:12: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead.
  if sys.path[0] == '':
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:13: UserWarning: `tf.layers.flatten` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Flatten` instead.
  del sys.path[0]
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:14: UserWarning: `tf.layers.dropout` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dropout` instead.
  
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/legacy_tf_layers/core.py:413: UserWarning: `layer.apply` is deprecated and will be removed in a future version. Please use `layer.__call__` method instead.
  return layer.apply(inputs, training=training)
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:17: UserWarning: `tf.layers.dense` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dense` instead.
random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')
with random_tool.scope():
  layer = PartiallyMigratedModel(10)

  inputs = tf.random.normal(shape=(10, 5, 5, 5))
  migrated_output = layer(inputs)

  # Grab the regularization loss as well
  migrated_regularization_loss = tf.math.add_n(layer.losses)

print(migrated_regularization_loss)
tf.Tensor(0.17953834, shape=(), dtype=float32)
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:14: UserWarning: `tf.layers.flatten` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Flatten` instead.
  
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:15: UserWarning: `tf.layers.dropout` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dropout` instead.
  from ipykernel import kernelapp as app
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:18: UserWarning: `tf.layers.dense` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dense` instead.
# Verify that the regularization loss and output both match
np.testing.assert_allclose(original_regularization_loss.numpy(), migrated_regularization_loss.numpy())
np.testing.assert_allclose(original_output.numpy(), migrated_output.numpy())

Artık tüm bireysel compat.v1.layers yerel Keras katmanlarıyla değiştirdiniz.

class NearlyFullyNativeModel(tf.keras.layers.Layer):

  def __init__(self, units, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.units = units
    self.conv_layer = tf.keras.layers.Conv2D(
      3, 3,
      kernel_regularizer="l2")
    self.flatten_layer = tf.keras.layers.Flatten()
    self.dense_layer = tf.keras.layers.Dense(
      self.units,
      kernel_regularizer="l2")

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs):
    with tf.compat.v1.variable_scope('model'):
      out = self.conv_layer(inputs)
      out = self.flatten_layer(out)
      out = self.dense_layer(out)
      return out
random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')
with random_tool.scope():
  layer = NearlyFullyNativeModel(10)

  inputs = tf.random.normal(shape=(10, 5, 5, 5))
  migrated_output = layer(inputs)

  # Grab the regularization loss as well
  migrated_regularization_loss = tf.math.add_n(layer.losses)

print(migrated_regularization_loss)
yer tutucu50 l10n-yer
tf.Tensor(0.17953834, shape=(), dtype=float32)
# Verify that the regularization loss and output both match
np.testing.assert_allclose(original_regularization_loss.numpy(), migrated_regularization_loss.numpy())
np.testing.assert_allclose(original_output.numpy(), migrated_output.numpy())

Son olarak, hem kalan (artık ihtiyaç duyulmayan) tüm variable_scope kullanımını hem de track_tf1_style_variables dekoratörünün kendisini kaldırın.

Artık tamamen yerel API'leri kullanan modelin bir sürümü kaldı.

class FullyNativeModel(tf.keras.layers.Layer):

  def __init__(self, units, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.units = units
    self.conv_layer = tf.keras.layers.Conv2D(
      3, 3,
      kernel_regularizer="l2")
    self.flatten_layer = tf.keras.layers.Flatten()
    self.dense_layer = tf.keras.layers.Dense(
      self.units,
      kernel_regularizer="l2")

  def call(self, inputs):
    out = self.conv_layer(inputs)
    out = self.flatten_layer(out)
    out = self.dense_layer(out)
    return out
random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')
with random_tool.scope():
  layer = FullyNativeModel(10)

  inputs = tf.random.normal(shape=(10, 5, 5, 5))
  migrated_output = layer(inputs)

  # Grab the regularization loss as well
  migrated_regularization_loss = tf.math.add_n(layer.losses)

print(migrated_regularization_loss)
yer tutucu54 l10n-yer
tf.Tensor(0.17953834, shape=(), dtype=float32)
# Verify that the regularization loss and output both match
np.testing.assert_allclose(original_regularization_loss.numpy(), migrated_regularization_loss.numpy())
np.testing.assert_allclose(original_output.numpy(), migrated_output.numpy())

Native TF2'ye geçiş sırasında kontrol noktası uyumluluğunu koruma

Yerel TF2 API'lerine yukarıdaki geçiş süreci, hem değişken adlarını (Keras API'leri çok farklı ağırlık adları ürettiği için) hem de modelde farklı ağırlıklara işaret eden nesne yönelimli yolları değiştirdi. Bu değişikliklerin etkisi, hem mevcut TF1 stili ad tabanlı kontrol noktalarını hem de TF2 stili nesne yönelimli kontrol noktalarını bozmuş olmalarıdır.

Bununla birlikte, bazı durumlarda, orijinal ada dayalı kontrol noktanızı alabilir ve TF1.x kontrol noktalarını yeniden kullanma kılavuzunda ayrıntılı olarak açıklanana benzer yaklaşımlarla değişkenlerin yeni adlarına eşlemesini bulabilirsiniz.

Bunu mümkün kılmak için bazı ipuçları şunlardır:

  • Değişkenlerin hepsinin hala ayarlayabileceğiniz bir name argümanı vardır.
  • Keras modelleri, değişkenleri için önek olarak belirledikleri bir name bağımsız değişkeni de alır.
  • v1.name_scope işlevi, değişken adı öneklerini ayarlamak için kullanılabilir. Bu, tf.variable_scope çok farklıdır. Yalnızca adları etkiler ve değişkenleri izlemez ve yeniden kullanmaz.

Yukarıdaki işaretçiler göz önünde bulundurularak, aşağıdaki kod örnekleri, aynı anda kontrol noktalarını güncellerken bir modelin bir bölümünü aşamalı olarak güncellemek için kodunuza uyarlayabileceğiniz bir iş akışını gösterir.

  1. İşlevsel stildeki tf.compat.v1.layers nesne yönelimli sürümlerine geçirerek başlayın.
class FunctionalStyleCompatModel(tf.keras.layers.Layer):

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs, training=None):
    with tf.compat.v1.variable_scope('model'):
      out = tf.compat.v1.layers.conv2d(
          inputs, 3, 3,
          kernel_regularizer="l2")
      out = tf.compat.v1.layers.conv2d(
          out, 4, 4,
          kernel_regularizer="l2")
      out = tf.compat.v1.layers.conv2d(
          out, 5, 5,
          kernel_regularizer="l2")
      return out

layer = FunctionalStyleCompatModel()
layer(tf.ones(shape=(10, 10, 10, 10)))
[v.name for v in layer.weights]
tutucu57 l10n-yer
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:8: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead.
  
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:11: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead.
  # This is added back by InteractiveShellApp.init_path()
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:14: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead.
['model/conv2d/bias:0',
 'model/conv2d/kernel:0',
 'model/conv2d_1/bias:0',
 'model/conv2d_1/kernel:0',
 'model/conv2d_2/bias:0',
 'model/conv2d_2/kernel:0']
  1. Ardından, compat.v1.layer nesnelerini ve compat.v1.get_variable tarafından oluşturulan tüm değişkenleri, yöntemi track_tf1_style_variables ile süslenmiş tf.keras.layers.Layer / tf.Module nesnesinin özellikleri olarak track_tf1_style_variables (herhangi bir nesne yönelimli TF2'nin stil kontrol noktaları artık hem değişken adına göre bir yolu hem de yeni nesne yönelimli yolu kaydedecektir).
class OOStyleCompatModel(tf.keras.layers.Layer):

  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.conv_1 = tf.compat.v1.layers.Conv2D(
          3, 3,
          kernel_regularizer="l2")
    self.conv_2 = tf.compat.v1.layers.Conv2D(
          4, 4,
          kernel_regularizer="l2")

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs, training=None):
    with tf.compat.v1.variable_scope('model'):
      out = self.conv_1(inputs)
      out = self.conv_2(out)
      out = tf.compat.v1.layers.conv2d(
          out, 5, 5,
          kernel_regularizer="l2")
      return out

layer = OOStyleCompatModel()
layer(tf.ones(shape=(10, 10, 10, 10)))
[v.name for v in layer.weights]
tutucu59 l10n-yer
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:19: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead.
['model/conv2d/kernel:0',
 'model/conv2d/bias:0',
 'model/conv2d_1/kernel:0',
 'model/conv2d_1/bias:0',
 'model/conv2d_2/bias:0',
 'model/conv2d_2/kernel:0']
  1. Yolları hem değişken adına (compat.v1.layers için) hem de nesne yönelimli nesne grafiğine göre kaydetmek için bu noktada yüklü bir kontrol noktasını yeniden kaydedin.
weights = {v.name: v for v in layer.weights}
assert weights['model/conv2d/kernel:0'] is layer.conv_1.kernel
assert weights['model/conv2d_1/bias:0'] is layer.conv_2.bias
  1. Şimdi, yakın zamanda kaydedilen kontrol noktasını yüklemeye devam ederken, yerel Keras katmanları için nesne yönelimli compat.v1.layers değiştirebilirsiniz. Değiştirilen katmanların otomatik olarak oluşturulan variable_scopes kaydetmeye devam ederek kalan compat.v1.layers için değişken adlarını koruduğunuzdan emin olun. Bu anahtarlanmış katmanlar/değişkenler artık değişken adı yolu yerine denetim noktasındaki değişkenlere giden nesne öznitelik yolunu kullanacak.

Genel olarak, özelliklere eklenen değişkenlerde compat.v1.get_variable kullanımını şu şekilde değiştirebilirsiniz:

  • Bunları tf.Variable , VEYA kullanmaya geçirme
  • Bunları tf.keras.layers.Layer.add_weight kullanarak güncelleme. Tüm katmanları tek seferde değiştirmiyorsanız, bunun bir name bağımsız değişkeni olmayan kalan compat.v1.layers için otomatik oluşturulan katman/değişken adlandırmalarını değiştirebileceğini unutmayın. Bu durumda, kaldırılan compat.v1.layer oluşturulan kapsam adına karşılık gelen bir variable_scope manuel olarak açıp kapatarak kalan compat.v1.layers için değişken adlarını aynı tutmalısınız. Aksi takdirde, mevcut kontrol noktalarından gelen yollar çakışabilir ve kontrol noktası yüklemesi hatalı davranacaktır.
def record_scope(scope_name):
  """Record a variable_scope to make sure future ones get incremented."""
  with tf.compat.v1.variable_scope(scope_name):
    pass

class PartiallyNativeKerasLayersModel(tf.keras.layers.Layer):

  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.conv_1 = tf.keras.layers.Conv2D(
          3, 3,
          kernel_regularizer="l2")
    self.conv_2 = tf.keras.layers.Conv2D(
          4, 4,
          kernel_regularizer="l2")

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs, training=None):
    with tf.compat.v1.variable_scope('model'):
      out = self.conv_1(inputs)
      record_scope('conv2d') # Only needed if follow-on compat.v1.layers do not pass a `name` arg
      out = self.conv_2(out)
      record_scope('conv2d_1') # Only needed if follow-on compat.v1.layers do not pass a `name` arg
      out = tf.compat.v1.layers.conv2d(
          out, 5, 5,
          kernel_regularizer="l2")
      return out

layer = PartiallyNativeKerasLayersModel()
layer(tf.ones(shape=(10, 10, 10, 10)))
[v.name for v in layer.weights]
tutucu62 l10n-yer
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:26: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead.
['partially_native_keras_layers_model/model/conv2d_13/kernel:0',
 'partially_native_keras_layers_model/model/conv2d_13/bias:0',
 'partially_native_keras_layers_model/model/conv2d_14/kernel:0',
 'partially_native_keras_layers_model/model/conv2d_14/bias:0',
 'model/conv2d_2/bias:0',
 'model/conv2d_2/kernel:0']

Değişkenleri oluşturduktan sonra bu adımda bir kontrol noktasının kaydedilmesi, onun yalnızca şu anda mevcut olan nesne yollarını içermesini sağlayacaktır.

Kalan compat.v1.layers için otomatik olarak oluşturulan ağırlık adlarını korumak için kaldırılan compat.v1.layers kapsamlarını kaydettiğinizden emin olun.

weights = set(v.name for v in layer.weights)
assert 'model/conv2d_2/kernel:0' in weights
assert 'model/conv2d_2/bias:0' in weights
  1. Modelinizdeki tüm compat.v1.layers ve compat.v1.get_variable s öğelerini tamamen yerel eşdeğerlerle değiştirene kadar yukarıdaki adımları tekrarlayın.
class FullyNativeKerasLayersModel(tf.keras.layers.Layer):

  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.conv_1 = tf.keras.layers.Conv2D(
          3, 3,
          kernel_regularizer="l2")
    self.conv_2 = tf.keras.layers.Conv2D(
          4, 4,
          kernel_regularizer="l2")
    self.conv_3 = tf.keras.layers.Conv2D(
          5, 5,
          kernel_regularizer="l2")


  def call(self, inputs, training=None):
    with tf.compat.v1.variable_scope('model'):
      out = self.conv_1(inputs)
      out = self.conv_2(out)
      out = self.conv_3(out)
      return out

layer = FullyNativeKerasLayersModel()
layer(tf.ones(shape=(10, 10, 10, 10)))
[v.name for v in layer.weights]
tutucu65 l10n-yer
['fully_native_keras_layers_model/model/conv2d_16/kernel:0',
 'fully_native_keras_layers_model/model/conv2d_16/bias:0',
 'fully_native_keras_layers_model/model/conv2d_17/kernel:0',
 'fully_native_keras_layers_model/model/conv2d_17/bias:0',
 'fully_native_keras_layers_model/model/conv2d_18/kernel:0',
 'fully_native_keras_layers_model/model/conv2d_18/bias:0']

Yeni güncellenen kontrol noktasının beklediğiniz gibi davrandığından emin olmak için test etmeyi unutmayın. Geçirilen kodunuzun doğru şekilde çalıştığından emin olmak için bu işlemin her aşamalı adımında sayısal doğruluğu doğrulama kılavuzunda açıklanan teknikleri uygulayın.

Modelleme şimleri tarafından kapsanmayan TF1.x'ten TF2'ye davranış değişikliklerinin ele alınması

Bu kılavuzda açıklanan modelleme şimleri, get_variable , tf.compat.v1.layers ve variable_scope semantiği ile oluşturulan değişkenlerin, katmanların ve düzenlileştirme kayıplarının, istekli yürütme ve tf.function kullanıldığında önceden olduğu gibi çalışmaya devam etmesini sağlayabilir. koleksiyonlara güvenin.

Bu, modelinizin ileri geçişlerine güvenebileceği tüm TF1.x'e özgü anlambilimleri kapsamaz. Bazı durumlarda, takozlar, modelinizin ileriye doğru geçişini TF2'de tek başına çalıştırmak için yetersiz olabilir. TF1.x ve TF2 arasındaki davranış farklılıkları hakkında daha fazla bilgi edinmek için TF1.x ve TF2 davranışları kılavuzunu okuyun.