tf.gradients(model.output, model.input) 每次我 运行 计算不同的值
tf.gradients(model.output, model.input) computes a different value each time I run it
我正在尝试计算输出层相对于输入层的梯度。我的神经网络相对较小(输入层由 9 个激活单元组成,输出层由 1 个激活单元组成)并且训练进行得很好,因为测试提供了非常好的准确性。我使用 Keras 制作了 NN 模型。
为了解决我的问题,我需要计算输出相对于输入的梯度。也就是说,我需要获得维度为 [1x9] 的雅可比行列式。 tensorflow 中的渐变函数应该可以提供我需要的一切,但是当我 运行 下面的代码时,我每次都获得不同的解决方案。
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 ]]
使用有限差分,evaluated_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})
大概您的网络已设置为将权重初始化为随机值。当您 运行 sess.run(tf.initialize_all_variables()) 时,您正在将变量初始化为新的随机值。因此,您在每个 运行 中得到不同的 output_v 值,因此得到不同的梯度。如果你想使用你之前训练过的模型,你应该用恢复命令替换 initialize_all_variables() 的初始化。我不熟悉在 Keras 中这是如何完成的,因为我通常直接使用 tensorflow,但我会尝试 this.
另请注意 initialize_all_variables is deprecated,您应该改用 global_variables_initializer。
我正在尝试计算输出层相对于输入层的梯度。我的神经网络相对较小(输入层由 9 个激活单元组成,输出层由 1 个激活单元组成)并且训练进行得很好,因为测试提供了非常好的准确性。我使用 Keras 制作了 NN 模型。
为了解决我的问题,我需要计算输出相对于输入的梯度。也就是说,我需要获得维度为 [1x9] 的雅可比行列式。 tensorflow 中的渐变函数应该可以提供我需要的一切,但是当我 运行 下面的代码时,我每次都获得不同的解决方案。
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 ]]
使用有限差分,evaluated_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})
大概您的网络已设置为将权重初始化为随机值。当您 运行 sess.run(tf.initialize_all_variables()) 时,您正在将变量初始化为新的随机值。因此,您在每个 运行 中得到不同的 output_v 值,因此得到不同的梯度。如果你想使用你之前训练过的模型,你应该用恢复命令替换 initialize_all_variables() 的初始化。我不熟悉在 Keras 中这是如何完成的,因为我通常直接使用 tensorflow,但我会尝试 this.
另请注意 initialize_all_variables is deprecated,您应该改用 global_variables_initializer。