在此裝飾器中包裝層和模塊方法以捕獲 tf1 樣式的權重。
用法
tf.compat.v1.keras.utils.track_tf1_style_variables(
method
)
參數
-
method
裝飾的方法。這應該屬於自定義的 tf.Module、tf.keras.layers.Layer 或 tf.keras.Model。
返回
- 裝飾方法。
使用此裝飾器裝飾 tf.keras.Layer
或 tf.Module
的方法將導致層/模塊跟蹤在裝飾方法內通過 tf.compat.v1.get_variable
(以及通過擴展 tf.compat.v1.layers
)創建/使用的權重。
除了在標準 layer.variable
/module.variable
/etc 下跟蹤權重本身。屬性,如果該方法屬於tf.keras.Layer
,則通過get_variable
或tf.compat.v1.layers
正則化參數指定的任何正則化損失將由標準layer.losses
屬性下的層跟蹤。
此跟蹤允許在 Keras 層內使用大量 TF1 風格的model-forward-pass 代碼,或在啟用了 TF2 行為的 TF2 中使用 tf.Modules
。
將基於 tf.compat.v1.layer 的建模代碼捕獲為 Keras 層的示例:
class WrappedDoubleDenseLayer(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("double_dense_layer"):
out = tf.compat.v1.layers.dense(
inputs, self.units, name="dense_one",
kernel_initializer=tf.compat.v1.random_normal_initializer,
kernel_regularizer="l2")
out = tf.compat.v1.layers.dense(
out, self.units, name="dense_two",
kernel_initializer=tf.compat.v1.random_normal_initializer(),
kernel_regularizer="l2")
return out
# Create a layer that can be used as a standard keras layer
layer = WrappedDoubleDenseLayer(10)
# call the layer on inputs
layer(...)
# Variables created/used within the scope will be tracked by the layer
layer.weights
layer.trainable_variables
# Regularization losses will be captured in layer.losses after a call,
# just like any other Keras layer
reg_losses = layer.losses
將基於 tf.compat.v1.get_variable 的建模代碼捕獲為 Keras 層的示例:
class WrappedDoubleDenseLayer(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("double_dense_layer"):
with tf.compat.v1.variable_scope("dense_one"):
# 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=regularizers.L2(),
initializer=init_ops.ones_initializer(),
name="kernel")
bias = tf.compat.v1.get_variable(
shape=[self.units,],
initializer=init_ops.zeros_initializer(),
name="bias")
out = tf.compat.v1.math.matmul(out, kernel)
out = tf.compat.v1.nn.bias_add(out, bias)
with tf.compat.v1.variable_scope("dense_two"):
kernel = tf.compat.v1.get_variable(
shape=[out.shape[-1], self.units],
regularizer=regularizers.L2(),
initializer=init_ops.ones_initializer(),
name="kernel")
bias = tf.compat.v1.get_variable(
shape=[self.units,],
initializer=init_ops.zeros_initializer(),
name="bias")
out = tf.compat.v1.math.matmul(out, kernel)
out = tf.compat.v1.nn.bias_add(out, bias)
return out
# Create a layer that can be used as a standard keras layer
layer = WrappedDoubleDenseLayer(10)
# call the layer on inputs
layer(...)
# Variables created/used within the scope will be tracked by the layer
layer.weights
layer.trainable_variables
# Regularization losses will be captured in layer.losses after a call,
# just like any other Keras layer
reg_losses = layer.losses
正則化損失:
如果 get_variable
調用或 compat.v1.layer
創建中指定的任何正則化器出現在您的修飾方法中並且該方法屬於 tf.keras.Layer
/tf.keras.Module
,則它們將被捕獲。正則化損失可以在調用後在layer.losses
中訪問,就像在標準 Keras 層中一樣,並且將被包含該層的任何模型捕獲。附加到 Keras 層/模型設置為您的層屬性的正則化損失也將在標準 Keras 正則化損失跟蹤中捕獲。
(雖然模塊沒有losses
屬性,但計算正則化損失的no-arg 可調用函數可以作為私有module._tf1_style_var_store._regularizers
屬性中的dict 值進行跟蹤,但僅適用於tf.compat.v1.layers
和get_variable
權重,不適用於任何其他嵌套Keras 層/tf.Modules)
變量範圍/變量重用:在您的裝飾方法中基於variable-scope 的重用將受到尊重,並像 TF1 中基於variable-scope 的重用一樣工作。
變量名稱/預訓練檢查點加載:get_variable 和 compat.v1.layer
層的變量命名將與 TF1 名稱匹配,因此您應該能夠重新使用基於名稱的舊檢查點。 Keras 層/模型或tf.Variable
創建的變量的變量命名可能會在即刻執行時發生變化。
如果你裝飾 layer.call
訓練 Arg:如果 call
在其調用簽名中包含 training
arg 或 **kwargs
varargs,Keras 會將 training
arg 傳遞給該層,類似於 keras 如何將 training
傳遞給TF2 中的其他層在其call
實現中具有相似的簽名。在tf.keras.layers.Layer
上的文檔中查看更多詳細信息,以了解將傳遞的內容和時間。注意:tf.compat.v1.layers 通常不使用 training=None
調用,因此 forward_pass
的訓練參數可能不會傳遞給它們,除非您將其明確傳遞給它們的調用。
注意事項:
- TF2 不會修剪未使用的變量更新(或未使用的輸出)。您可能需要調整前向密碼以避免不打算使用的計算或變量更新。
- 避免在用
track_tf1_style_variables
修飾的方法內的 tf.function 中嵌套變量創建雖然可以從tf.function
內安全地使用該方法,但在修飾的方法內使用函數可能會破壞變量範圍。 - 這個裝飾器隻為遺留 tf1-style get_variable /compat.v1.layers 使用添加隱式跟蹤。如果您想在裝飾方法中使用嵌套的 Keras 層/模型,您需要將它們分配為層的屬性,以便 Keras/Module 的標準麵向對象的權重(以及層的損失跟蹤)將發揮作用。請參閱介紹有關更多信息,請參閱模塊、層和模型指南。作為備份,compat.v1.keras.utils.get_or_create_layer 方法將輕鬆跟蹤現有 TF1 代碼的嵌套 keras 模型權重和損失,但新代碼應使用顯式跟蹤。
相關用法
- Python tf.compat.v1.keras.utils.get_or_create_layer用法及代碼示例
- Python tf.compat.v1.keras.initializers.Ones.from_config用法及代碼示例
- Python tf.compat.v1.keras.layers.DenseFeatures用法及代碼示例
- Python tf.compat.v1.keras.initializers.Zeros.from_config用法及代碼示例
- Python tf.compat.v1.keras.initializers.Ones用法及代碼示例
- Python tf.compat.v1.keras.initializers.RandomNormal.from_config用法及代碼示例
- Python tf.compat.v1.keras.initializers.glorot_uniform.from_config用法及代碼示例
- Python tf.compat.v1.keras.initializers.lecun_uniform用法及代碼示例
- Python tf.compat.v1.keras.initializers.he_normal.from_config用法及代碼示例
- Python tf.compat.v1.keras.initializers.Orthogonal.from_config用法及代碼示例
- Python tf.compat.v1.keras.initializers.lecun_normal.from_config用法及代碼示例
- Python tf.compat.v1.keras.initializers.TruncatedNormal用法及代碼示例
- Python tf.compat.v1.keras.initializers.RandomNormal用法及代碼示例
- Python tf.compat.v1.keras.layers.enable_v2_dtype_behavior用法及代碼示例
- Python tf.compat.v1.keras.initializers.he_uniform用法及代碼示例
- Python tf.compat.v1.keras.initializers.Identity.from_config用法及代碼示例
- Python tf.compat.v1.keras.experimental.export_saved_model用法及代碼示例
- Python tf.compat.v1.keras.callbacks.TensorBoard用法及代碼示例
- Python tf.compat.v1.keras.initializers.Constant用法及代碼示例
- Python tf.compat.v1.keras.initializers.Constant.from_config用法及代碼示例
注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.compat.v1.keras.utils.track_tf1_style_variables。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。