最简单的apply_gradients抛出' op'属性错误

时间:2017-10-13 12:45:52

标签: python tensorflow gradient-descent

我正在学习使用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'

提前感谢您的任何提示。

2 个答案:

答案 0 :(得分:1)

在使用sess.run()存储和评估时,tensorflow将张量转换为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))

此问题的解决方案是在开始会话之前定义所有操作。 在某些情况下,可能需要在更新权重之前对梯度进行后处理。在会话开始之前,需要定义所有此类后处理逻辑。

这是一个简单的例子:

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)

答案 1 :(得分:0)

apply_gradients的输入必须是张量而不是numpy数组。因为,它不是要在学习的每一步调用,而是在构建图形时调用一次。实际上,它“创建”了“训练步骤”,其中使用计算的梯度

更新变量

您应该使用这种代码:

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 = {...})