【发布时间】:2019-02-07 04:34:08
【问题描述】:
我正在尝试获取 Keras 模型的输出相对于模型输入 (x)(而不是权重)的导数。似乎最简单的方法是使用 keras.backend 中的“梯度”,它返回一个梯度张量 (https://keras.io/backend/)。我是 tensorflow 的新手,还不太适应。我得到了梯度张量,并试图为它获取不同输入值(x)的数值。但似乎梯度值与输入 x 无关(预计不会如此),或者我做错了什么。任何帮助或评论将不胜感激。
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]]
evaluate_gradients_1 和 evaluate_gradients_2 对于不同的运行是不同的,但总是相等的!我希望它们对于相同的运行会有所不同,因为它们适用于不同的输入 (x) 值。 网络的输出似乎是正确的。这是网络输出的图:Output of the network vs. true value
【问题讨论】:
-
你检查你的网络的输出了吗?它学得好吗?
-
是的,输出似乎是正确的。我已将其添加到帖子中,谢谢。
-
原因可能是,您正在创建一个新的 tensorflow 会话,并使用新的全局变量初始化。你能在全局变量初始化器之后检查你的模型输出吗?
-
是的,它提供与创建新 tf 会话之前相同的输出。如果您认为可能是这种情况,我如何使用与 keras 内部相同的 tf 会话来运行输入 (x) 的梯度值?我试过“K.run”而不是“sess.run”,它返回错误。
-
尝试 import keras.backend as K 然后 K.eval(gradient)。
标签: python tensorflow keras neural-network gradient