[PYTHON] [Pokemon-Schwertschild] Ich habe versucht, die Urteilsgrundlage des tiefen Lernens anhand der Drei-Familien-Klassifikation als Beispiel zu visualisieren

Einführung

Spielt ihr Pokemon? Ich habe es zum ersten Mal seit 10 Jahren gekauft ~~ Ich habe es vom Weihnachtsmann bekommen. Mit dem Ziel, eine starke Kraft zu sein, planen wir, zu Hause zu bleiben und während der Jahresend- und Neujahrsferien sorgfältig auszuwählen. Ich habe mich gefragt, ob der Adventskalender etwas mit Pokemon Neta anfangen kann, also habe ich ** eine Methode ausprobiert, die die Grundlage für die Beurteilung eines Deep-Learning-Modells ** zeigt, an dem ich kürzlich interessiert bin, am Beispiel der Pokemon-Drei-Familien-Klassifikation **. Sah.

Methode zur Darstellung der Beurteilungsgrundlage des Deep-Learning-Modells: Was ist TCAV?

Deep Learning beginnt in der Gesellschaft in verschiedenen Bereichen zu implementieren, aber es ist eher eine Black Box, auf der das Modell Entscheidungen trifft, auf denen es basiert. In den letzten Jahren wurden Untersuchungen zur "Erklärung" und "Interpretierbarkeit" von Modellen durchgeführt.

Daher möchte ich dieses Mal die in ICML 2018 verwendete Methode Quantitatives Testen mit Konzeptaktivierungsvektoren (TCAV) ausprobieren.

Umriss des Papiers

CAV-Konzept (Concept Activation Vectors)

Ableitung von CAV durch Trainieren eines linearen Klassifikators zwischen einem konzeptuellen Bild und einem zufälligen Gegenbeispiel und Erhalten eines zur Entscheidungsgrenze orthogonalen Vektors. (Die folgende Abbildung ist schneller zu sehen).

image.png

Was weißt du

Machen Sie zuerst einen geeigneten Klassifikator

Dieses Mal ist es mein Ziel, TCAV zu bewegen, also habe ich es zu einer einfachen Aufgabe gemacht. Erstelle einen Pokemon Three Family Classifier.

Datensatzvorbereitung

① Krabbeln

Die folgenden Bilder wurden mit icrawler gesammelt. Ich werde den Code setzen.

import os
from icrawler.builtin import GoogleImageCrawler

save_dir = '../datasets/hibany'
os.makedirs(save_dir, exist_ok=True)

query = 'Scorbunny'
max_num = 200

google_crawler = GoogleImageCrawler(storage={'root_dir': save_dir})
google_crawler.crawl(keyword=query, max_num=max_num)

② Vorbehandlung

Nur minimale Verarbeitung.

  1. ① Schneiden Sie das durch Kriechen in ein Quadrat aufgenommene Bild manuell zu
  2. Ändern Sie die Größe auf 256 x 256
  3. Teilen Sie in Zug / Wert / Test

Beispielbild für drei Familienbilder

Die Bilder wurden so gesammelt. (Übrigens war ich eine schnelle Entscheidung für Hibani. Ich liebe Flammentyp)

Scorbunny Messon Sarnori
000003.jpg 000003.jpg 000006.png
156 Blatt 147 Blatt 182 Blatt

Die folgenden Pokémon außer den drei Familien, Charakterbildern und überdeformierten Illustrationen wurden ebenfalls verwirrt, sodass sie durch visuelle Inspektion ausgeschlossen werden. ~~ Kibana San Cool ~~ 000075.png 000237.jpg 000075.png

Klassifikatorerstellung

Es ist ein einfaches CNN.

image.png

Da die Anzahl der Bilder der Testdaten gering ist (ca. 15), flattert die Genauigkeit der Testdaten. Wir haben jedoch ein Klassifizierungsmodell mit einer Genauigkeit erstellt, die für die TCAV-Überprüfung ausreicht. image.png

Sie benötigen eine **. Pb-Datei **, um den CAV zu berechnen. Speichern Sie das Modell daher in .pb. Machen Sie sich als Nächstes bereit, um zu sehen, was das Modell lernt.

Vorbereitung zur Ausführung von TCAV

Befolgen Sie zur Vorbereitung die folgenden Schritte. (Der Code, den ich dieses Mal verwendet habe, ist auf hier. Ich werde README später richtig schreiben ...)

Schritt 1: Erstellung konzeptioneller Bilder (positive und negative Beispiele)

Das folgende Bild ist für das reguläre Beispielbild vorbereitet. Wir haben mehrere Farben vorbereitet, basierend auf der Hypothese, dass wir die drei Familien anhand der Farben klassifizieren würden. (Obwohl es mit 10 bis 20 Blatt funktioniert, ist es besser, etwa 50 bis 200 Blatt zu haben)

** Beispielbildbeispiel **

Weiß rot Blau Gelb Grün schwarz
000001.jpg 000005.jpg 000009.jpg 000004.jpg 000023.png 000023.png
22 Blatt 20 Blatt 15 Blatt 18 Blatt 21 Blatt 17 Blatt

Ich schließe diejenigen aus, die zu viele Farben haben 000025.png

** Negatives Beispielbildbeispiel ** Alles, was nicht in eines der obigen Beispiele passt, ist wünschenswert. (In diesem Fall ist es schwierig zu sagen, dass es keiner Farbe entspricht.) Dieses Mal habe ich zufällig Bilder von Caltech256 aufgenommen.

Die Verzeichnisstruktur der bisher gesammelten Bilder ist wie folgt. Alle Sätze von konzeptuellen Bildern sollten Unterverzeichnisse sein.

├── datasets
│   ├── for_tcav #Datensatz für TCAV
│   │   ├── black
│   │   ├── blue
│   │   ├── green
│   │   ├── hibany
│   │   ├── messon
│   │   ├── random500_0
│   │   ├── random500_1
│   │   ├── random500_2
│   │   ├── random500_3
│   │   ├── random500_4
│   │   ├── random500_5
│   │   ├── red
│   │   ├── sarunori
│   │   ├── white
│   │   └── yellow
│   └── splited #Datensatz für die Erstellung von Bildklassifizierungsmodellen
│       ├── test
│       │   ├── hibany
│       │   ├── messon
│       │   └── sarunori
│       ├── train
│       │   ├── hibany
│       │   ├── messon
│       │   └── sarunori
│       └── validation
│           ├── hibany
│           ├── messon
│           └── sarunori

Schritt 2: Implementieren Sie den Modell-Wrapper

Ich werde es zuerst klonen.

git clone [email protected]:tensorflow/tcav.git

Hier erstellen wir einen Wrapper, um Modellinformationen an TCAV zu übermitteln. Fügen Sie diese Klasse zu tcav / model.py hinzu.

class SimepleCNNWrapper_public(PublicImageModelWrapper):
    def __init__(self, sess, model_saved_path, labels_path):
        self.image_value_range = (0, 1)
        image_shape_v3 = [256, 256, 3]
        endpoints_v3 = dict(
            input='conv2d_1_input:0',
            logit='activation_6/Softmax:0',
            prediction='activation_6/Softmax:0',
            pre_avgpool='max_pooling2d_3/MaxPool:0',
            logit_weight='activation_6/Softmax:0',
            logit_bias='dense_1/bias:0',
        )

        self.sess = sess
        super(SimepleCNNWrapper_public, self).__init__(sess,
                                                       model_saved_path,
                                                       labels_path,
                                                       image_shape_v3,
                                                       endpoints_v3,
                                                       scope='import')
        self.model_name = 'SimepleCNNWrapper_public'

Jetzt können Sie loslegen. Lassen Sie uns das Ergebnis sofort sehen.

Ergebnis

Werfen wir einen Blick auf die Konzepte (diesmal Farben), die in jeder Klasse wichtig sind. Die nicht mit * gekennzeichneten Konzepte sind wichtig.

Hibani-Klasse Messon Klasse Sarnori-Klasse
image.png Rot / Gelb / Weiß image.png rot(!?) image.png Grün
000003.jpg 000003.jpg 000006.png

Ich denke, Hibani und Sarnori sind so. Das Messon ist ein Rätsel, daher ist es wichtig, es zu berücksichtigen. Wenn Sie die Anzahl der Versuche oder die Anzahl der konzeptionellen Bilder / Zielbilder während des Experiments ändern, ändern sich die Ergebnisse erheblich. Ich denke, es ist notwendig, etwas mehr zu berücksichtigen. Es scheint sich zu lohnen, verschiedene Dinge auszuprobieren, da es sich zu ändern scheint, je nachdem, wie Sie das konzeptionelle Bild auswählen.

Zusammenfassung

Ich habe eine Methode ausprobiert, die die Beurteilungsgrundlage des neuronalen Netzwerkmodells zeigt. Es war für den Menschen leicht zu interpretieren, und das Ergebnis war ** "intuitiv so" **. Dieses Mal habe ich die Farbe als konzeptionelles Bild gewählt, da es als Dreifamilienfamilie klassifiziert ist, aber es ist schwierig, das konzeptionelle Bild vorzubereiten. .. Sie müssen verschiedene Vorbereitungen treffen, müssen das Modell jedoch nicht neu lernen. Wenn Sie die einzelnen Schritte einmal ausprobieren und sich daran gewöhnen, können Sie sie problemlos verwenden. Bitte versuchen Sie es auf jeden Fall!

Recommended Posts

[Pokemon-Schwertschild] Ich habe versucht, die Urteilsgrundlage des tiefen Lernens anhand der Drei-Familien-Klassifikation als Beispiel zu visualisieren
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
Ich habe versucht, die Genauigkeit von Modellen für maschinelles Lernen mit Kaggle als Thema zu vergleichen.
Ich habe die gängige Geschichte der Vorhersage des Nikkei-Durchschnitts mithilfe von Deep Learning (Backtest) ausprobiert.
Ich habe versucht, das Objekterkennungs-Tutorial mit dem neuesten Deep-Learning-Algorithmus auszuführen
Ich habe versucht, die Support-Vektor-Maschine sorgfältig zu verstehen (Teil 1: Ich habe den Polynom / RBF-Kernel am Beispiel von MakeMoons ausprobiert).
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Python-Übung 100 Schläge Ich habe versucht, den Entscheidungsbaum von Kapitel 5 mit graphviz zu visualisieren
[Deep Learning von Grund auf neu] Ich habe versucht, die Gradientenbestätigung auf leicht verständliche Weise zu erklären.
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Verstehen Sie die Funktion der Faltung am Beispiel der Bildverarbeitung
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich wollte die Klassifizierung von CIFAR-10 mit dem Chainer-Trainer in Frage stellen
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Ich habe versucht, mit Theano tief zu lernen
[Fabric] Ich war süchtig danach, Boolesche Werte als Argument zu verwenden. Notieren Sie sich also die Gegenmaßnahmen.
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
Ich habe versucht, die Beispielnachrichten zur Geschäftsintegration in Amazon Transcribe zu übertragen
Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Mit COTOHA habe ich versucht, den emotionalen Verlauf des Laufens von Meros zu verfolgen.
Ich habe 200 Mal versucht, magisch auszutauschen [Pokemon-Schwertschild]
Visualisieren Sie die Auswirkungen von Deep Learning / Regularisierung
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (erste Hälfte).
Ich habe versucht, die Informationen der ASPX-Site, die mit Selenium IDE ausgelagert wird, so programmlos wie möglich abzurufen
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
[Python] Deep Learning: Ich habe versucht, Deep Learning (DBN, SDA) ohne Verwendung einer Bibliothek zu implementieren.
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Ein Amateur versuchte Deep Learning mit Caffe (Einführung)
Maschinelles Lernen des Sports - Analyse der J-League als Beispiel - ②
Ein Amateur versuchte Deep Learning mit Caffe (Übung)
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ein Amateur hat Deep Learning mit Caffe ausprobiert (Übersicht)
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, den Sieg oder die Niederlage der Premier League mit dem Qore SDK vorherzusagen
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Ich habe versucht, den Text in der Bilddatei mit Tesseract der OCR-Engine zu extrahieren
Ich habe versucht, die Eigenschaften der neuen Informationen über mit dem Corona-Virus infizierte Personen mit Wordcloud zu visualisieren
[Erste Datenwissenschaft ⑥] Ich habe versucht, den Marktpreis von Restaurants in Tokio zu visualisieren
Ich habe versucht, die Laufdaten des Rennspiels (Assetto Corsa) mit Plotly zu visualisieren
Ich habe versucht, von Postman aus mit Cisco Guest Shell als API-Server zu arbeiten
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Techniken zum Verständnis der Grundlagen von Deep-Learning-Entscheidungen
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren