当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.compat.v1.keras.utils.track_tf1_style_variables用法及代码示例


在此装饰器中包装层和模块方法以捕获 tf1 样式的权重。

用法

tf.compat.v1.keras.utils.track_tf1_style_variables(
    method
)

参数

  • method 装饰的方法。这应该属于自定义的 tf.Module、tf.keras.layers.Layer 或 tf.keras.Model。

返回

  • 装饰方法。

使用此装饰器装饰 tf.keras.Layertf.Module 的方法将导致层/模块跟踪在装饰方法内通过 tf.compat.v1.get_variable (以及通过扩展 tf.compat.v1.layers )创建/使用的权重。

除了在标准 layer.variable /module.variable /etc 下跟踪权重本身。属性,如果该方法属于tf.keras.Layer,则通过get_variabletf.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.layersget_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 模型权重和损失,但新代码应使用显式跟踪。

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.compat.v1.keras.utils.track_tf1_style_variables。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。