Yardım Kaggle üzerinde TensorFlow ile Büyük Bariyer Resifi korumak Meydan Üyelik

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 genel bir bakış ve örnekler sağlar modelleme kod pabucun Eğer TF2 istekli yürütme, gibi iş akışları içinde mevcut TF1.x modelleri kullanmak için barındırabilecek tf.function ve modelleme koduna minimal değişikliklerle dağıtım stratejileri.

Kullanım kapsamı

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

  1. tf.compat.v1.get_variable ve tf.compat.v1.variable_scope , kontrol değişkeni oluşturma ve yeniden kullanım ve
  2. Gibi Grafik-koleksiyon bazlı API'ler tf.compat.v1.global_variables() , tf.compat.v1.trainable_variables , tf.compat.v1.losses.get_regularization_losses() ve tf.compat.v1.get_collection() takip etmek için ağırlıklar ve düzenlileştirme kayıpları

Bu en üstüne inşa modelleri içermektedir tf.compat.v1.layer , tf.contrib.layers API'leri ve TensorFlow-Slim .

Şim aşağıdaki TF1.x modelleri için gerekli değildir:

  1. Tek başına zaten yoluyla eğitilebilir ağırlıkları ve düzenlilestirme kayıplarının tümünü izlemek Keras modelleri model.trainable_weights ve model.losses sırasıyla.
  2. tf.Module çoktan yoluyla eğitilebilir ağırlıkları tümünü izlemek olduğunu module.trainable_variables ve zaten yaratılmış geçmezse sadece ağırlıkları oluşturun.

Bu modeller istekli yürütme ve birlikte TF2 işe muhtemeldir tf.function ler dışı-box.

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
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 katozu tf.compat.v1.keras.utils.track_tf1_style_variables , sen mensup yöntemleri içinde kullanabileceği bir dekoratör tf.keras.layers.Layer ve tf.Module TF1.x tarzı ağırlıkları izlemek ve düzenlileştirme kayıplarını yakalayın.

Bir Dekorasyon tf.keras.layers.Layer 'in ya da tf.Module ile sitesindeki arama yöntemlerinin tf.compat.v1.keras.utils.track_tf1_style_variables değişken oluşturulmasını ve yeniden ile karşılaştırın tf.compat.v1.get_variable (ve uzantı tf.compat.v1.layers ) her zaman her çağrıda yeni bir değişken oluşturmak yerine dekore yöntemin iç düzgün çalışması için. Aynı zamanda dolaylı katmanı veya modül sebep aracılığıyla oluşturulur veya erişilen herhangi ağırlıkları izler get_variable dekore yöntemi içinde.

Standart altında kendilerini ağırlıkları izlemeye ek olarak layer.variable / module.variable / vb. yöntem aitse özellikleri, tf.keras.layers.Layer , daha sonra bu belirtilen düzenlileştirme kayıpları get_variable veya tf.compat.v1.layers argümanlar, standart altında tabaka ile takip alacak regularizer layer.losses özelliği.

Bu izleme mekanizması Keras katmanları veya TF1.x tarzı modeli ileri geçişli kod içeriden büyük sınıflarını kullanarak sağlayan tf.Module TF2 davranışları etkin bile TF2 s.

kullanım örnekleri

Kullanım örnekleri aşağıda süslemek için kullanılan modelleme şim göstermek tf.keras.layers.Layer yöntemleri, ancak özellikle keras etkileşime dekorasyon zaman geçerlidir özellikleri burada hariç tf.Module ve yöntemler.

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

Eğer üstünde doğrudan uygulanan bir katman var düşünün tf.compat.v1.get_variable şöyle:

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)
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
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
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
[<tf.Tensor: shape=(), dtype=float32, numpy=0.1345337>]

İle inşa Model tf.compat.v1.layers

Eğer bir katman veya model üstünde doğrudan uygulamaya sahip düşünün tf.compat.v1.layers şöyle:

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)
/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
[<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
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)>
# 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>]

Yakalama toplu normalleştirme güncellemeleri ve model training args

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. Ortalama güncellemeleri hareketli toplu normalleştirme tarafından izlenen get_collection tabakasından ayrı olarak adlandırılan
  2. tf.compat.v1.layers.batch_normalization bir gerektirir training (genel olarak adlandırılan bağımsız değişken is_training TF-ince toplu normalleştirme katmanlar kullanıldığında)

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

Eğer verirsen Ayrıca, tf.keras.layers.Layer 'ın ileri pas yöntemini bir training argümanı, Keras diğer herhangi bir katman için yaptığı gibi kendisine mevcut eğitim aşamasını ve herhangi yuvalanmış katmanları geçmek mümkün olacaktır. API docs bakın tf.keras.Model Keras nasıl işlediği hakkında daha fazla bilgi için training argüman.

Eğer dekorasyon iseniz tf.Module yöntemleri, el tüm geçmek emin olmak gerekir training gerektiği gibi argümanlar. Bununla birlikte, toplu normalleştirme hareketli ortalama güncellemeleri, açık kontrol bağımlılıklarına gerek kalmadan otomatik olarak uygulanmaya devam edecektir.

(Uygulanabilen Keras modeli çalışmalarında kullanarak nasıl Aşağıdaki kod parçacıkları ne kadar pabucun içinde yerleştirme toplu normalleştirme tabakaları göstermek ve tf.keras.layers.Layer ).

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})
/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ı

Dayalı ileri geçişte herhangi değişken kreasyonları get_variable değişken kapsamları TF1.x. sahip aynı değişken isimlendirme ve yeniden anlambilim koruyacak Eğer herhangi biri için en az bir boş olmayan dış kapsama sahip olduğu bu sürece doğrudur tf.compat.v1.layers otomatik oluşturulan adlarla yukarıda belirtildiği gibi,.

Hevesli yürütme ve tf.function

Yukarıda görüldüğü gibi, için yöntemler edilmiş tf.keras.layers.Layer ve tf.Module istekli yürütme çalıştırma içinde ve aynı zamanda uyumlu tf.function . Bu araçlar kullanabileceğiniz Pdb Çalışıyorsa olarak ileri geçitten adıma ve diğer etkileşimli araçları.

Dağıtım stratejileri

Çağrıları get_variable@track_tf1_style_variables -dekore tabaka veya modül yöntemleri, standart kullanımı tf.Variable başlık altında değişken yarattıkları. Bu birlikte mevcut olan çeşitli dağıtım stratejileri ile kullanabileceğiniz anlamına gelir tf.distribute gibi MirroredStrategy ve TPUStrategy .

Yuvalama tf.Variable s, tf.Module s, tf.keras.layers & tf.keras.models dekore çağrılarda

Daki katman çağrı Dekorasyon tf.compat.v1.keras.utils.track_tf1_style_variables sadece aracılığıyla oluşturulan (ve yeniden) değişkenlerin otomatik örtük takibini katacak tf.compat.v1.get_variable . Bu yakalama ağırlıkları tarafından doğrudan oluşturulmamış olur tf.Variable tür tipik Keras katman ve en tarafından kullanılan gibi çağrılar, tf.Module s. Bu bölümde, bu iç içe geçmiş durumların nasıl ele alınacağı açıklanmaktadır.

(Kullanımlarını Önceden varolan) tf.keras.layers ve tf.keras.models

İçin iç içe Keras katmanları ve modellerin, kullanım kullanımları öncesi var olan tf.compat.v1.keras.utils.get_or_create_layer . 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.

Kullanmak için tf.compat.v1.keras.utils.get_or_create_layer bir yöntemle içine yuvalanmış bir model oluşturur kod sarın ve yönteme geçirilmesi mümkündür. Ö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)))
<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. Not bu @track_tf1_style_variables dekoratör yine uygun bir yöntem gereklidir. Geçirilen bir model oluşturucu yöntemi get_or_create_layer (bu durumda, içinde self.build_model ), herhangi bir bağımsız değişken almak gerekir.

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
[<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)
<tf.Tensor: shape=(1,), dtype=float32, numpy=array([0.5], dtype=float32)>

Artan göç: tf.Variables ve tf.Modules

Gömmek gerekiyorsa tf.Variable aramaları veya tf.Module sizin dekore yöntemlerde ler (örneğin olmayan eski TF2 API'lere artan göç takip ediyor ise, bu kılavuzda daha sonra açıklanacaktır), yine de açıkça Bunları izlemek gerekiyor aşağıdaki gereksinimlerle:

  • Açıkça değişken/modül/katmanın yalnızca bir kez oluşturulduğundan emin olun
  • Örneğin, bir tanımlanırken olduğu gibi niteliklerini olarak Açıkça ekleyebilirsiniz tipik bir modül veya katmanı
  • 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)))
/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)>

İç içe modülün o açık izleme, süslenmiş halde ihtiyaç vardır Not track_tf1_style_variables dekoratör. 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
[<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
[<tf.Tensor: shape=(), dtype=float32, numpy=0.058749676>]

Eğer Not NestedLayer olmayan Keras idi tf.Module yerine, değişkenler yine izlenecek ama açıkça ayrı olarak takip etmesi gerekir böylece düzenlilestirme kayıpları otomatik olarak izlenir olmaz.

Değişken adları hakkında rehberlik

Açık tf.Variable aramalar ve Keras katmanları kombinasyonundan için kullanılabilir farklı bir katman adı / değişken adı autogeneration mekanizması kullanmak get_variable ve variable_scopes . Şim yapacak olsa da değişken adları yarattığı değişkenler için eşleşen get_variable TF2 istekli yürütme & için TF1.x grafiklerden giderken bile tf.function , bu için oluşturulan değişken adları için aynı garanti edemez tf.Variable aramalar ve Keras katmanları o yöntem dekoratörlerinize yerleştirirsiniz. Birden değişkenler TF2 istekli yürütme ve aynı adı paylaşması bile mümkündür tf.function .

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.

Kullanılması tf.compat.v1.make_template dekore yöntemde

Oldukça doğrudan kullanmak önerilir tf.compat.v1.keras.utils.track_tf1_style_variables kullanmak yerine tf.compat.v1.make_template o TF2 üstüne bir ince tabaka olduğu gibi.

Zaten güvenerek edilmiştir öncesinde TF1.x kodu için bu bölümdeki rehberlik izleyin tf.compat.v1.make_template .

Çünkü tf.compat.v1.make_template kullandığı bu kodu sarar get_variable , track_tf1_style_variables dekoratör sen katman çağrılarında bu şablonları kullanın ve başarıyla ağırlıkları ve düzenlileştirme kayıplarını izlemenize olanak sağlar.

Bununla birlikte, çağrı emin yapabilirim make_template sadece bir kez ve daha sonra her katman çağrısında aynı şablonu yeniden kullanın. 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)
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 Eğer TF2 tarzı nesne yönelimli karıştırmak sağlar tf.Variable / tf.keras.layers.Layer / tf.Module mirası ile kullanımını tf.compat.v1.get_variable / tf.compat.v1.layers tarzı aynı dekore edilmiş modül/katmanın içinde kullanım.

Eğer TF1.x modeli tam TF2 uyumlu yaptıktan sonra, yerel (non tüm yeni model bileşenleri yazabilirsiniz Bu araçlar tf.compat.v1 ) TF2 API'leri ve onları eski kodu ile birlikte çalışan var.

Eğer eski model bileşenlerini değiştirmeye devam eğer aşamalı eski tarzı geçmek Ancak, aynı zamanda tercih edebilir tf.compat.v1 yeni yazılmış TF2 kodu için tavsiye edilir tamamen yerli nesne yönelimli API'ler üzerinde kullanımını.

tf.compat.v1.get_variable kullanımı ile ya ikame edilmiş olabilir self.add_weight bir Keras katman / modeli dekorasyon halinde aramaları veya tf.Variable Eğer dekorasyon, çağrıları Keras nesneler ya tf.Module s.

Hem fonksiyonel tarzı ve nesne yönelimli tf.compat.v1.layers genel olarak eşdeğer ile ikame edilmiş olabilir tf.keras.layers gerekmez argüman değişikliklerle tabaka.

Ayrıca kendileri kullanabilir tamamen yerli API'leri için artırımlı hareket sırasında bireysel katmanlar / modüllerin içine modeli veya ortak kalıplarının parçalarını parça düşünebilir track_tf1_style_variables .

Slim ve katkıda bulunanlar hakkında bir not

Büyük TF 1.x kod büyük bir miktarı kullanan ince olarak TF 1.x ile birlikte verilen kütüphane, tf.contrib.layers . Doğal TF 2 İnce kodunu kullanarak dönüştürme dönüştürmek daha karmaşıktır v1.layers . Aslında, bu anlamda sizin İnce kodunu dönüştürmek için yapabilir v1.layers sonra, ilk keras dönüştürmek. 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. Kaldır arg_scopes mümkünse. Hala onlara, split kullanmanız gerekiyorsa normalizer_fn ve activation_fn kendi katmanlara.
  • Ayrılabilir konv katmanları, bir veya daha fazla farklı Keras katmanıyla eşlenir (derinlik yönünde, noktasal ve ayrılabilir Keras katmanları).
  • İnce ve v1.layers farklı argüman isimlerini ve varsayılan değerleri vardır.
  • 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

Daha sonra, yerini compat.v1 bir parçalı bir şekilde kendi doğal nesne yönelimli eşdeğeri ile API'lar. 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

Kullanım v1.keras.utils.DeterministicRandomTestTool doğrulamak için sınıf bu artan değişim yaprakları bundan önce aynı davranışı ile modeli.

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 bireysel tüm yerini compat.v1.layers yerli Keras katmanlarla.

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)
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, herhangi bir geri kalan (, artık ihtiyaç duyulan) hem kaldırma variable_scope kullanımı ve track_tf1_style_variables kendisi bir dekoratör.

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

Ancak, bazı durumlarda, ayrıntılı bir gibi yaklaşımlar ile yeni isimlere değişkenlerin bir eşleme orijinal isme dayalı denetim noktası alıp bulmak mümkün olabilir Yeniden kullanım TF1.x kontrol noktaları rehber .

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

  • Değişkenler hala tüm bir var name ayarlayabileceğiniz argüman.
  • Keras modelleri de almak name onların değişkenler için ön ek olarak ayarlanmış hangi argüman.
  • v1.name_scope fonksiyonu Değişken adı önekleri ayarlamak için kullanılabilir. Bu çok farklıdır tf.variable_scope . 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. Fonksiyonel tarzı geçiş yaparak başlayın tf.compat.v1.layers kendi nesne yönelimli sürümlerine.
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]
/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. Daha sonra, oluşturulan compat.v1.layer nesneleri ve herhangi bir değişken atama compat.v1.get_variable özellikler olarak tf.keras.layers.Layer / tf.Module yöntemi ile dekore nesne track_tf1_style_variables (not herhangi bir nesne yönelimli TF2 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]
/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. Artık nesne yönelimli takas olabilir compat.v1.layers hala son zamanlarda kaydedilen denetim noktası yüklemek mümkün olurken yerli Keras katmanları için. Kalan için değişken adlarını korumak emin olun compat.v1.layers hala otomatik oluşturulan kaydederek variable_scopes yerini tabakaların. 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, kullanımını yerini alabilecek compat.v1.get_variable tarafından özelliklerine bağlı değişkenler:

  • Kullanarak onları Switching tf.Variable VEYA
  • Kullanarak bunları güncelleme tf.keras.layers.Layer.add_weight . Kimse gitmek size tüm katmanları geçiş değilse bu geri kalan otomatik oluşturulan katman / değişken adlandırma değişebileceğini Not compat.v1.layers bir eksik name argüman. Eğer durum ise, geri kalan değişken isimleri tutmalısınız compat.v1.layers elle açılarak aynı ve bir kapanış variable_scope kaldırılan karşılık gelen compat.v1.layer kapsamı ad oluşturmuştur s'. 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]
/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 inşa etmek suretiyle bu adımda bir kontrol noktası dışarı kaydetme yalnızca, şu anda kullanılabilir nesne yollarını içerir yapacaktır.

Kaldırılan kapsamlarını kayıt olun compat.v1.layers kalan için otomatik oluşturulan ağırlık adlarını korumak için compat.v1.layers .

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. Tüm yerini almıştır kadar yukarıdaki adımları tekrarlayın compat.v1.layers ve compat.v1.get_variable tamamen yerli eşdeğeri ile modelinde s.
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]
['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. Açıklanan teknikleri uygulayın validate sayısal doğruluğu kılavuzunda doğru Taşınan kod yayınlanmasını sağlamanın Bu sürecin her artan adımda.

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

Bu kılavuzda açıklanan modelleme şim emin oluşturulan değişkenler, katmanlar ve düzenlilestirme kayıpları olduğunu yapabilir get_variable , tf.compat.v1.layers ve variable_scope istekli yürütme ve kullanırken daha önce olduğu gibi semantik çalışmalarına devam tf.function , gerek kalmadan koleksiyonlara güvenin.

Modeliniz ileri güvenerek olabilir geçtiği Bunların hepsi TF1.x özgü semantik kapsamaz. Bazı durumlarda, takozlar, modelinizin ileriye doğru geçişini TF2'de tek başına çalıştırmak için yetersiz olabilir. Oku kılavuz TF2 davranışlar vs TF1.x TF1.x ve TF2 arasındaki davranış farklılıkları hakkında daha fazla bilgi için.