2016-12-31 4 views
9

Ich versuche, die letzte Schicht der Einführung-resnet-v2 umschulen. Hier ist, was ich kam mit:Umschulung der letzten Schicht von Inception-ResNet-v2

  1. Get Namen von Variablen in der letzten Schicht
  2. eine train_op Erstellen Sie nur diese Variablen WRT Verlust
  3. Wiederherstellen des gesamten Graphen mit Ausnahme der letzten Schicht zu minimieren, während nur die letzte Initialisierung Ebene zufällig.

Und ich realisiert, dass Sie wie folgt vor:

with slim.arg_scope(arg_scope): 
    logits = model(images_ph, is_training=True, reuse=None) 
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels_ph)) 
accuracy = tf.contrib.metrics.accuracy(tf.argmax(logits, 1), labels_ph) 

train_list = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, 'InceptionResnetV2/Logits') 
optimizer = tf.train.AdamOptimizer(learning_rate=FLAGS.learning_rate) 

train_op = optimizer.minimize(loss, var_list=train_list) 

# restore all variables whose names doesn't contain 'logits' 
restore_list = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='^((?!Logits).)*$') 

saver = tf.train.Saver(restore_list, write_version=tf.train.SaverDef.V2) 

with tf.Session() as session: 


    init_op = tf.group(tf.local_variables_initializer(), tf.global_variables_initializer()) 

    session.run(init_op) 
    saver.restore(session, '../models/inception_resnet_v2_2016_08_30.ckpt') 


# followed by code for running train_op 

Dies nicht zu funktionieren scheint (Trainingsausfall, Fehler verbessern nicht viel von der ursprünglichen Werte). Gibt es eine bessere/elegante Möglichkeit, dies zu tun? Es wäre gut für mich zu lernen, wenn Sie mir auch sagen könnten, was hier schief läuft.

+0

Ich bin nicht sicher, wie Sie die Variablen nennen, aber Sie können überprüfen, ob train_list von 'Druck train_list' korrekt ist. Vielleicht könnte [this] (http://stackoverflow.com/questions/34945554/how-to-set-layer-wise-learning-rate-in-tensorflow) Ihnen helfen, was Sie vielleicht schon gesehen haben. – Seven

Antwort

1

Es gibt mehrere Dinge:

  • wie ist die Lernrate? ein zu hoher Wert kann sich mit allem vermischen (wahrscheinlich nicht der Grund)
  • versuchen, stochastischen Gradienten-Abstieg zu verwenden, sollten Sie weniger Probleme haben
  • ist der Bereich richtig eingestellt? wenn Sie verwenden L2 Regularisierung und Batch-Normalisierung der Gradienten nicht könnten Sie sehr bald in ein lokales Minimum fallen und das Netzwerk ist nicht in der Lage

    from nets import inception_resnet_v2 as net 
    with net.inception_resnet_v2_arg_scope(): 
        logits, end_points = net.inception_resnet_v2(images_ph, num_classes=num_classes, 
                   is_training=True) 
    
  • zu lernen, sollten Sie die Regularisierung Variablen auf den Verlust hinzufügen (oder zumin dest die, die der letzten Schicht):

    regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) 
    all_losses = [loss] + regularization_losses 
    total_loss = tf.add_n(all_losses, name='total_loss') 
    
  • Training nur die volle verbunden Schicht möglicherweise keine gute Idee sein, würde ich all das Netzwerk als die Merkmale trainieren Sie für Ihre Klasse müssen nicht notwendigerweise definiert in die letzte Schicht, aber wenige Schichten vorher und du musst sie ändern.

  • überprüfen die train_op nach dem Verlust läuft:

    with ops.name_scope('train_op'): 
        train_op = control_flow_ops.with_dependencies([train_op], total_loss) 
    
Verwandte Themen