【问题标题】:Concept of getter in TensorFlowTensorFlow中getter的概念
【发布时间】:2018-05-05 09:58:22
【问题描述】:

TensorFlow中getter的概念和用途是什么?

tf.get_variable()的签名是:

get_variable(
    name,
    shape=None,
    dtype=None,
    initializer=None,
    regularizer=None,
    trainable=True,
    collections=None,
    caching_device=None,
    partitioner=None,
    validate_shape=True,
    use_resource=None,
    custom_getter=None
)

custom_getter的定义在文档中给出如下:

custom_getter: 将 true 作为第一个参数的可调用对象 getter,并允许覆盖内部 get_variable 方法。这 custom_getter 的签名应该与此方法的签名匹配,但是 大多数面向未来的版本将允许更改:def custom_getter(getter, *args, **kwargs)。直接访问所有 还允许使用 get_variable 参数:def custom_getter(getter, 名称,*args,**kwargs)。一个简单的身份自定义 getter 创建具有修改名称的变量是:python def custom_getter(getter, name, *args, **kwargs): return getter(name + '_suffix', *args, **kwargs)

不幸的是,它不是很清楚。有人可以扩展一下吗?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    这个想法是它为变量创建过程提供了一个“钩子”,一种在创建变量时可能覆盖某些内容的方法。这对于特定(狭窄)的一组问题非常方便。

    从概念上讲,“自定义 getter”类似于 Python decorator:您编写的函数将原始函数及其参数作为参数,但您必须返回结果而不是修改后的函数。

    您还可以将自定义 getter 指定为 tf.variable_scope() 中的参数,这样您就可以一次将其应用于多个变量。

    作为一个有点武断的例子,假设您有大量的代码来创建某种网络。你一天早上醒来,想试试 L2 对所有变量进行归一化是否有助于提高网络的性能。您可以将整个网络包含在一个范围内并执行以下操作(伪代码),而不是编辑所有创建的层和其中的变量:

    with tf.variable_scope( "L2", custom_getter =
        lambda getter, name, shape, *args, **kwargs:
            tf.nn.l2_normalize( getter( name = name, shape = shape, *args, **kwargs ) ) ):
        # the original network here
    

    这将自动对网络中的所有变量进行 L2 标准化并保持它们不变。当然,如果您不想对所有这些都这样做,您可以编写更多代码并按名称或其他参数进行过滤。您也不必必须将其作为 lambda 函数执行,您可以使用 def 编写一个普通函数并将其作为 custom_getter 参数传递。

    另外请注意这个简单的例子犯了一个错误:返回的变量将是一个 tensor 而不是 variable 所以 tf.assign() 在这个变量上会失败,因为例子。

    作为参考,默认的getter定义在tensorflow/python/ops/variable_scope.py类的tensorflow/python/ops/variable_scope.pyget_variable()方法at this exact link for r1.8中。

    【讨论】:

      【解决方案2】:

      以this custom getter为例,它根据可变的形状大小重写caching_device。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-26
        • 1970-01-01
        • 2016-09-21
        • 2015-11-16
        相关资源
        最近更新 更多