Python 在tf.train.AdamOptimizer中手动更改学习速率

Python 在tf.train.AdamOptimizer中手动更改学习速率,python,machine-learning,tensorflow,neural-network,Python,Machine Learning,Tensorflow,Neural Network,问题是,仅仅更改tf.train.AdamOptimizer中的learning\u rate参数是否会导致行为发生任何变化: 假设代码如下所示: myLearnRate=0.001 ... 输出=tf.someDataFlowGraph trainLoss=tf.Loss.someLoss(输出) trainStep=tf.train.AdamOptimizer(学习率=myLearnRate)。最小化(列车损失) 使用tf.Session()作为会话: #第一步 run(trainStep,

问题是,仅仅更改
tf.train.AdamOptimizer
中的
learning\u rate
参数是否会导致行为发生任何变化: 假设代码如下所示:

myLearnRate=0.001
...
输出=tf.someDataFlowGraph
trainLoss=tf.Loss.someLoss(输出)
trainStep=tf.train.AdamOptimizer(学习率=myLearnRate)。最小化(列车损失)
使用tf.Session()作为会话:
#第一步
run(trainStep,feed_dict={input:someData,target:someTarget})
myLearnRate=myLearnRate*0.1
#第二列车步骤
run(trainStep,feed_dict={input:someData,target:someTarget})
降低的
myLearnRate
现在是否应用于第二个
trainStep
?也就是说,节点
trainStep
的创建只计算一次:

trainStep=tf.train.AdamOptimizer(学习率=myLearnRate)。最小化(列车损失)
或者是在每次
会话中对其进行评估。运行(训练步骤)
?我怎样才能在Tensorflow中检查我的
AdamOptimizer
,它是否改变了Learnrate

免责声明1:我知道手动更改LearnRate是不好的做法。
免责声明2:我知道有一个类似的问题,但通过输入一个张量作为
learnRate
,这个张量在每个
trainStep
()中都会更新,从而解决了这个问题。这让我倾向于假设它只能使用张量作为
AdamOptimizer
learning\u rate
的输入,但我对此既不确定,也无法理解其背后的原因。

简单的回答是,不,你的新学习速率没有应用。TF在您第一次运行时构建图形,在Python端更改某些内容不会转化为在运行时更改图形。但是,您可以很容易地将新的学习率输入到图表中:

#在图形中使用占位符代替用户定义的学习率
学习率=tf.placeholder(tf.float32)
# ...
trainStep=tf.train.AdamOptimizer(学习率=学习率)。最小化(列车损失)
应用率=0.001#我们将在每个培训步骤更新此值
使用tf.Session()作为会话:
#第一步,将我们的应用速率输入到图表中
run(trainStep,feed_dict={input:someData,
目标:某个目标,
学习率:应用率})
应用的_比率*=0.1#更新我们提供给图表的比率
#第二列车步骤
run(trainStep,feed_dict={input:someData,
目标:某个目标,
学习率:应用率})

是,优化器只创建一次:

tf.train.AdamOptimizer(learning_rate=myLearnRate)
它会记住通过的学习率(事实上,如果你通过一个浮点数,它会为它创建一个张量),并且你未来对
myLearnRate
的更改不会影响它


是的,如果确实需要,可以创建占位符并将其传递给
会话。run()
。但是,正如您所说,这是非常罕见的,可能意味着您以错误的方式解决了原始问题。

遗憾的是,无法将两个答案都标记为有效的解决方案,但非常感谢您的努力!我可以问一下,为什么Tensorflow在每个步骤中都计算张量,而Pyhton变量只计算一次?基本上是为了提高效率。培训过程的整个向前和向后传播步骤由运行代码时构建的高度优化的网络实现来处理。该图的生存环境与Python脚本不同(我认为它都是用C++实现的,不确定),并且必须明确地对它进行处理,以弥补这个差距。Python脚本处理批生成、更新fed参数和循环,但不做任何繁重的工作。