在此装饰器中包装层和模块方法以捕获 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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。