在tf.train.AdamOptimizer中手动更改learning_rate

时间:2017-10-10 13:55:26

标签: python machine-learning tensorflow neural-network

问题是,是否只更改learning_rate中的tf.train.AdamOptimizer参数实际上会导致行为的任何变化: 让我们说代码看起来像这样:

myLearnRate = 0.001
...
output = tf.someDataFlowGraph
trainLoss = tf.losses.someLoss(output)
trainStep = tf.train.AdamOptimizer(learning_rate=myLearnRate).minimize(trainLoss)
with tf.Session() as session:
    #first trainstep
    session.run(trainStep, feed_dict = {input:someData, target:someTarget})
    myLearnRate = myLearnRate * 0.1
    #second trainstep
    session.run(trainStep, feed_dict = {input:someData, target:someTarget})

现在是否会在第二个myLearnRate中应用减少的trainStep?这就是节点trainStep的创建仅评估一次:

trainStep = tf.train.AdamOptimizer(learning_rate=myLearnRate).minimize(trainLoss)

或者是否每次session.run(train_step)评估?我怎么能在Tensorflow中检查我的AdamOptimizer,是否确实更改了Learnrate。

免责声明1:我知道手动更改LearnRate是不好的做法。 免责声明2 :我知道有一个类似的问题,但它是通过输入张量learnRate来解决的,该张量在每trainStep learning_rate更新({{ 3}})。它让我倾向于假设它只能用张量作为AdamOptimizerX509v3 Extended Key Usage的输入,但我也不确定,也不能理解它背后的推理。

2 个答案:

答案 0 :(得分:8)

简短的回答是,不,你的新学习率不适用。 TF在您第一次运行时构建图形,并且在Python端更改某些内容不会转换为运行时图形中的更改。但是,您可以非常轻松地为图表提供新的学习率:

# Use a placeholder in the graph for your user-defined learning rate instead
learning_rate = tf.placeholder(tf.float32)
# ...
trainStep = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(trainLoss)
applied_rate = 0.001  # we will update this every training step
with tf.Session() as session:
    #first trainstep, feeding our applied rate to the graph
    session.run(trainStep, feed_dict = {input:someData,
                                        target:someTarget,
                                        learning_rate: applied_rate})
    applied_rate *= 0.1  # update the rate we feed to the graph
    #second trainstep
    session.run(trainStep, feed_dict = {input:someData,
                                        target:someTarget,
                                        learning_rate: applied_rate})

答案 1 :(得分:4)

是的,优化器只创建一次:

tf.train.AdamOptimizer(learning_rate=myLearnRate)

它会记住通过的学习率(事实上,如果你传递一个浮动数字,它会为它创建一个张量),而你myLearnRate的未来变化不会影响它。

是的,如果您真的想要,可以创建一个占位符并将其传递给session.run()。但是,正如你所说,它非常罕见,可能意味着你以错误的方式解决你的原始问题。