快速提问,因为我在这里感到很困惑。
我们说我们有一个简单的图表:
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中的一行。然而,如果我们做了更复杂的事情,比如在张量上运行高斯模糊,那么渐变肯定必须大于输入张量。
我错在哪里?
答案 0 :(得分:1)
默认情况下,tf.gradients通过将传递给tf.gradients的所有张量的所有元素相加为输出来获取标量的渐变。