【问题标题】:How to process gradients with a Dimension size of None如何处理维度大小为无的渐变
【发布时间】:2016-01-25 14:54:47
【问题描述】:

使用 AdamOptimizer,当我得到一个二维变量的梯度时,第二个维度的大小最终为 None,而第一个维度的大小与变量的第一个维度相同。这使得处理梯度变得困难,因为对于大多数函数来说,None 的大小与其他大小不兼容。当我得到一维变量的梯度时,梯度的维度大小与变量的相同。我没有尝试过超过 2 维的变量。

这是一个错误吗?有没有办法通过 compute_gradients 函数指定梯度的大小?有没有办法处理绕过大小 None 问题的渐变?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    TL;DR: 没关系,您可以像往常一样使用tf.train.AdamOptimizer 处理渐变。如果您看到与形状相关的错误,这很可能是由不匹配的已知尺寸之一引起的。

    在梯度张量的shape 中存在None 仅仅意味着无法静态推断该维度中的大小。这不一定是错误:许多运算符的形状取决于它们的数据输入,TensorFlow Python 前端使用简单的启发式(即,仅计算一组有限的具有恒定输入的运算)来决定要评估哪些数据输入.几乎所有 TensorFlow 操作(不包括一些图像处理操作)都将处理形状未知(或仅部分已知)的输入,并在运行时执行检查。

    处理渐变的主要方法是使用Optimizer.apply_gradients(),它将形状检查推迟到shape function for the ApplyAdam operator。此形状函数断言变量和梯度具有相同的形状,但TensorShape.merge_with() 方法允许在任一形状中存在None 时出现误报。

    最后,如果您需要在图形构建时处理渐变,并且您的处理以某种方式依赖于具有已知形状的渐变,您始终可以使用Tensor.set_shape() 方法将变量的形状复制到渐变,因为它们必须是等价的:

    var = tf.Variable(...)
    loss = ...
    grad = tf.gradients(loss, [var])[0]
    
    # `grad` and `var` must have the same shape.
    grad.set_shape(var.get_shape())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 2020-07-21
      • 2021-04-16
      • 1970-01-01
      • 2021-11-29
      • 2012-11-04
      相关资源
      最近更新 更多