在tensorflow,如果一個具有兩個張量x
和y
和一個要使用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]
?
在tensorflow,如果一個具有兩個張量x
和y
和一個要使用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]
?
沒有辦法。 TensorFlow 0.11 tf.gradients
實現標準反向模式AD,它給出了標量的導數。你需要調用tf.gradients
每個y[i,j]
分別
這是在我的工作只是在等級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張量在所需的格式。這是一種非常低效的方式,因爲所有東西都需要分割並重新打包,所以如果有人發現更好,我會非常樂意看到它。