有史以来最简单的 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)
我正在学习使用 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)