keras / tensorflow模型:梯度w.r.t.输入为所有输入数据返回相同(错误?)的值

时间:2018-08-09 10:29:21

标签: python tensorflow neural-network keras gradient

鉴于训练有素的keras模型,我试图计算输出相对于输入的梯度。

此示例尝试使函数y=x^2与由4个relu激活层组成的keras模型相适应,并计算模型输出相对于输入的梯度。

from keras.models import Sequential
from keras.layers import Dense
from keras import backend as k
from sklearn.model_selection import train_test_split
import numpy as np
import tensorflow as tf

# random data
x = np.random.random((1000, 1))
y = x**2

# split train/val
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=0.15)

# model
model = Sequential()
# 1d input
model.add(Dense(10, input_shape=(1, ), activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(10, activation='relu'))
# 1d output
model.add(Dense(1))

## compile and fit
model.compile(loss='mse', optimizer='rmsprop', metrics=['mae'])
model.fit(x_train, y_train, batch_size=256, epochs=100, validation_data=(x_val, y_val), shuffle=True)

## compute derivative (gradient)
session = tf.Session()
session.run(tf.global_variables_initializer())
y_val_d_evaluated = session.run(tf.gradients(model.output, model.input), feed_dict={model.input: x_val})

print(y_val_d_evaluated)

x_val01之间的150个随机数的向量。

我的期望是y_val_d_evaluated(渐变)应该是:

A。 array包含150个不同的数字(因为x_val包含150个不同的数字);

B。值应接近2*x_valx^2的导数)。

相反,每次我运行此示例时,y_val_d_evaluated包含150个相等的值(例如[0.0150494][-0.0150494][0.0150494][-0.0150494],... ),而且该值与2x完全不同,并且每次我运行示例时该值都会更改。

任何人都有一些建议可以帮助我理解为什么这段代码没有给出预期的渐变结果?

1 个答案:

答案 0 :(得分:2)

好,我发现了问题,如下几行:

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

创建一个新的tf会话,该会话将覆盖模型参数,因此在执行了这些指令之后,该模型就是具有随机初始参数的模型。这就解释了为什么每次运行的值都不同。

从keras环境中获取tensorflow会话的解决方案是使用:

session = k.get_session()

通过这种简单的更改,结果如我所愿。