我发现在张量流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矩阵的对角线部分 .

这是为什么?