每次我运行tf.gradients(model.output,model.input)都会计算一个不同的值

时间:2019-01-16 11:21:58

标签: tensorflow keras gradient

我正在尝试计算输出层相对于输入层的梯度。我的神经网络相对较小(输入层由9个激活单元组成,输出层为1个),由于测试提供了非常好的准确性,因此训练进行得很好。我使用Keras制作了NN模型。

为了解决我的问题,我需要计算输出相对于输入的梯度。这是,我需要获得尺寸为[1x9]的雅可比行列式。张量流中的渐变函数应该可以为我提供所需的一切,但是当我运行下面的代码时,每次都会获得不同的解决方案。

output_v = model.output
input_v = model.input
gradients = tf.gradients(output_v, input_v)

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

print(sess.run(model.input,feed_dict={model.input:x_test_N[0:1,:]}))
evaluated_gradients = sess.run(gradients,feed_dict{model.input:x_test_N[0:1,:]})
print(evaluated_gradients)

sess.close()

每当我运行它时,第一个打印命令都会显示该值(以确保未修改输入值):

[[-1.4306372 -0.1272892  0.7145787  1.338818  -1.2957293 -0.5402862-0.7771702 -0.5787912 -0.9157122]]

但是第二张照片显示了不同的照片:

[[ 0.00175761, -0.0490326 , -0.05413761,  0.09952173,  0.06112418, -0.04772799,  0.06557006, -0.02473242,  0.05542536]]

[[-0.00416433,  0.08235116, -0.00930298,  0.04440641,  0.03752216, 0.06378302,  0.03508484, -0.01903783, -0.0538374 ]]

使用有限差异,valuated_gradients [0,0] = 0.03565103,它与先前打印的任何第一个值都不接近。

感谢您的时间!

阿尔贝托


通过在训练模型之前创建特定的会话来解决:

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

history = model.fit(x_train_N, y_train_N, epochs=n_epochs,
                    validation_split=split, verbose=1, batch_size=n_batch_size,
                    shuffle='true', callbacks=[early_stop, tensorboard])

在tf.session仍然打开的情况下,在训练后评估梯度:

evaluated_gradients = sess.run(K.gradients(model.output, model.input), feed_dict={model.input: x_test_N})

1 个答案:

答案 0 :(得分:2)

大概是您的网络已设置为将权重初始化为随机值。运行sess.run(tf.initialize_all_variables())时,您正在将变量初始化为新的随机值。因此,您在每次运行中都会获得不同的output_v值,因此会有不同的渐变。如果要使用之前训练的模型,则应使用restore命令将初始化替换为initialize_all_variables()。我不熟悉在Keras中如何完成此操作,因为我通常直接使用tensorflow,但我会尝试this

还请注意,initialize_all_variables is deprecated和您应该改用global_variables_initializer。