我正在学习使用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'
提前感谢您的任何提示。
答案 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 = {...})