【问题标题】:Python program,assign_add, the result might be a little confusingPython 程序,assign_add,结果可能有点混乱
【发布时间】:2018-07-02 06:06:32
【问题描述】:

   b= tf.ones([3,3],dtype=tf.float32)
   c= tf.Variable(tf.random_normal([3,3],mean=1,stddev=2,dtype=tf.float32),name="c")
   d=tf.assign_add(c,b)
   init_op= tf.global_variables_initializer()
   with tf.Session() as sess:
     sess.run(init_op)
     x,y,z= sess.run([c,b,d])
     print(x,"\n!!\n",y,"\n!!\n",z,"\n!!")
     print(sess.run(d))

第三个数组输出结果应该加上'b'和'c',但结果没有按预期打印。你能帮助我吗?非常感谢。

我希望第三个数组的输出结果应该和第四个数组一样。我对第三个数组结果感到困惑。

【问题讨论】:

  • 据我了解,您的第四个数组是 c+b - 您期望什么?
  • 第三个输出矩阵应该已经和最后一个一样了。这就是 OP 想知道的。
  • 虽然我目前还没有一个满意的答案,但有趣的是d = tf.add(c,b) 会返回正确的结果,但tf.assign(c,c+b) 会返回与上面相同的结果。不过,根据documentation 看来,它应该已经返回了更新后的值。

标签: python tensorflow tensor


【解决方案1】:

这似乎与我对assign_add 上的the docs 的理解相反,此操作实际上可能会在添加完成之前返回变量的值,而不是之后。

所以在本例中,c 是值为 [[4.723362, ...]] 的变量。在第一个 sess.run 中,您正在打印 c,它具有 pre-assign_add 值,因为更新完成后,b 看起来符合预期,d 返回 pre -assign_add 值,因为这大概就是 op 的工作方式。
在此之后,c 更新为现在包含值 [[5.723362, ...]]。现在您再次运行dassign_add 操作),它会更新c,但再次返回 pre-update 值,即[[5.723362, ...]]

总之,如果我们接受tf.assign_add 的返回值是变量before 添加,并且 运行cd 在第一次“并行”运行调用将在更新之前返回c,这是有道理的。您可以通过在最后添加 sess.run(c) 来验证这一点,它应该返回 [[6.723362,...]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多