Как получить значения градиента с помощью keras.backend.gradients () - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь получить производную от вывода модели Кераса по входу (х) модели (не от веса).Кажется, что самый простой способ - это использовать «градиенты» из keras.backend, который возвращает тензор градиентов (https://keras.io/backend/). Я новичок в тензорном потоке и пока не знаком с ним. У меня есть тензор градиента, и я пытаюсьчтобы получить числовые значения для него для различных значений ввода (х). Но кажется, что значение градиента не зависит от ввода х (что не ожидается), или я делаю что-то не так. Любая помощь или комментарий будут оценены.

import keras
import numpy as np
import matplotlib.pyplot as plt
from keras.layers import Dense, Dropout, Activation
from keras.models import Sequential
import keras.backend as K
import tensorflow as tf
%matplotlib inline

n = 100         # sample size
x = np.linspace(0,1,n)    #input
y = 4*(x-0.5)**2          #output
dy = 8*(x-0.5)       #derivative of output wrt the input
model = Sequential()
model.add(Dense(32, input_dim=1, activation='relu'))            # 1d input
model.add(Dense(32, activation='relu'))
model.add(Dense(1))                                             # 1d output

# Minimize mse
model.compile(loss='mse', optimizer='adam', metrics=["accuracy"])
model.fit(x, y, batch_size=10, epochs=1000, verbose=0)

gradients = K.gradients(model.output, model.input)              #Gradient of output wrt the input of the model (Tensor)
print(gradients)

#value of gradient for the first x_test
x_test_1 = np.array([[0.2]])
sess = tf.Session()
sess.run(tf.global_variables_initializer())
evaluated_gradients_1 = sess.run(gradients[0], feed_dict={model.input: 
x_test_1})
print(evaluated_gradients_1)

#value of gradient for the second x_test
x_test_2 = np.array([[0.6]])
evaluated_gradients_2 = sess.run(gradients[0], feed_dict={model.input: x_test_2})
print(evaluated_gradients_2)

вывод моего кода:

[<tf.Tensor 'gradients_1/dense_7/MatMul_grad/MatMul:0' shape=(?, 1) dtype=float32>]
[[-0.21614937]]
[[-0.21614937]]

Оцененные_градиенты_1 и оцененные_градиенты_2 различны для разных прогонов, но всегда равны! Я ожидал, что они будут разными для одного прогона, потому что онипредназначены для разных значений ввода (x). Вывод сети кажется правильным. Вот график выхода сети: Вывод сети против истинного значения

1 Ответ

0 голосов
/ 12 февраля 2019

Вот ответ:

sess = tf.Session()
sess.run(tf.global_variables_initializer())

следует заменить на:

sess = K.get_session()

Первый создает новый сеанс тензорного потока и инициализирует все значения, поэтому он дает случайные значения каквывод градиентной функции.Последний вытаскивает сеанс, который использовался внутри Кераса, который имеет значения после тренировки.

...