2016-11-24 16 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)] 

最後の行の実行がしかし多くの時間 NUM_CLASSESするための標準的なGPU上の(時間半かかります= 1000)。さらに、Pythonセッションで最初に勾配dydx [i]を計算するには、かなりの時間がかかります。同じセッションでdydx [i]ののその後の呼び出しは非常に高速しかし、次のとおりです。

>> session.run(dydx[123], feed_dict={input_cnn: im1}) # Very slow 
>> session.run(dydx[123], feed_dict={input_cnn: im2}) # Fast 

これらの勾配(すなわち、ヤコビ行列)を計算するためのより効率的な方法はありますか? (おそらくいくつかのサイズ変更と

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

:上記のアプローチ[i]が独立して生成されたすべてのdydxとして、全く最適ではないようです...

+0

[this](https://github.com/tensorflow/tensorflow/issues/675)を確認してください。これはTFの初期の設計上の欠陥の1つです。代わりにTheanoを使用しています。 – Kh40tiK

答えて

1

まず、あなたはあなたのようグラデーションを定義することができます私はinput_cnnoutput_scalarsのサイズを知らないので、私は知らない。

その後、あなたは一緒にすべてのdydxを計算することができます。

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

dydxを計算する単一の実行はdydx[i]の1つの計算よりも約1.5〜2倍遅くする必要があります。

+0

あなたの答えをありがとう。しかし、最初の引数がテンソルのリストであるとき、tf.gradientsがxに関するysの勾配の* sum *を計算することをドキュメントから見ることができます。これは必要なヤコビ行列とは異なります。 – hulo

+0

あなたが正しいです、私はドキュメントを誤解しました。それでも、もし私が記述したように 'dydx'を評価するなら、あなたはスピードブーストを経験するべきです。 – sygi

関連する問題