2016-11-05 3 views
0

Ich habe einige Fragen in Bezug auf die folgende CodesegmentFragen zur Definition und Aufruf train.momentumoptimizer

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) 

Der Eingang pararameter von opt_kwargs ist Setup als opt_kwargs=dict(momentum=0.2)

Warum brauchen wir self.opt_kwargs.pop("learning_rate", 0.2) verwenden learning_rate zuzuweisen. Meine Vermutung ist, dass auf diese Weise die Informationen zu Lerngeschwindigkeit und Abklingrate in die dict-Struktur von opt_kwargs injiziert werden können. Aber ich sehe den wirklichen Gebrauch hier nicht.

Zweitens in Bezug auf tf.train.MomentumOptimizer(learning_rate=self.learning_rate_node, **self.opt_kwargs), sieht aus wie **self.opt_kwargs wird die ganzen opt_kwargs dict in die MomentumOptimizer passieren. Nach tf.train.MomentumOptimizer.init(learning_rate, momentum, use_locking=False, name='Momentum', use_nesterov=False) benötigt es jedoch nur den Impulswert. Hier gehen wir sowohl learning_rate als auch decay_rate vorbei, die in self.opt_kwargs enthalten sind. Ist das ein richtiger Weg?

Antwort

0

1.) Das Argument Pop ist so, dass Sie die learning_rate und decay_rate Wert extrahieren und es an exponential_decay() füttern, die sie als einzelnes Argument akzeptiert. 2.) Es ist nicht sauber, aber es ist in Ordnung, ein Diktat mit zusätzlichen Einträgen einzugeben. Dies macht es flexibel, so dass z. Sie können einfach MomentumOptimizer mit einem anderen Optimierer austauschen, der als Teil der Argumente die Decay_rate usw. akzeptiert.

0

tf.train.MomentumOptimizer.init (learning_rate, Impuls, use_locking = False, name = 'Momentum', use_nesterov = False) Das heißt, Sie müssen explizit einen Impulswert an die Funktion übergeben. Für self.opt_kwargs.pop müssen Sie keine "learning_rate" oder "decay_rate" an Ihre Funktion übergeben, da sie standardmäßig mit 0,2 und 0,95 eingestellt sind.