2015-08-13 5 views
14

Ich trainiere Caffe Referenzmodell für die Klassifizierung von Bildern. Meine Arbeit erfordert, dass ich den Trainingsprozess überwache, indem ich ein Diagramm der Genauigkeit des Modells nach jeweils 1000 Iterationen des gesamten Trainingssatzes und des Validierungssets mit 100K bzw. 50K Bildern zeichne. Im Moment nehme ich den naiven Ansatz, mache Schnappschüsse nach jeweils 1000 Iterationen, führe den C++ - Klassifizierungscode aus, der das rohe JPEG-Bild liest und an das Netz weiterleitet und die vorhergesagten Labels ausgibt. Dies kostet jedoch zu viel Zeit auf meiner Maschine (mit einer Geforce GTX 560 Ti).Monitor Training/Validierungsprozess in Caffe

Gibt es einen schnelleren Weg, um die Genauigkeitsgraphik der Snapshot-Modelle sowohl in Trainings- als auch in Validierungs-Sets zu erstellen?

Ich dachte über die Verwendung von LMDB-Format anstelle von rohen Bildern. Ich finde jedoch keine Dokumentation/Code über die Klassifizierung in C++ im LMDB-Format.

+2

Warum bist du nicht mit [DIGITS] (https://developer.nvidia.com/digits), um Sie im Trainingsprozess zu unterstützen? Es hat eine eingebaute Überwachungsfunktionen. – Shai

Antwort

19

1) Sie können die NVIDIA-DIGITS App verwenden, um Ihre Netzwerke zu überwachen. Sie bieten eine grafische Benutzeroberfläche mit Dataset-Vorbereitung, Modellauswahl und Lernkurvenvisualisierung. Mehr, sie verwenden eine Caffe-Distribution, die multi-GPU training erlaubt.

2) Oder Sie können einfach den Log-Parser in Caffe verwenden.

/pathtocaffe/build/tools/caffe train --solver=solver.prototxt 2>&1 | tee lenet_train.log 

Damit können Sie das Zugprotokoll in "lenet_train.log" speichern. Dann mit:

analysieren Sie Ihr Zug-Protokoll in zwei csv-Dateien, die Zug und Testverlust enthalten. Sie können sie dann zeichnen Sie die folgende Python-Skript mit

import pandas as pd 
from matplotlib import * 
from matplotlib.pyplot import * 

train_log = pd.read_csv("./lenet_train.log.train") 
test_log = pd.read_csv("./lenet_train.log.test") 
_, ax1 = subplots(figsize=(15, 10)) 
ax2 = ax1.twinx() 
ax1.plot(train_log["NumIters"], train_log["loss"], alpha=0.4) 
ax1.plot(test_log["NumIters"], test_log["loss"], 'g') 
ax2.plot(test_log["NumIters"], test_log["acc"], 'r') 
ax1.set_xlabel('iteration') 
ax1.set_ylabel('train loss') 
ax2.set_ylabel('test accuracy') 
savefig("./train_test_image.png") #save image as png 
+1

Vielen Dank für die detaillierte Antwort. DIGITS scheint ein gutes Werkzeug zu sein Ich benutze es für die nächsten Experimente – DucCuong

+0

Ich bin ein wenig verwirrt, die "test_log", über die Sie sprechen, ist tatsächlich "Validierung" oder ist ein echter "Test"? – Saman

+0

Es ist eine Validierung. Aber es scheint, dass in "val" und "test" dasselbe bedeutet. –

1

Caffe erstellt Protokolle jedes Mal, wenn Sie versuchen, etwas zu trainieren, und seine im tmp-Ordner (Linux und Windows).
Ich habe auch ein Plot-Skript in Python geschrieben, das Sie leicht verwenden können, um Ihren Verlust/Genauigkeit zu visualisieren.
Platzieren Sie einfach Ihre Trainingsprotokolle mit der Erweiterung .log neben dem Skript und doppelklicken Sie darauf. Sie können auch Befehlszeilen verwenden, aber zur einfacheren Verwendung lädt es bei der Ausführung alle Protokolle (* .log), die es im aktuellen Verzeichnis finden kann. zeigt es auch die oberen 4 Genauigkeiten und bei welcher Genauigkeit sie erreicht wurden.

Sie können es hier finden: https://gist.github.com/Coderx7/03f46cb24dcf4127d6fa66d08126fa3b

1
python /pathtocaffe/tools/extra/parse_log.py lenet_train.log 

Befehl erzeugt den folgenden Fehler:

usage: parse_log.py [-h] [--verbose] [--delimiter DELIMITER] 
       logfile_path output_dir 
parse_log.py: error: too few arguments 

Lösung:

Für eine erfolgreiche Ausführung von „parse_log.py“Befehl, wir sollten die zwei Argumente übergeben:

  1. Protokolldatei
  2. Pfad des Ausgabeverzeichnis

So ist der richtige Befehl lautet wie folgt:

python /pathtocaffe/tools/extra/parse_log.py lenet_train.log output_dir 
+0

fügen Sie ein "." (ein Punkt ohne Kinderbett) am Ende des Befehls und versuchen Sie es erneut –