【问题标题】:Tensorflow: what exactly does tf.gradients() returnTensorflow:tf.gradients() 究竟返回了什么
【发布时间】: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


    【解决方案1】:

    默认情况下,tf.gradients 采用通过将传递给 tf.gradients 的所有张量的所有元素相加得到的标量的梯度作为输出。

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 2017-05-06
      • 2016-04-21
      • 2013-06-30
      • 2011-10-11
      相关资源
      最近更新 更多