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})
それはそれです!
進歩はありましたか?同様の顕著性機能を使用して次のエラーが発生しています。https://github.com/fchollet/keras/issues/1777#issuecomment-250040309 – ssierral
Kerasで成功しませんでした。しかし、テンソルフローを使ってこれを行うことができました。 –
https://github.com/yanpanlau/DDPG-Keras-Torcs CriticNetwork.pyは実際にネットアーキテクチャを構築するためにKerasを使用している間にグラジェントを計算するためにテンソルフローバックエンドを使用します –