Klicken Sie hier für den ersten Teil http://qiita.com/kenmaz/items/4b60ea00b159b3e00100
Dies ist eine Fortsetzung der Geschichte eines Software-Ingenieurs, der für maschinelles Lernen und tiefes Lernen völlig neu ist und eine App erstellt hat, die ein Faltungs-Neuronales Netzwerk verwendet, um die Gesichter von Mitgliedern von "Momoiro Clover Z" zu identifizieren.
deeplearning Im ersten Teil haben wir erklärt, wie Gesichtsbilder aus den vom Crawler gesammelten Bildern extrahiert und Trainingsdaten generiert werden. Von hier aus werden wir endlich anfangen zu lernen.
Der Code für den Teil zum maschinellen Lernen ist an Tensorflow Deep MNIST for Experts und [CIFAR] angehängt. -10 Klassifizierung](https://www.tensorflow.org/versions/r0.8/tutorials/deep_cnn/index.html) Ich habe die Implementierung basierend auf dem Code empfohlen.
gen_testdata.py https://github.com/kenmaz/momo_mind/blob/master/deeplearning/gen_testdata.py
Zunächst ist es der Teil, der die Trainingsdaten an Tensorflow weiterleitet, aber wie der Beispielcode von MNIST habe ich beschlossen, eine CSV zu generieren und diese zu laden. Im ersten Teil wurden die Bilder der lernenden Oberschenkelmitglieder im Mac Finder in Ordner unterteilt, jedoch basierend auf der Struktur der Ordner / Dateien.
Pfad der Trainingsbilddatei,Mitgliedsname 0-Zahlenwert entsprechend 4
Ich habe ein kleines Skript geschrieben, das CSV im Format ausspuckt.
Übrigens werden in Tensorflow die Trainingsdaten mit dem Protokollpuffer wie folgt und [TF Records] serialisiert. Es wird empfohlen, in das Dateiformat zu exportieren (https://www.tensorflow.org/versions/r0.8/how_tos/reading_data/index.html#standard-tensorflow-format). Es war ein wenig mühsam, also gab ich es diesmal auf.
Das folgende Skript liest CSV und erstellt Tensor, die Eingabedaten des später beschriebenen Modells. mcz_input.py https://github.com/kenmaz/momo_mind/blob/master/deeplearning/mcz_input.py
Lesen Sie eine Textdatei in TensorFlow tf.TextLineReader oder dekodieren Sie die gelesenen Daten als csv Praktische Klassen und Funktionen wie tf.decode_csv function werden im Voraus vorbereitet. Wenn Sie die Eingabedaten mit diesen lesen, ist dies das Eingabedatenformat für TensorFlow, wie es [tf.Tensor] ist (https://www.tensorflow.org/versions/r0.8/api_docs/python/framework.html#) Tensor) wird automatisch erstellt.
Darüber hinaus wird das Bild des Trainingsbeispiels als maschinelle Lerntechnik "aufgeblasen", indem es nach links und rechts gedreht, ein wenig gedreht, gezoomt und der Kontrast zufällig geändert wird (als "Datenerweiterung" bezeichnet). Es scheint zu geben), aber die meisten dieser Prozesse werden auch von TensorFlow vorbereitet.
Kippen Sie nach dem Zufallsprinzip nach links und rechts tf.image.random_flip_up_down () und ändern Sie die Helligkeit nach dem Zufallsprinzip tf .image.random_brightness (), ändern Sie auch den Kontrast [tf.image.random_contrast](https: / /www.tensorflow.org/versions/r0.8/api_docs/python/image.html#random_contrast) usw.
Zuerst habe ich die Existenz dieser Funktionen nicht bemerkt und versucht, openCV selbst zu verwenden, aber es scheint besser, TensorFlows gehorsam zu verwenden.
Dieses Mal haben wir als Trainingsdaten insgesamt 750 Gesichtsbilder vorbereitet, 150 für jedes Mitglied. ** 120 ** Bilder werden zufällig aus diesen extrahiert und nachdem die Daten wie oben beschrieben erweitert und randomisiert wurden, werden sie gemeinsam als Eingabe des Trainingsmodells eingefügt. Diese Arbeit wird als ein Schritt angesehen, und das Lernen wird für 1000 bis 30.000 Schritte wiederholt.
Der wahrscheinlich wichtigste Code, den ich dieses Mal geschrieben habe, ist ein Skript, das ein Lern- / Inferenzmodell erstellt. mcz_model.py https://github.com/kenmaz/momo_mind/blob/master/deeplearning/mcz_model.py
Zuerst habe ich versucht, das folgende Modell des Faltungsnetzwerks zu definieren. https://github.com/kenmaz/momo_mind/blob/master/deeplearning/mcz_model.py#L6
-Eingang(28x28 3ch Farbe)
-Faltschicht 1
-Pooling-Schicht 1
-Faltschicht 2
-Pooling Schicht 2
-Vollständig verbundene Schicht 1
-Vollständig verbundene Schicht 2
Dies entspricht fast der CIFAR-10-Probe. Bei diesem Modell betrug die Klassifizierungsgenauigkeit nur etwa ** 65 ~ 70% **.
Erstens ist die Eingabe 28x28, weil ich das Beispiel von CIFAR-10 so wie es ist mitgebracht habe, aber 28x28 ist zum Beispiel ein 28x28-Bild. Hmm, wer ist das? (** Ich verstehe **)
Es scheint für Menschen sehr schwierig zu sein, dies zu tun, da wir die Merkmale aus diesem groben Bild herausfinden müssen. Ich möchte es höher auflösen.
Trotzdem wollte ich die Genauigkeit verbessern, also verdoppelte ich die Auflösung des Eingabebildes und fügte nacheinander weitere Faltungs- und Poolebenen hinzu. https://github.com/kenmaz/momo_mind/blob/master/deeplearning/mcz_model.py#L53
-Eingang(56x56 3ch Farbe)
-Faltschicht 1
-Pooling-Schicht 1
-Faltschicht 2
-Pooling Schicht 2
-Faltschicht 3
-Pooling Schicht 3
-Vollständig verbundene Schicht 1
-Vollständig verbundene Schicht 2
Ich habe ein Modell des Faltungsnetzwerks definiert. Dann erhöhte sich die Genauigkeit schließlich auf ungefähr 85%.
Apropos 56x56 Bilder, es sieht so aus. Sie wissen, wer diesmal, richtig?
Nur bei dieser Auflösung können ** Dellen ** erkannt werden. Immerhin will ich so viel.
Nun, ich dachte, wenn wir die Auflösung erhöhen und mehr Ebenen hinzufügen, könnten wir die Genauigkeit noch weiter verbessern. Eigentlich habe ich versucht, eine Version mit mehr Ebenen und höherer Eingangsauflösung zu erstellen, aber es hat nicht funktioniert, weil die Kreuzentropie nicht konvergiert hat. Die Ursache ist nicht gut verstanden. Laut dem Blog von Herrn Sugiyan war es möglich, 90-95% durch Eingabe von 112x112 zu erreichen. Woher kam der Unterschied? ..
TensorFlow hat eine Funktion zum Anzeigen des Lernmodells als Grafik, daher werde ich es unten mit einer groben Erklärung veröffentlichen.
Es ist ein Bild von Daten, die von unten nach oben fließen.
Ich werde bald müde, also werde ich zu einem späteren Zeitpunkt weitermachen.
Recommended Posts