问题在于,仅仅更改tf.train.AdamOptimizer
中的learning_rate
参数是否真的会导致行为上的变化:假设代码如下所示:
myLearnRate = 0.001...output = tf.someDataFlowGraphtrainLoss = tf.losses.someLoss(output)trainStep = tf.train.AdamOptimizer(learning_rate=myLearnRate).minimize(trainLoss)with tf.Session() as session: #第一个训练步骤 session.run(trainStep, feed_dict = {input:someData, target:someTarget}) myLearnRate = myLearnRate * 0.1 #第二个训练步骤 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
中检查学习率是否发生了变化?
免责声明1:我知道手动更改学习率是不好的做法。免责声明2:我知道有一个类似的提问,但它是通过将一个张量作为learnRate
输入解决的,这个张量在每次trainStep
中都会更新(这里)。这让我倾向于认为,只有当AdamOptimizer
中的learning_rate
输入为张量时才会起作用,但我对此并不确定,也无法理解背后的原因。
回答:
简短的回答是,不,你的新学习率没有被应用。TF在首次运行时构建图表,在运行时更改Python端的内容不会反映到图表中。然而,你可以很容易地将新的学习率输入到你的图表中:
# 在图表中使用占位符来表示用户定义的学习率learning_rate = tf.placeholder(tf.float32)# ...trainStep = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(trainLoss)applied_rate = 0.001 # 我们将在每个训练步骤更新这个值with tf.Session() as session: #第一个训练步骤,将我们应用的速率输入到图表中 session.run(trainStep, feed_dict = {input: someData, target: someTarget, learning_rate: applied_rate}) applied_rate *= 0.1 # 更新我们输入到图表的速率 #第二个训练步骤 session.run(trainStep, feed_dict = {input: someData, target: someTarget, learning_rate: applied_rate})