2016-10-12 28 views
3

在tensorflow,如果一個具有兩個張量xy和一個要使用tf.gradients(y,x)以具有y相對於梯度以x。那麼什麼人真正得到的是:Tensorflow梯度:沒有自動隱總和

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

有超過y的指數之和,是有辦法避免這種隱含的總和?要獲得整個梯度張量gradient[i,j,n,m]

回答

3

沒有辦法。 TensorFlow 0.11 tf.gradients實現標準反向模式AD,它給出了標量的導數。你需要調用tf.gradients每個y[i,j]分別

4

這是在我的工作只是在等級2張量的情況下,以各組分的衍生物(如也@Yaroslav mentionned),然後包裝他們都再次攜手(矩陣):

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張量在所需的格式。這是一種非常低效的方式,因爲所有東西都需要分割並重新打包,所以如果有人發現更好,我會非常樂意看到它。