私は入力(画像のピクセル)に関して畳み込みニューラルネットワークの出力ニューロンの勾配を計算しようとしています。私は現在、各出力ニューロンのため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として、全く最適ではないようです...
[this](https://github.com/tensorflow/tensorflow/issues/675)を確認してください。これはTFの初期の設計上の欠陥の1つです。代わりにTheanoを使用しています。 – Kh40tiK