web-dev-qa-db-ja.com

Kerasを使用してモデル出力w.r.tの重みの勾配を取得する

Keras APIのシンプルさで強化学習モデルを構築することに興味があります。残念ながら、重みに関する出力の勾配(エラーではない)を抽出することはできません。同様の機能を実行する次のコードを見つけました( ニューラルネットワークの顕著性マップ(Kerasを使用)

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])

各層の重みに関するモデル出力の勾配を計算する方法についてのアイデアは歓迎されます。

28
Matt S

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を呼び出します。 model.layers [index] .outputを呼び出すことにより、他のレイヤーの出力の勾配を見つけることもできます。

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

次に、勾配に関連する変数を選択する必要があります。

  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})

以上です!

36
Matt S