有关定义和调用train.momentumoptimizer的问题

时间:2016-11-05 23:11:44

标签: tensorflow

我对以下代码段有一些疑问

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_rateself.opt_kwargs。这是正确的方法吗?

2 个答案:

答案 0 :(得分:0)

1。)参数pop是为了提取learning_ratedecay_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设置为默认值。