在张量流中,如果一个人有两个张量xy,并且一个人想用y得到x相对于tf.gradients(y,x)的梯度。那么一个人真正得到的是:

gradient[n,m] = sum_ij d y[i,j]/ d x[n,m]

y的指数上有一个和,有没有办法避免这个隐式和?要得到整个梯度张量?

最佳答案

这里是我的工作,只需要取每个分量的导数(正如@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张量。这是一个非常低效的方法,因为所有的东西都需要被分割和重新包装在一起,所以如果有人找到更好的我会非常有兴趣看到它。

关于python - Tensorflow梯度:无自动隐式求和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39993377/

10-12 21:17