在我的问题中,我需要在每个训练步骤中使用数据中的一个示例来运行GD。众所周知,session.run()存在开销,因此训练模型的时间太长。 为了避免开销,我尝试使用while_loop并在一次run()调用中对所有数据进行训练。但是这种方法不起作用,train_op甚至没有执行。下面是我正在做的简单示例:
data = [k*1. for k in range(10)]
tf.reset_default_graph()
i = tf.Variable(0, name='loop_i')
q_x = tf.FIFOQueue(100000, tf.float32)
q_y = tf.FIFOQueue(100000, tf.float32)
x = q_x.dequeue()
y = q_y.dequeue()
w = tf.Variable(0.)
b = tf.Variable(0.)
loss = (tf.add(tf.mul(x, w), b) - y)**2
gs = tf.Variable(0)
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(loss, global_step=gs)
s = tf.Session()
s.run(tf.initialize_all_variables())
def cond(i):
return i < 10
def body(i):
return tf.tuple([tf.add(i, 1)], control_inputs=[train_op])
loop = tf.while_loop(cond, body, [i])
for _ in range(1):
s.run(q_x.enqueue_many((data, )))
s.run(q_y.enqueue_many((data, )))
s.run(loop)
s.close()
我做错了什么?还是有其他解决这个开销过高问题的方法吗?
谢谢!
tf.while_loop()
实现中的各种错误。 - mrrytf.Variable
(例如优化器插槽),它的行为与在循环外部创建变量并在内部引用它相同)。如果你在循环内部或之前构建优化器,它的工作方式是相同的,我已经更新了答案,在循环之前构建它,这看起来更符合直觉。 - mrry