【发布时间】:2017-10-03 04:03:10
【问题描述】:
快速提问,因为我在这里有点困惑。
假设我们有一个简单的图表:
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.gradients
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>]
所以我们得到的梯度完全符合输入张量的形状。但为什么? 不像有一个单一的指标,我们可以对它进行偏导数。梯度不应该从输入张量的每一个值映射到输出张量的每一个值,有效地为输入 a 提供 200x1x200x100 的梯度吗?
这只是一个简单的示例,其中输出张量的每个元素仅取决于张量 b 中的一个值,以及张量 a 中的一行。但是,如果我们做一些更复杂的事情,比如在张量上运行高斯模糊,那么梯度肯定必须比输入张量更大。
我在这里错了什么?
【问题讨论】:
标签: tensorflow linear-algebra derivative