我在张量流r1.2梯度和粗糙函数的评估中发现了一个问题。 特别是我理所当然地认为梯度的评估是在定义变量的值的数值上完成的,探测占位符函数的响应。
然而现在我正在尝试在模型训练之前和之后评估粗麻布函数(因此是渐变),并且我总是得到相同的结果(可能根据喂食占位符)。
我使用以下功能
def eval_Consts(sess):
a_v_fin, a_s_fin, a_C_fin, a_a_fin, a_p_fin, loss_fin = sess.run([a_v, a_s, a_C, a_a, a_p, loss], {A:A_train, Z:Z_train, y:BE_train}) #assignes values to parking variables
print a_v_fin, loss_fin
hess = tf.hessians( loss , [a_v, a_s, a_C, a_a, a_p] )
grad = tf.gradients(loss, a_v)
dGra0= tf.gradients(grad[0], a_v)
print '\n', sess.run(a_v, feed_dict={A:A_train, Z:Z_train,
y:BE_train })
print '\n', sess.run(hess, feed_dict={A:A_train, Z:Z_train,
y:BE_train })
print '\n', sess.run(dGra0, feed_dict={A:A_train, Z:Z_train,
y:BE_train })
评估输出并在训练之前和之后计算一次梯度。请注意,a_v和loss的计算和打印是在函数内完成的。
在输出a_v = 20.20000076和损失函数中,损失= 1.92866e + 09训练前。 在训练之后a_v = 16.8217并且损失= 148206.0。
然而,如上所述评估a_v的二阶导数在两种情况下均相同:1.52536784e + 08。
此外,打印Hessian的结果如下:
[array([[ 1.52536784e+08]], dtype=float32), array([[ 4804347.]], dtype=float32), array([[ 4.80967168e+09]], dtype=float32), array([[ 226923.421875]], dtype=float32), array([[ 41.58702087]], dtype=float32)]
换句话说,根本不是Hessian(它是所有可能的二阶导数的矩阵,包括交叉导数),而只是Hessian矩阵的对角线部分。
为什么?