Ответ 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})
И вот оно!