TensorFlow:tf.gradients()返回到底是什么



快速问题,因为我在这里很困惑。

假设我们有一个简单的图:

a = tf.Variable(tf.truncated_normal(shape=[200, 1], mean=0., stddev=.5))
b = tf.Variable(tf.truncated_normal(shape=[200, 100], mean=0., stddev=.5))
add = a+b
add
<tf.Tensor 'add:0' shape=(200, 100) dtype=float32> #shape is because of broadcasting

因此,我有一个节点可接收2个张量,并产生1个张量作为输出。现在,让我们在其上运行tf。

tf.gradients(add, [a, b])
[<tf.Tensor 'gradients/add_grad/Reshape:0' shape=(200, 1) dtype=float32>,
 <tf.Tensor 'gradients/add_grad/Reshape_1:0' shape=(200, 100) dtype=float32>]

因此,我们将梯度完全处于输入张量的形状。但为什么?不像我们可以采用部分衍生物的单一指标。梯度是否不应该从输入张量的每个值映射到输出张量的每个值,而有效地给出了200x1x200x100输入的梯度A?

这只是一个简单的示例,即输出张量的每个元素仅取决于张量B的一个值,而来自张量a的一行。但是,如果我们做一些更复杂的事情,例如在张量上运行高斯模糊,那么梯度肯定必须比输入张量更大。

我在这里错了什么?

默认情况下TF.Gradients将获得标量的梯度求和,将所有张力的所有张力的所有元素求和传递给tf.gradients的所有元素作为输出。

相关内容

  • 没有找到相关文章

最新更新