【问题标题】:how can I change tensorflow optimizer during training如何在训练期间更改 tensorflow 优化器
【发布时间】:2018-01-15 18:51:03
【问题描述】:

我之前读过 sgd 的泛化效果更好,但 adam 在训练的早期阶段收敛速度很快。 所以,我想在一些步骤后改变我的优化器。但是像下面这样的代码引发了预处理错误。如果有人知道如何在训练期间更改优化器?

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)

【问题讨论】:

标签: tensorflow


【解决方案1】:

您不能这样更改优化器,但您可以创建两个优化器并使用第一个和第二个。这基本上就是您在代码中所做的。问题是优化器经常有一些相关的内部变量,您需要像其他任何变量一样初始化这些变量,然后才能使用它。此外,无论如何,您的代码并不完全正确,因为您还没有调用 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)

【讨论】:

  • 我会试试的。事实上,我使用 tf.contrib.layers.optimize_loss 来获得火车运行。我只是想展示一下我是如何在训练期间尝试改变操作的。不管怎样,都是我的错。谢谢!!
猜你喜欢
  • 2021-04-10
  • 2021-04-06
  • 2021-04-25
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 2016-02-23
相关资源
最近更新 更多