我正在嘗試計算輸入(圖像像素)的卷積神經網絡輸出神經元的梯度。我目前使用tf.gradients函數用於每個輸出神經元計算這些順序:張量流中幾個梯度的計算
input_cnn = session.graph.get_tensor_by_name("input:0")
output_cnn = session.graph.get_tensor_by_name("softmax2_pre_activation:0")
output_scalars = [tf.slice(output_cnn, [0, i], [1, 1]) for i in range(0, NUM_CLASSES)]
dydx = [tf.gradients(output_scalars[i], [input_cnn])[0] for i in range(0, NUM_CLASSES)]
最後一行的執行然而花費很多時間(半小時上的標準GPU爲NUM_CLASSES = 1000)。此外,在Python會話中首次計算梯度dydx [i]需要花費大量的時間。在同一個會話dydx [我]後來電話是不過速度非常快:
>> session.run(dydx[123], feed_dict={input_cnn: im1}) # Very slow
>> session.run(dydx[123], feed_dict={input_cnn: im2}) # Fast
有沒有計算這些梯度(即雅可比矩陣)更有效的方法?上述做法似乎並不爲最佳可言,因爲所有dydx [I]是獨立產生的...
檢查[this](https://github.com/tensorflow/tensorflow/issues/675),這是TF的早期設計缺陷之一。另一種方法是使用Theano。 – Kh40tiK