tensorflow - 将 TensorFlow 梯度计算分成两个(或更多)部分
问题描述
是否可以部分使用 TensorFlow 的tf.gradients()
函数,即 - 从某个张量的损失和该张量的权重计算梯度,然后将它们相乘以获得从损失到权重的原始梯度?
例如,设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)
。
不幸的是,这种情况并非如此。尺寸不正确。每个渐变的维度都是“wrt 变量”的维度,因此第一个渐变和第二个渐变之间没有对应关系。我错过了什么,我该怎么做?
谢谢。
解决方案
tf.gradients
将对输入张量的梯度求和。为避免这种情况,您必须将张量拆分为标量并应用于tf.gradients
每个标量:
import tensorflow as tf
x = tf.ones([1, 10])
w = tf.get_variable("w", initializer=tf.constant(0.5, shape=[10, 5]))
out = tf.matmul(x, w)
out_target = tf.constant(0., shape=[5])
loss = tf.reduce_mean(tf.square(out - out_target))
grad = tf.gradients(loss, x)
part_grad_1 = tf.gradients(loss, out)
part_grad_2 = tf.concat([tf.gradients(i, x) for i in tf.split(out, 5, axis=1)], axis=1)
grad_by_parts = tf.matmul(part_grad_1, part_grad_2)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run([grad]))
print(sess.run([grad_by_parts]))
推荐阅读
- javascript - CloudFlare Worker Cache API 不存储获取结果
- youtube - 使用 ID/URL 获取 Youtube 视频故事板
- c++ - 如何使用 C++ 从 csv 文件中获取特定值
- python - 将一个模型字段与另一个模型字段关联两次 Django
- r - 在数据框中捕获 NA 之前的值
- c++ - 在切片值中添加每列的值
- webmin - virtualmin -plugin Nginx SSL 网站无法使用
- reactjs - 用 prevState 改变状态
- javascript - 服务工作者 - 渐进式 Web 应用程序的渐进式缓存 - 如何逐步加载文件组
- python - 使用 python numpy 和向量化创建关系矩阵