是否有可能在部分中使用TensorFlow的 tf.gradients()
函数,即 - 计算从损失w.r.t一些张量的梯度,以及那个张量w.r.t的权重,然后将它们相乘以得到从损失到重量的原始梯度?
例如,让 W,b
为一些权重,让 x
为网络的输入,让 y0
表示标签 .
假设一个正向图,如
h=Wx+b
y=tanh(h)
loss=mse(y-y0)
我们可以计算 tf.gradients(loss,W)
,然后应用(跳过一些细节) optimizer.apply_gradients()
来更新 W
.
然后我尝试使用 var=tf.get_default_graph().get_tensor_by_name(...)
提取中间张量,然后计算两个渐变: g1=tf.gradients(loss,var)
和 g2=tf.gradients(var,W)
. 然后,按照链式规则,我希望 g1
和 g2
的尺寸能够解决,这样我就可以在某种意义上写出 g=g1*g2
,然后回到 tf.gradients(loss,W)
.
不幸的是,这种情况并非如此 . 尺寸不正确 . 每个渐变的尺寸都是“w.r.t变量”的尺寸,因此第一个渐变和第二个渐变之间不会有对应关系 . 我错过了什么,我该怎么做?
谢谢 .
2 回答
tf.gradients
将对输入张量的梯度求和 . 为避免这种情况,您必须将张量分割为标量并将tf.gradients
应用于每个标量:来自docs,
tf.gradients
(强调我的)如果
ys
中的任何张量在多维中,则在得到的标量列表之前,它是reduce_sum
med,然后才会被差异化 . 这就是输出渐变与xs
具有相同大小的原因 .这也解释了为什么损失在张量流中可以是多维的:它们在分化之前被隐含地总结 .