2016-11-24 31 views
0

我正在嘗試計算輸入(圖像像素)的卷積神經網絡輸出神經元的梯度。我目前使用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]是獨立產生的...

+0

檢查[this](https://github.com/tensorflow/tensorflow/issues/675),這是TF的早期設計缺陷之一。另一種方法是使用Theano。 – Kh40tiK

回答

1

首先,您可以定義漸變爲:與一些可能的調整大小

dydx = tf.gradients([output_scalars[i] for i in range(0, NUM_CLASSES)], [input_cnn])[0]) 

(我不知道,因爲我不知道input_cnnoutput_scalars的大小)。

然後,可以一起計算所有dydx:

res = session.run(dydx, feed_dict=...) 

計算dydx的單次運行應比dydx[i]單個計算慢大約1.5至2倍。

+0

感謝您的回答。但是,從文檔中我可以看到,當第一個參數是張量列表時,tf.gradients計算y的梯度相對於x的* sum *。這與所需的雅可比矩陣不同。 – hulo

+0

你說得對,我誤解了文檔。不過,如果您按照我所述評估'dydx',您應該會體驗到速度提升。 – sygi