2016-09-18 15 views
11

ケラスAPIの単純さで強化学習モデルを構築するのは面白いです。残念ながら、私はウェイトに関して出力の勾配(エラーではない)を抽出することができません。私は、それぞれの層の重みに対するモデル出力の勾配を計算する方法上の任意のアイデアが理解されるであろう同様の機能(Saliency maps of neural networks (using Keras)ケラスを使用したモデル出力w.r.tウェイトの勾配の取得

get_output = theano.function([model.layers[0].input],model.layers[-1].output,allow_input_downcast=True) 
fx = theano.function([model.layers[0].input] ,T.jacobian(model.layers[-1].output.flatten(),model.layers[0].input), allow_input_downcast=True) 
grad = fx([trainingData]) 

を実行する次のコードを発見しました。

+0

進歩はありましたか?同様の顕著性機能を使用して次のエラーが発生しています。https://github.com/fchollet/keras/issues/1777#issuecomment-250040309 – ssierral

+0

Kerasで成功しませんでした。しかし、テンソルフローを使ってこれを行うことができました。 –

+0

https://github.com/yanpanlau/DDPG-Keras-Torcs CriticNetwork.pyは実際にネットアーキテクチャを構築するためにKerasを使用している間にグラジェントを計算するためにテンソルフローバックエンドを使用します –

答えて

14

Kerasを使用してウェイトに関するモデル出力のグラジエントを取得するには、Kerasバックエンドモジュールを使用する必要があります。

from keras.models import Sequential 
from keras.layers import Dense, Activation 
from keras import backend as k 


model = Sequential() 
model.add(Dense(12, input_dim=8, init='uniform', activation='relu')) 
model.add(Dense(8, init='uniform', activation='relu')) 
model.add(Dense(1, init='uniform', activation='sigmoid')) 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

まず、出力テンソルを求める必要がある勾配を計算するには、この単純な例を作成します。モデルの出力(私の最初の質問で尋ねたもの)に対して、単にmodel.outputを呼び出します。我々はまた、

outputTensor = model.output #Or model.layers[index].output 

.OUTPUT model.layersを呼び出すことにより、他の層のための出力の勾配[インデックス]を見つけることができますその後、我々は勾配に関してである変数を選択する必要があります。

listOfVariableTensors = model.trainable_weights 
    #or variableTensors = model.trainable_weights[0] 

ここで勾配を計算できます。それは以下のように簡単です:

gradients = k.gradients(outputTensor, listOfVariableTensors) 

は、実際に入力を与えられた勾配を実行するには、我々はTensorflowのビットを使用する必要があります。

trainingExample = np.random.random((1,8)) 
sess = tf.InteractiveSession() 
sess.run(tf.initialize_all_variables()) 
evaluated_gradients = sess.run(gradients,feed_dict={model.input:trainingExample}) 

それはそれです!

+2

私はこのコードを(バックエンドとしてtheanoを使用して)次のエラーが発生します。 "TypeError:コストはスカラーでなければなりません。"バックエンドにとらわれないアプローチで実現できるのだろうか? –

+0

Matt S、sess.runにラベルを指定せずに勾配を計算するにはどうすればよいですか? –

+0

私はグラデーションw.r.t入力を取っています。グラデーションw.r.tの損失が必要な場合は、損失関数を定義し、k.gradientsのoutputTensorをloss_fnに置き換えて、ラベルをフィードdictに渡す必要があります。 –

関連する問題