我对以下代码段有一些疑问
def _optimizer(self,training_iters, global_step, opt_kwargs={}):
learning_rate = self.opt_kwargs.pop("learning_rate", 0.2)
decay_rate = self.opt_kwargs.pop("decay_rate", 0.95)
self.learning_rate_node = tf.train.exponential_decay(learning_rate=learning_rate,
global_step=global_step,
decay_steps=training_iters,
decay_rate=decay_rate,
staircase=True)
optimizer = tf.train.MomentumOptimizer(learning_rate=self.learning_rate_node,
**self.opt_kwargs).minimize(self.net.cost,
global_step=global_step)
opt_kwargs
的输入参数设置为opt_kwargs=dict(momentum=0.2)
为什么我们需要使用self.opt_kwargs.pop("learning_rate", 0.2)
分配learning_rate
。我的猜测是这种方式可以将学习率和衰减率信息注入opt_kwargs的dict结构中。但我在这里看不到真正的用法。
其次,关于tf.train.MomentumOptimizer(learning_rate=self.learning_rate_node,
**self.opt_kwargs)
,**self.opt_kwargs
看起来会将整个opt_kwargs
字典传递到MomentumOptimizer
。但是,根据tf.train.MomentumOptimizer.init(learning_rate, momentum, use_locking=False, name='Momentum', use_nesterov=False),它只需要动量值。在这里,我们传递了learning_rate
中包含的decay_rate
和self.opt_kwargs
。这是正确的方法吗?
答案 0 :(得分:0)
1。)参数pop是为了提取learning_rate
和decay_rate
值并将其提供给exponential_decay()
,MomentumOptimizer
接受它们作为单独的参数。 2.)它不干净,但可以输入带有额外条目的字典。这使它变得灵活,以便ex。您可以轻松地将/usr/lib/python2.7/site-packages
与另一个接受decay_rate等的优化器交换为参数的一部分。
答案 1 :(得分:0)
tf.train.MomentumOptimizer.init(learning_rate,momentum,use_locking = False,name ='Momentum',use_nesterov = False)这意味着您需要将动量值显式传递给函数。对于self.opt_kwargs.pop,您不需要将“learning_rate”或“decay_rate”传递给您的函数,因为它们使用0.2和0.95设置为默认值。