如何在训练期间更改tensorflow优化器

时间:2018-01-15 08:57:39

标签: tensorflow

我之前读到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)

1 个答案:

答案 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)