在tensorflow中,如果一个人有两个张量x
和y
,并且有一个想要使用y
使x
的渐变相对于tf.gradients(y,x)
。那么实际得到的是:
gradient[n,m] = sum_ij d y[i,j]/ d x[n,m]
y的指数有一个总和,有没有办法避免这个隐含的总和?获得整个梯度张量gradient[i,j,n,m]
?
答案 0 :(得分:5)
这是我的工作,只是采用每个组件的衍生物(也由@Yaroslav提及),然后在2级张量(矩阵)的情况下再次将它们打包在一起:
import tensorflow as tf
def twodtensor2list(tensor,m,n):
s = [[tf.slice(tensor,[j,i],[1,1]) for i in range(n)] for j in range(m)]
fs = []
for l in s:
fs.extend(l)
return fs
def grads_all_comp(y, shapey, x, shapex):
yl = twodtensor2list(y,shapey[0],shapey[1])
grads = [tf.gradients(yle,x)[0] for yle in yl]
gradsp = tf.pack(grads)
gradst = tf.reshape(gradsp,shape=(shapey[0],shapey[1],shapex[0],shapex[1]))
return gradst
现在grads_all_comp(y, shapey, x, shapex)
将以所需格式输出等级4张量。这是一种非常低效的方式,因为所有东西都需要切片并重新打包在一起,所以如果有人发现更好,我会非常有兴趣看到它。
答案 1 :(得分:3)
没有办法。 TensorFlow 0.11 tf.gradients
实现了标准的反向模式AD,它给出了标量的导数。您需要分别为每个tf.gradients
致电y[i,j]