Получение градиента выходных данных модели w.r.t с использованием Keras

Мне интересно создавать модели обучения подкрепления с простотой API Keras. К сожалению, я не могу извлечь градиент вывода (а не ошибку) относительно весов. Я нашел следующий код, который выполняет аналогичную функцию (Карты полезности нейронных сетей (используя 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])

Понятно, что любые идеи о том, как вычислить градиент выходных данных модели относительно весов для каждого слоя, будут оценены.

Ответ 1

Чтобы получить градиенты вывода модели относительно весов с использованием Keras, вам необходимо использовать модуль Keras backend. Я создал этот простой пример, чтобы точно проиллюстрировать, что делать:

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

И вот оно!