Caffe-Einführung
Inhalt 1. Caffe a. Installation b. Dateien eines Netzwerks c. Aufbau eines Netzwerks d. Verwendung eines Netzwerks e. Eigenes Beispiel für ein Netzwerk f. MNIST 2. Caffe meets Java
Installation - Kompilierung des Master-Branch - Voraussetzungen - CUDA (Grafikkarten Berechnungen) - BLAS (Lineare Algebra) - Boost (Sammlung von Bibliotheken) - OpenCV (Bibliotheken für Bildverarbeitung) - Protobuf (Ähnlich zu JSON oder XML) - Glog (Google logging Bibliothek) - Gflags (Erweiterung der Kommandozeilen Befehle) - leveldb (Google Datenbank, Key-Value Liste) - lmdb (Key-Value Liste) - snappy (Google Kompressions-Bibliothek)
Installation - Kompilierung unter Windows - Cygwin (Terminal, das Unix-Befehle interpretieren kann) - Braucht zusätzliche Packages für Befehle wie Make - (./configure && make && make check && make install) * - Allgemeine Probleme: - Fokus auf Unix-Systemen - Führt zu Problemen bei Windows (andere Pfade, ) - Wenig Präzedenzfälle für Windows - Wenig Erfahrung mit dieser Art von Installation
Installation - Aktuellster Stand: Caffe zu 85% kompiliert - Caffe-Windows (Visual-Studio 2012, Cuda 6.5,...) - Keine Weiterentwicklung - Ermöglicht nur Training - Erweiterungen bisher fehlgeschlagen - Caffe-Standalone - Veraltet - Kompilierung unter OSX und Ubuntu - Caffe bietet Installation-Guides - Besitzen Package-Manager (leichteres händeln von allem)
Caffe Netzwerk 1. Netzwerk 2. Trainer
Dateien eines Netzwerks - Caffe arbeitet auf Basis des Google Protocol Buffer - Vergleichbar mit JSON oder XML - Jedoch - Kleiner - Schneller - Leichter - Verwendete Typen: -.prototxt - Beschreibung der Netzwerkkomponenten -.proto - Definiert die verwendbaren Netzwerkkomponenten -.binaryproto - Serialisierte Komponenten
Dateien eines Netzwerks Netzwerk definieren 1. caffe.proto 2. netzwerk.prototxt 3. solver.prototxt Netzwerk trainieren 1. weight-snapshot 2. solver-snapshot Netzwerk verwenden 1. caffe.proto 2. weight-snapshot
Aufbau eines Netzwerks Netzwerk: - Vertikale Orientierung - Stapel aus Schichten (Layers) - Model und Umsetzung getrennt - Directed acyclic Graph (DAG) loss (SOFTMAX_LOSS) ip2 (INNER_PRODUCT) relu1 (RELU) ip1 (INNER_PRODUCT) pool1 (POOLING) conv1 (CONVOLUTION) mnist (DATA)
Blobs - Allgemein - Vierdimensionales Array zum Speichern und austauschen von Informationen - Bilder, Model-Parameter, Ableitungen für Optimierungen - Number (N) x Channel (K) x Height (H) x Width (W) - N = Batchsize - K = Feature dimension z.b. RGB = 3
Blobs - Beispiele - Bsp.: Images (ImageNet) - 256 x 3 x 227 x 227-256 = Bilder - 3 = RGB Kanal - 227 = Höhe & Breite - Bsp.: Parameter (Convolution Layer) - 96 x 3 x 11 x 11-96 = Filter - 3 = Input (noch unklar) - 11 = Kernelgröße - Bsp.: Parameter (Inner-Product / Fully-connected Layer) - 1 x 1 x 1000 x 1024-1024 = Input - 1000 = Output - 1 x 1 (noch unklar)
Blobs - Einbindung top - blob bottom - blob
Layer - Allgemein - 51 Typen - Funktionen sind ebenfalls Schichten - 5 Kategorien - Data-, Vision-, Common-, Activation/Neuron-, Loss-Layer - Aufbau eines Layers - Name - Type - Bottom - Top - Parameter ( Inhaltlich abhängig vom Typ ) - Basis-Funktionen ( Code ) - Setup - Forward - Backward
Layer - Typen - Data-Layer: - Lädt die Bilder/Daten, mit denen ein Netzwerk arbeiten soll. - z.b. leveldb, lmdb, Images,... - Vision-Layer: - Verarbeitet Bilder - z.b. Convolution, Pooling,...
Layer - Typen - Activation/Neuron-Layer: - elementweise Berechnungen - z. B. Rectified_Linear (ReLU), Sigmoid,... - Loss-Layer: - Berechnet den Fehler - Typ: Euclidean, Softmax, - Abweichung: Accuracy, top-k (Nur als Validierung, ohne Backward, ) - Common-Layer: - Sonstige Operationen - z.b. Inner Product, Flattening,... - Schema-Definition: caffe.proto#layerdefinition
Solver
Caffe Aufruf...über Konsole / Batch-Datei: 1. SET GLOG_logtostderr=1 2. "$CAFFE_BIN_PATH/caffe.exe" solver.prototxt 1. Log-Messages printen statt Logfile anzulegen (letzteres schlägt fehl) 2. exe aufrufen und Solver-Protobuf-Datei übergeben
Netzwerk Initialisierung Trainings- und Test-Netzwerk werden nacheinander initialisiert Layer werden sukzessiv erstellt: 1. Layer-Name Creating Layer mnist_data 2. Input-Blobs ip1 mnist_data 3. erzeugte Ouput-Blobs mnist_data data; mnist_data label 4. Layer-spezifische Aktionen Laden der Bilder 5. Struktur der Top-Blob(s) 10,3,28,28 6. Benötigt Backward-Propagation? Beim Trainings-Netz: Einstellungen zu Lernrate und Weight-Decay laden
Netzwerk Initialisierung
Training: Konsolen-Ausgabe Bsp Ausgabe alle 100 Iterationen. Test alle 200 Iterationen. Snapshot alle 450 Iterationen. Iteration 300. Aktuelle Lernrate und Fehler / Loss. Iteration 400 --- --- Iteration 400 Testing: Score 0 = 0.8 = 80% der Bilder wurden richtig klassifiziert Score 1 = 3,5667 = Loss beim Testdurchlauf Iteration 450: Snapshot
Training: Konsolen-Ausgabe
Eigenes Bsp (logistic regression) - MNIST war das simpelste lauffähige Beispiel aus der Community - Konstruktion eines simplen Beispiels - Stand des letztens Semesters - Wenig Bilder (100 Trainings, 10 Testbilder) für kurze Laufzeit - Benutzung von Bilddatei-Liste
Eigenes Bsp (logistic regression) - Aufbau siehe rechts - fixe Lernrate von 0.01 - nonlineare Fkt ist im Loss Layer enthalten - >funktioniert nicht gut (Klass.rate: 0.6)
Eigenes Bsp
Eigenes Bsp
Eigenes Bsp Data-Layer
Eigenes Bsp ip-layer
Eigenes Bsp Loss-Layer
Eigenes Bsp (logistic regression) - Verbesserungen: - Solver: Momentum (!) - zusätzlicher ip -Layer - Finetuning: weight_decay, fortgeschrittene learning-rate policy
Caffe meets Java Netzwerk verwenden caffe.proto weight-snapshot
Caffe meets Java - caffe.proto - Regeln für die Gestaltung - Wird zu einer Java-Klasse kompiliert - weight-snapshot - Enthält das Netzwerk sowie die Gewichte - Serialisiert und so nicht zu gebrauchen
Caffe meets Java caffe.proto parse weightsnapshot
Caffe meets Java - Im Code: