Tensorflow 为什么AdamOptimizer无法找到最小化x*x的最佳值?

Tensorflow 为什么AdamOptimizer无法找到最小化x*x的最佳值?,tensorflow,Tensorflow,我试图用adagrad Optimizer最小化x*x。我希望得到x=0作为结果,但我得到了值x,接近初始值 import tensorflow as tf x=tf.Variable(-2.) sq=x*x o = tf.train.AdamOptimizer(1e-1).minimize(sq) with tf.Session() as sess: init = tf.global_variables_initializer() sess.run([init]) se

我试图用adagrad Optimizer最小化x*x。我希望得到x=0作为结果,但我得到了值x,接近初始值

import tensorflow as tf
x=tf.Variable(-2.)
sq=x*x
o = tf.train.AdamOptimizer(1e-1).minimize(sq)
with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run([init])
    sess.run([o])
    r=sess.run([x])
    print("done",r)
结果得到-1.9,而不是预期的0

我是否正确地理解了-2是这里的初始值,还是其他值?AdamOptimiser是否只执行一个步骤,或者是否可以启动它进行持续优化?如何得到x=0作为结果?

sess.run([0])
只运行一个步骤。要执行完整的优化,您需要运行许多步骤,这可以通过在循环中重复单个步骤来完成

因此,您可以将sess.run([o])替换为:

for i in range(1000):
   sess.run([o])
这将产生结果
3.4735016e-23
,非常接近预期的
0

根据我的经验,人们通常会像我演示的那样运行许多优化步骤,使用
for
循环。如果您有兴趣将循环实现为TensorFlow操作,然后只运行一次此操作,则可以这样做,但不建议这样做。原因是:(a)我认为这样做不会使代码变得“优雅”(b)如果要运行1000个步骤,需要向图形中添加1000组操作,并将它们分组为一组。相比之下,这只需要一组操作


您可以查看更多相关信息。

sess.run([o])
只运行一个步骤。你应该把这一行写进一个循环中,比如说,100次迭代。请把它作为一个答案,这样我就可以接受它了。也可能有一些标准的TF方法来避免为范围(1000)内的i编写代码?