Python 张量流中的函数极小化

Python 张量流中的函数极小化,python,tensorflow,gradient,Python,Tensorflow,Gradient,如何使用tf.gradients获得函数的梯度?当我使用GradientDescentOptimizer.minimize,tf.gradients在x^2+2的导数为2x时,下面的公式有效 我错过了什么 x = tf.Variable(1.0, trainable=True) y = x**2 + 2 grad = tf.gradients(y, x) #grad = tf.train.GradientDescentOptimizer(0.1).minimize(y) init = tf.

如何使用tf.gradients获得函数的梯度?当我使用GradientDescentOptimizer.minimize,tf.gradients在x^2+2的导数为2x时,下面的公式有效

我错过了什么

x = tf.Variable(1.0, trainable=True)
y = x**2 + 2

grad = tf.gradients(y, x)
#grad = tf.train.GradientDescentOptimizer(0.1).minimize(y)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    grad_value = sess.run(grad)
    print(grad_value)

如果我正确理解你的问题,你想找到x的值,它使x^2+2最小化

为此,需要反复调用GradientDescentOptimizer,直到x收敛到使函数最小化的值。这是因为梯度下降是一种迭代技术

此外,在tensorflow中,GradientDescentOptimizer的最小化方法会计算梯度,然后将其应用于案例中的相关变量x。因此,代码应该类似于我注释了grad变量的注释,这不是必需的,除非您想查看渐变值:

x = tf.Variable(1.0, trainable=True)
y = x**2 + 2

# grad = tf.gradients(y, x)
grad_op = tf.train.GradientDescentOptimizer(0.2).minimize(y)

init = tf.global_variables_initializer()

n_iterations = 10
with tf.Session() as sess:
    sess.run(init)
    for i in range(n_iterations):
        _, new_x = sess.run([grad_op, x])
        print('Iteration:', i,', x:', new_x)
你会得到:

Iteration: 0 , x: 1.0
Iteration: 1 , x: 0.6
Iteration: 2 , x: 0.36
Iteration: 3 , x: 0.216
Iteration: 4 , x: 0.07776
Iteration: 5 , x: 0.07776
Iteration: 6 , x: 0.046656
Iteration: 7 , x: 0.01679616
Iteration: 8 , x: 0.010077696
Iteration: 9 , x: 0.010077696
你可以看到,在收敛到真正的答案是0

如果将GradientDescentOptimizer的学习速率从0.2提高到0.4,它将更快地收敛到0

编辑

好的,根据我对这个问题的新理解,要手动实现梯度下降,你不能做x=x-alpha*gradient,因为这是python操作,它只是替换了对象x。您需要告诉tensorflow将op添加到图形中,这可以使用x.assign完成。它看起来像:

x = tf.Variable(1.0, trainable=True)
y = x**2 + 2

grad = tf.gradients(y, x)
# grad_op = tf.train.GradientDescentOptimizer(0.5).minimize(y)

update_op = x.assign(x - 0.2*grad[0])

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for i in range(10):
        new_x = sess.run([update_op, x])
        print('Iteration:', i,', x:', new_x)
我们得到了与本机GradientDescentOptimizer相同的答案:


如果我正确理解你的问题,你想找到x的值,它使x^2+2最小化

为此,需要反复调用GradientDescentOptimizer,直到x收敛到使函数最小化的值。这是因为梯度下降是一种迭代技术

此外,在tensorflow中,GradientDescentOptimizer的最小化方法会计算梯度,然后将其应用于案例中的相关变量x。因此,代码应该类似于我注释了grad变量的注释,这不是必需的,除非您想查看渐变值:

x = tf.Variable(1.0, trainable=True)
y = x**2 + 2

# grad = tf.gradients(y, x)
grad_op = tf.train.GradientDescentOptimizer(0.2).minimize(y)

init = tf.global_variables_initializer()

n_iterations = 10
with tf.Session() as sess:
    sess.run(init)
    for i in range(n_iterations):
        _, new_x = sess.run([grad_op, x])
        print('Iteration:', i,', x:', new_x)
你会得到:

Iteration: 0 , x: 1.0
Iteration: 1 , x: 0.6
Iteration: 2 , x: 0.36
Iteration: 3 , x: 0.216
Iteration: 4 , x: 0.07776
Iteration: 5 , x: 0.07776
Iteration: 6 , x: 0.046656
Iteration: 7 , x: 0.01679616
Iteration: 8 , x: 0.010077696
Iteration: 9 , x: 0.010077696
你可以看到,在收敛到真正的答案是0

如果将GradientDescentOptimizer的学习速率从0.2提高到0.4,它将更快地收敛到0

编辑

好的,根据我对这个问题的新理解,要手动实现梯度下降,你不能做x=x-alpha*gradient,因为这是python操作,它只是替换了对象x。您需要告诉tensorflow将op添加到图形中,这可以使用x.assign完成。它看起来像:

x = tf.Variable(1.0, trainable=True)
y = x**2 + 2

grad = tf.gradients(y, x)
# grad_op = tf.train.GradientDescentOptimizer(0.5).minimize(y)

update_op = x.assign(x - 0.2*grad[0])

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for i in range(10):
        new_x = sess.run([update_op, x])
        print('Iteration:', i,', x:', new_x)
我们得到了与本机GradientDescentOptimizer相同的答案:


我使用您的代码得到正确答案2。我觉得还可以。我正在尝试知道如何使用tf.gradients获得渐变,例如,我可以使用它手动下降到x^2+2=0。我使用您的代码获得正确答案2。我觉得还可以。我想知道如何用tf.gradients来获得梯度,比如我可以用它来手动下降到x^2+2=0谢谢,我正在尝试做这部分grad_op=tf.train.gradientdescentoptimizer 0.2.minimizey手动,比如x=x-gradient,这可能吗?好的,如果我这次得到的正确,您可以在上面的“编辑”下看到我的更新答案。谢谢,我正在尝试手动执行此部分grad_op=tf.train.GradientDescentOptimizer0.2.minimizey,如so x=x-gradient,这可能吗?好的,如果我这次得到的答案正确,您可以在“编辑”下看到我的更新答案。