Tensorflow梯度:没有自动隐式求和

pat*_*_ai 7 python gradient tensorflow

在张量流中,如果一个有两个张量x,y并且一个想要y具有关于x使用的梯度tf.gradients(y,x).然后实际得到的是:

gradient[n,m] = sum_ij d y[i,j]/ d x[n,m]
Run Code Online (Sandbox Code Playgroud)

y的指数有一个总和,有没有办法避免这种隐含的总和?获得整个梯度张量gradient[i,j,n,m]

pat*_*_ai 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
Run Code Online (Sandbox Code Playgroud)

现在grads_all_comp(y, shapey, x, shapex)将以所需格式输出4级张量。这是一种非常低效的方法,因为需要将所有内容切成薄片并重新包装在一起,因此,如果有人发现更好的产品,我将非常有兴趣看到它。


Yar*_*tov 3

没有办法。TensorFlow 0.11tf.gradients实现了标准的反向模式 AD,它给出了标量的导数。您需要分别tf.gradients致电y[i,j]