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:
- değişken oluşturmayı ve yeniden kullanmayı kontrol etmek için
tf.compat.v1.get_variable
vetf.compat.v1.variable_scope
ve - Takip etmek için
tf.compat.v1.global_variables()
,tf.compat.v1.trainable_variables
,tf.compat.v1.losses.get_regularization_losses()
vetf.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 :
- Tüm eğitilebilir ağırlıklarını ve düzenlileştirme kayıplarını sırasıyla
model.trainable_weights
vemodel.losses
aracılığıyla izleyen bağımsız Keras modelleri. -
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
-yer tutucu2 l10n-yer# 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 ş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-yerWARNING: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-yer2021-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-yerResetting 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-yerResetting 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:
- Toplu normalleştirme hareketli ortalama güncellemeleri, katmandan ayrı olarak çağrılan
get_collection
tarafından izlenir. -
tf.compat.v1.layers.batch_normalization
birtraining
argümanı gerektirir (genellikle TF-Slim toplu normalleştirme katmanlarını kullanırkenis_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-yerweights: [<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
veactivation_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-yertf.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-yertf.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.
- İş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']
- 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 olaraktrack_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']
- 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
- Ş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şturulanvariable_scopes
kaydetmeye devam ederek kalancompat.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 birname
bağımsız değişkeni olmayan kalancompat.v1.layers
için otomatik oluşturulan katman/değişken adlandırmalarını değiştirebileceğini unutmayın. Bu durumda, kaldırılancompat.v1.layer
oluşturulan kapsam adına karşılık gelen birvariable_scope
manuel olarak açıp kapatarak kalancompat.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
- Modelinizdeki tüm
compat.v1.layers
vecompat.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.