2016-07-07 8 views
4

Ich versuche, Tensorflow zu lernen, und ich wollte das Tensorflow cifar10 Tutorium Framework verwenden und es auf der Oberseite von Mnist (kombiniert zwei Tutorials) trainieren.Tensorflow: global_step nicht inkrementiert; daher exponentialDecay funktioniert nicht

In cifar10.py des Zugs Methode:

cifar10.train(total_loss, global_step): 
    lr = tf.train.exponential_decay(INITIAL_LEARNING_RATE,       
            global_step,         
            100,           
            0.1,     
            staircase=True)        
    tf.scalar_summary('learning_rate', lr)          
    tf.scalar_summary('global_step', global_step) 

Die global_step initialisiert geleitet wird, und übergeben und die global_step tut Anstieg 1 in einem Schritt und die Lernrate klingt richtig kann der Quellcode bei tensorflow des cifar10 finden Anleitung.

Allerdings, wenn ich versucht, das gleiche gilt für meine überarbeitete mnist.py des Zugs Methode Code zu tun:

mnist.training(loss, batch_size, global_step): 
    # Decay the learning rate exponentially based on the number of steps.   
    lr = tf.train.exponential_decay(0.1,           
            global_step,         
            100,            
            0.1,            
            staircase=True)         
    tf.scalar_summary('learning_rate1', lr)           
    tf.scalar_summary('global_step1', global_step)         

    # Create the gradient descent optimizer with the given learning rate.    
    optimizer = tf.train.GradientDescentOptimizer(lr)         
    # Create a variable to track the global step.          
    global_step = tf.Variable(0, name='global_step', trainable=False)     
    # Use the optimizer to apply the gradients that minimize the loss     
    # (and also increment the global step counter) as a single training step.  
    train_op = optimizer.minimize(loss, global_step=global_step)     
    tf.scalar_summary('global_step2', global_step)         
    tf.scalar_summary('learning_rate2', lr)  
    return train_op  

Der globale Schritt (beide in cifar10 und meine mnist Datei) initialisiert wird, wie:

with tf.Graph().as_default(): 
    global_step = tf.Variable(0, trainable=False) 
    ... 
    # Build a Graph that trains the model with one batch of examples and   
    # updates the model parameters.             
    train_op = mnist10.training(loss, batch_size=100,     
           global_step=global_step) 

Hier notiere ich die scalar_summary von globalen Schritt und Lernrate zweimal: learning_rate1 und learning_rate2 sind beide gleich und konstant bei 0,1 (anfängliche Lernrate). global_step1 ist auch konstant bei 0 über 2000 Schritte. global_step2 steigt linear um 1 pro Schritt. https://bitbucket.org/jackywang529/tesorflow-sandbox/src

Es ist ziemlich verwirrend für mich, warum dies der Fall ist (im Fall meiner global_step sein könnte, da ich alles symbolisch eingerichtet wurde gedacht, und so einmal:

Je detaillierte Code-Struktur finden Sie unter das Programm startet den globalen Schritt sollte inkrementiert werden, egal wo ich die Zusammenfassung schreibe) und ich denke, das ist der Grund, warum meine Lernrate konstant ist. Natürlich hätte ich einen simplen Fehler gemacht und wäre froh, dass mir geholfen/erklärt wird.

global_steps written before and after the minimize function is called

+0

Die cifar10 Tutorial ist bei https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/cifar10/cifar10 gefunden. py. Ich entschuldige mich, dass ich den Link wegen meines niedrigen Ranges auf der Website nicht hinzufügen konnte. – Banana

Antwort

5

Sie passieren ein Argument global_step zu mnist.training genannt, und auch die Schaffung eines variablen global_step in mnist.training genannt. Die zum Verfolgen der exponential_decay verwendete Variable ist die Variable, die übergeben wird, aber diejenige, die tatsächlich inkrementiert wird (durch Übergeben an optimizer.minimize), ist die neu erstellte Variable. Entfernen Sie einfach sollte die folgende Anweisung aus mnist.training und die Dinge funktionieren:

global_step = tf.Variable(0, name='global_step', trainable=False) 
+0

Ich entschuldige mich für meine mangelnde Aufmerksamkeit, aber vielen Dank !!! Vom Rahmen zu verwirrt. – Banana

Verwandte Themen