有史以来最简单的 apply_gradients 抛出 'op' 属性错误

Simplest ever apply_gradients throws 'op' attribute error

我正在学习使用 tensorflow 库。每次我尝试使用最简单的(我猜)可能的基于梯度的学习示例时,我都会遇到同样的错误,这让我陷入困境。

代码如下:

import tensorflow as tf

x = tf.constant(1, dtype=tf.float32, name='X')
a = tf.Variable(1, dtype=tf.float32, name= 'A')
y = tf.constant(10, dtype=tf.float32, name='Y')

ey = tf.multiply(x, a)
los = (y - ey)**2

optim = tf.train.GradientDescentOptimizer(learning_rate=0.2)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
for counter in range(100):
    grd = sess.run(optim.compute_gradients(loss=los))
    sess.run(optim.apply_gradients(grads_and_vars=grd))

在最后一行,我收到以下错误: AttributeError: 'numpy.float32' 对象没有属性 'op'。

提前感谢您的任何提示。

apply_gradients 的输入必须是张量而不是 numpy 数组。因为,它并不意味着在学习的每一步都被调用,而只是在构建图形时被调用一次。事实上,它 "creates" "training step" 其中使用计算的梯度

更新变量

你应该改用那种代码:

import tensorflow as tf

x = tf.constant(1, dtype=tf.float32, name='X')
a = tf.Variable(1, dtype=tf.float32, name= 'A')
y = tf.constant(10, dtype=tf.float32, name='Y')

ey = tf.multiply(x, a)
los = (y - ey)**2

optim = tf.train.GradientDescentOptimizer(learning_rate=0.2)
grads, vars = zip(*optimizer.compute_gradients(loss))
train_step = optim.apply_gradients(grads_and_vars=grads)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
for counter in range(100):
    grd = sess.run(train_step, feed_dict = {...})

张量流在使用 sess.run() 存储和计算时将张量转换为 numpy 数组。 GradientDescentOptimizer 的 apply_gradients 方法引发 TypeError,因为它需要张量作为输入,如 here 所述。这导致原始代码出现问题。

for counter in range(100): grd = sess.run(optim.compute_gradients(loss=los)) sess.run(optim.apply_gradients(grads_and_vars=grd))

解决这个问题的方法是在开始会话之前定义所有的操作。 在更新权重之前,可能存在需要对梯度进行 post 处理的情况。所有这些 post 处理逻辑都需要在会话开始之前定义。

这是一个简单的例子:

import tensorflow as tf

x = tf.constant(1, dtype=tf.float32, name='X')
a = tf.Variable(1, dtype=tf.float32, name= 'A')
y = tf.constant(10, dtype=tf.float32, name='Y')

ey = tf.multiply(x, a)
loss = (y - ey)**2

optim = tf.train.GradientDescentOptimizer(learning_rate=0.2)
grads = optim.compute_gradients(loss)
train_step = optim.apply_gradients(grads_and_vars=grads)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for counter in range(100):
        sess.run(train_step)