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


Python tf.compat.v1.make_template用法及代码示例


给定一个任意函数,将其包装,以便进行变量共享。

用法

tf.compat.v1.make_template(
    name_, func_, create_scope_now_=False, unique_name_=None, custom_getter_=None,
    **kwargs
)

参数

  • name_ 此模板创建的范围的名称。如有必要,将通过将_N 附加到名称来使名称唯一。
  • func_ 要包装的函数。
  • create_scope_now_ 控制在构造模板时或调用模板时是否应创建范围的布尔值。默认为 False,这意味着在调用模板时创建范围。
  • unique_name_ 使用时,它会覆盖 name_ 并且不是唯一的。如果相同范围/unique_name 的模板已经存在并且重用为 false,则会引发错误。默认为无。
  • custom_getter_ func_ 中使用的变量的可选自定义 getter。有关详细信息,请参阅 tf.compat.v1.get_variable custom_getter 文档。
  • **kwargs 应用于 func_ 的关键字参数。

返回

  • 封装一组变量的函数,这些变量应该创建一次并重用。在调用 make_template 或调用结果时将创建封闭范围,具体取决于 create_scope_now_ 的值。不管取值如何,第一次调用模板都会进入作用域,不重用,调用func_创建变量,保证唯一。所有后续调用都将重新进入范围并重用这些变量。

抛出

  • ValueError 如果name_ 为无。

迁移到 TF2

警告:这个 API 是为 TensorFlow v1 设计的。继续阅读有关如何从该 API 迁移到本机 TensorFlow v2 等效项的详细信息。见TensorFlow v1 到 TensorFlow v2 迁移指南有关如何迁移其余代码的说明。

tf.compat.v1.make_template 是一个遗留 API,仅与启用的渴望执行和 tf.function 兼容,如果你将它与 tf.compat.v1.keras.utils.track_tf1_style_variables 结合使用。有关更多信息,请参阅 make_template 上的模型映射迁移指南部分:

https://www.tensorflow.org/guide/migrate/model_mapping#using_tfcompatv1make_template_in_the_decorated_method

即使您将旧版 API 用于基于 variable_scope 的变量重用,我们建议直接使用 tf.compat.v1.keras.utils.track_tf1_style_variables 而不是使用 tf.compat.v1.make_template ,因为它以比 make_template 更简单和更可预测的方式与即刻执行互操作。

TF2 API 方法将使用 tf.Module 或 Keras 层和模型来跟踪您的变量,而不是依赖 make_template

这将 func_ 包装在模板中并对其进行部分评估。模板是在第一次调用它们时创建变量并在之后重用它们的函数。为了使 func_Template 兼容,它必须具有以下属性:

  • 该函数应创建所有可训练变量和应通过调用 tf.compat.v1.get_variable 重用的任何变量。如果使用 tf.Variable 创建可训练变量,则会抛出 ValueError。可以通过指定 tf.Variable(..., trainable=false) 来创建旨在成为局部变量的变量。
  • 该函数可以在内部使用变量范围和其他模板来创建和重用变量,但不应使用tf.compat.v1.global_variables 来捕获在函数范围之外定义的变量。
  • 内部范围和变量名不应依赖于未提供给 make_template 的任何参数。一般来说,你会得到一个 ValueError ,告诉你如果你犯了错误,你正在尝试重用一个不存在的变量。

在以下示例中,zw 都将按相同的 y 进行缩放。重要的是要注意,如果我们没有分配 scalar_name 并为 z 和 w 使用不同的名称,则会抛出 ValueError,因为它无法重用变量。

def my_op(x, scalar_name):
  var1 = tf.compat.v1.get_variable(scalar_name,
                         shape=[],
                         initializer=tf.compat.v1.constant_initializer(1))
  return x * var1

scale_by_y = tf.compat.v1.make_template('scale_by_y', my_op, scalar_name='y')

z = scale_by_y(input1)
w = scale_by_y(input2)

作为 safe-guard,如果通过调用 tf.Variable 创建可训练变量,则返回的函数将在第一次调用后引发 ValueError

如果所有这些都是真的,那么模板会强制执行 2 个属性:

  1. 多次调用同一个模板将共享所有非局部变量。
  2. 两个不同的模板保证是唯一的,除非您重新输入与模板的初始定义相同的变量范围并重新定义它。此异常的示例:
def my_op(x, scalar_name):
  var1 = tf.compat.v1.get_variable(scalar_name,
                         shape=[],
                         initializer=tf.compat.v1.constant_initializer(1))
  return x * var1

with tf.compat.v1.variable_scope('scope') as vs:
  scale_by_y = tf.compat.v1.make_template('scale_by_y', my_op,
  scalar_name='y')
  z = scale_by_y(input1)
  w = scale_by_y(input2)

# Creates a template that reuses the variables above.
with tf.compat.v1.variable_scope(vs, reuse=True):
  scale_by_y2 = tf.compat.v1.make_template('scale_by_y', my_op,
  scalar_name='y')
  z2 = scale_by_y2(input1)
  w2 = scale_by_y2(input2)

根据 create_scope_now_ 的值,可以在第一次调用或构造时捕获完整的变量范围。如果此选项设置为 True,则通过重复调用模板创建的所有张量将在其名称后附加一个 _N+1,因为第一次在模板构造函数中输入范围时,不会创建张量。

注意:name_ , func_create_scope_now_ 有一个尾随下划线,以减少与 kwargs 冲突的可能性。

相关用法


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