我之前读到sgd更好地概括,但adam在训练的早期阶段快速收敛。 所以,我想在一些步骤之后更改我的优化器。但是像下面的代码提出了preconditionederror。如果有人知道如何在培训期间更改优化器?
for i in range(config.train_steps):
_, l, s = sess.run([train_op, loss, summary])
if i % 100 == 0:
saver.save(sess, os.path.join(args.model_dir,
'model.ckpt'))
writer.add_summary(s, i)
print('loss: ', l)
if i == 1000:
train_op = tf.train.GradientDescentOptimizer(learning_rate)
coord.request_stop()
coord.join(threads)
答案 0 :(得分:2)
您无法更改优化器,但可以创建两个优化器,首先使用一个优化器,然后使用另一个优化器。这基本上就是你在代码中所做的。问题是优化器经常有一些内部变量关联,你需要初始化它们,就像任何其他一样,然后才能使用它。此外,您的代码无论如何都不完全正确,因为您尚未调用minimize
操作。尝试这样的事情:
early_train_op = tf.train.AdamOptimizer().minimize(loss)
late_train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
# Call this after everything, including optimizers, has been created
init_op = tf.initialize_global_variables()
with tf.Session() as sess:
sess.run(init_op) # Now everything is correctly initialized
for i in range(config.train_steps):
if i < 1000:
current_train_op = early_train_op
else:
current_train_op = late_train_op
_, l, s = sess.run([current_train_op, loss, summary])
if i % 100 == 0:
saver.save(sess, os.path.join(args.model_dir,
'model.ckpt'))
writer.add_summary(s, i)
print('loss: ', l)
coord.request_stop()
coord.join(threads)