问题是,是否只更改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}})。它让我倾向于假设它只能用张量作为AdamOptimizer
中X509v3 Extended Key Usage
的输入,但我也不确定,也不能理解它背后的推理。
答案 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()
。但是,正如你所说,它非常罕见,可能意味着你以错误的方式解决你的原始问题。