如何处理尺寸大小为None的渐变

时间:2016-01-25 14:54:47

标签: tensorflow

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

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

1 个答案:

答案 0 :(得分:4)

TL; DR:这不重要,您可以正常使用tf.train.AdamOptimizer处理渐变。如果您看到与形状相关的错误,则很可能是因为其中一个已知尺寸不匹配。

None在渐变张量shape中的存在只是意味着无法静态推断该维度中的大小。这不一定是一个错误:许多运算符的形状依赖于它们的数据输入,而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())