2016-09-12 6 views
0

Ich bin Anfänger in Tensorflow und ich habe eine Frage im Zusammenhang mit dem Speichern und Wiederherstellen von Checkpoint in Convolutional neuronalen Netzen. Ich versuche CNN zu erstellen, um Gesichter zu klassifizieren. Meine Frage ist:Speichern und Wiederherstellen in CNN

Ist es möglich, wenn ich neue Klasse in meinem Dataset hinzufügen, um Teiltraining zu machen? Also möchte ich nur die neue Klasse umschulen, um das Netzwerk neu zu trainieren. Ist es möglich, die Gewichte und Verzerrungen aus dem vorherigen Training wiederherzustellen und nur die neue Klasse zu trainieren?

Ich verwende für save

saver = tf.train.Saver(tf.all_variables()) 
save = saver.save(session, "/home/owner//tensorflownew_models.ckpt") 

print("Model saved in file: %s" % save) 

Antwort

1

Ihre Frage hat mehrere Facetten. Lassen Sie uns jedes im Detail aussehen:

  • Ist es möglich, die Gewichte und Bias von Vorbildung wiederherzustellen? Ja. Sie können ein tf.train.Saver in Ihrem neuen Programm erstellen und es verwenden, um die Werte von Variablen von einem alten Prüfpunkt zu laden. Wenn Sie nur einige der Variablen aus einem alten Modell laden möchten, können Sie die Teilmenge der Variablen, die Sie wiederherstellen möchten, im -Argument für die tf.train.Saver constructor angeben. Wenn die Variablen in Ihrem neuen Modell andere Namen haben, müssen Sie möglicherweise eine Schlüsselwertzuordnung angeben, wie in this answer beschrieben.

  • Ist es möglich, dem Netzwerk eine Klasse hinzuzufügen? Ja, obwohl es ein wenig schwierig ist (und es könnte andere Wege geben, es zu tun). Ich nehme an, Sie haben einen Softmax-Klassifikator in Ihrem Netzwerk, der eine lineare Schicht enthält (Matrixmultiplikation durch eine Gewichtsmatrix der Größe m * C, gefolgt von einem Vektor der Vorspannungen der Länge C). Um eine Klasse hinzuzufügen, können Sie eine Matrix der Größe m * C+1 und einen Vektor der Länge C+1 erstellen und anschließend die ersten C Zeilen/Elemente dieser aus den vorhandenen Gewichtungen initialisieren, indem Sie tf.Variable.scatter_assign() verwenden. This question befasst sich mit dem gleichen Thema.

  • Ist ein Teiltraining möglich? Ja. Ich nehme an, du meinst "nur einige Schichten zu trainieren, während andere Ebenen konstant gehalten werden". Sie können dies als MMN suggests ausführen, indem Sie eine explizite Liste von Variablen übergeben, die beim Aufruf von tf.train.Optimizer.minimize() optimiert werden sollen. Wenn Sie z. B. eine Klasse wie oben hinzufügen, können Sie nur die Softmax-Gewichte und -Biaswerte umschulen und die Filter der Faltungsschichten konstant halten. Werfen Sie einen Blick auf die tutorial on transfer learning mit dem vorbereiteten Inception-Modell für mehr Ideen.

0

Sicher. Sie können den Parameter var_list in tf.train.Optimizer.minimize() verwenden, um die Gewichtungen zu steuern, die Sie optimieren möchten. Wenn Sie die Variablen, die Sie wiederhergestellt haben (oder derzeit trainiert haben) nicht enthalten, sollten sie nicht geändert werden.

+0

@ MMN können Sie angegeben haben mehr bitte, oder wenn es eine Anleitung darüber oder Link – mido

+0

[link] (https://www.tensorflow.org/versions/r0.10/api_docs/python/train. html) TF ist ein wenig schwierig zu gewöhnen, aber im Grunde ist Training nur Gewichte in Variablen mit einer Verlustfunktion und Backprop aktualisieren. Als Standard aktualisiert train() alle beteiligten Variablen. Wenn Sie jedoch einige Gewichtungen vortrainiert oder wiederhergestellt haben, können Sie vermeiden, dass Sie sie neu trainieren, indem Sie sie in Ihrem Trainingsschritt einfach aus dem Parameter var_list auslassen. – MMN

Verwandte Themen