Tensorflow:tf.gradients() return 究竟做了什么
Tensorflow: what exactly does tf.gradients() return
快速提问,因为我在这里有点困惑。
假设我们有一个简单的图表:
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 的一行。然而,如果我们做一些更复杂的事情,比如 运行 在张量上进行高斯模糊,那么梯度肯定必须大于输入张量。
我哪里错了?
默认情况下,tf.gradients 采用通过将传递给 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.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 的一行。然而,如果我们做一些更复杂的事情,比如 运行 在张量上进行高斯模糊,那么梯度肯定必须大于输入张量。
我哪里错了?
默认情况下,tf.gradients 采用通过将传递给 tf.gradients 的所有张量的所有元素相加作为输出而获得的标量的梯度。