[PYTHON] Ich habe versucht, meinen eigenen Quellcode mit Chainer v2 alpha kompatibel zu machen

Chainer v2 alpha

Seit der Veröffentlichung von Chainer v2 alpha habe ich versucht, meinen eigenen Quellcode zu unterstützen. Ich habe auf die folgende Seite verwiesen.

Betriebsumgebung

Repository verwendet

Ich habe einen Zweig für Chainer v2 im Repository von [Bilderkennung von CIFAR-10, das zuvor erstellt wurde] erstellt (http://qiita.com/dsanno/items/ad84f078520f9c9c3ed1).

https://github.com/dsanno/chainer-cifar/tree/chainer_v2

Installation

Wie Sie auf der Folie "Chainer Meetup" sehen können, konnte ich sie mit dem folgenden Befehl installieren. Ich habe "--no-cache-dir" für alle Fälle hinzugefügt.

$ pip install chainer --pre --no-cache-dir
$ pip install cupy --no-cache-dir

Ich werde es vorerst versuchen

Da die Modifikation von Chainer v2 die Abwärtskompatibilität beeinträchtigt, kann ich davon ausgehen, dass sie nicht funktioniert, werde sie jedoch vorerst ausprobieren.

$ python src/train.py -g 0 -m vgg -p model\temp9 -b 100 --iter 200 --lr 0.1 --optimizer sgd --weight_decay 0.0001 --lr_decay_iter 100,150

Der folgende Fehler ist aufgetreten.

Traceback (most recent call last):
  File "src\train.py", line 143, in <module>
    cifar_trainer.fit(train_x, train_y, valid_x, valid_y, test_x, test_y, on_epoch_done)
  File "c:\project_2\chainer\chainer-cifar\src\trainer.py", line 26, in fit
    return self.__fit(x, y, valid_x, valid_y, test_x, test_y, callback)
  File "c:\project_2\chainer\chainer-cifar\src\trainer.py", line 40, in __fit
    loss, acc = self.__forward(x_batch, y[batch_index])
  File "c:\project_2\chainer\chainer-cifar\src\trainer.py", line 75, in __forward
    y = self.net(x, train=train)
  File "c:\project_2\chainer\chainer-cifar\src\net.py", line 360, in __call__
    h = self.bconv1_1(x, train)
  File "c:\project_2\chainer\chainer-cifar\src\net.py", line 28, in __call__
    h = self.bn(self.conv(x), test=not train)
TypeError: __call__() got an unexpected keyword argument 'test'

Es ist ein Fehler, dass das Argument von __call__ von chainer.links.BatchNormalization übergeben wird, obwohl es keinen test gibt.

Problem mit Chainer v2 behoben

Entfernen Sie den Zug aus dem Aufrufargument von chainer.functions.dropout

Ab Chainer v2 wird das Argument "Dropout" "Train" nicht mehr benötigt. Löschen Sie es daher.

Änderungsbeispiel:

Vor der Korrektur:
h = F.dropout(F.max_pooling_2d(h, 2), 0.25, train=train)
Überarbeitet:
h = F.dropout(F.max_pooling_2d(h, 2), 0.25)

Test aus Aufrufargument von chainer.links.BatchNormalization entfernt

Das Argument "Test" von "BatchNormalization" wird nicht mehr benötigt. Löschen Sie es daher wie im Fall von "Dropout".

Vor der Korrektur:

class BatchConv2D(chainer.Chain):
    def __init__(self, ch_in, ch_out, ksize, stride=1, pad=0, activation=F.relu):
        super(BatchConv2D, self).__init__(
            conv=L.Convolution2D(ch_in, ch_out, ksize, stride, pad),
            bn=L.BatchNormalization(ch_out),
        )
        self.activation=activation

    def __call__(self, x, train):
        h = self.bn(self.conv(x), test=not train)
        if self.activation is None:
            return h
        return self.activation(h)

Überarbeitet:

class BatchConv2D(chainer.Chain):
    def __init__(self, ch_in, ch_out, ksize, stride=1, pad=0, activation=F.relu):
        super(BatchConv2D, self).__init__(
            conv=L.Convolution2D(ch_in, ch_out, ksize, stride, pad),
            bn=L.BatchNormalization(ch_out),
        )
        self.activation=activation

    def __call__(self, x): #Zug entfernen
        h = self.bn(self.conv(x)) #Test entfernen
        if self.activation is None:
            return h
        return self.activation(h)

Schließen Sie die Verarbeitung ein, wenn Sie nicht mit chainer.using_config lernen ('train', False).

Die Argumente "train" und "test" wurden aus den Aufrufen von "dropout" und "BatchNormalization" entfernt. Bei dieser Geschwindigkeit arbeiten diese Funktionen im Lernmodus. Verwenden Sie ab Chainer v2 with chainer.using_config ('train',):, um zu steuern, ob das Training läuft.

    with chainer.using_config('train', False):
        #Was tun, wenn Sie nicht lernen?(Genauigkeitsberechnung von Testdaten usw.)

Verwenden Sie chainer.config.train, um zu unterscheiden, ob es lernt oder nicht

chainer.config wurde von Chainer v2 hinzugefügt und es ist jetzt möglich zu beurteilen, ob es lernt, ob eine Rückübertragung erforderlich ist usw. mit config. Bisher habe ich beurteilt, ob ich mit dem Argument "Zug" meiner eigenen Funktion gelernt habe oder nicht, wie in Abbildung 2 gezeigt. Ab Version 2 ist das Argument "Zug" jedoch nicht erforderlich und kann mit "configuration.config.train" beurteilt werden. Das ist gut.

Vor der Korrektur:

def my_func(x, train=True):
    if train:
        #Verarbeitung während des Lernens
    else:
        #Was tun, wenn Sie nicht lernen?

Überarbeitet:

def my_func(x):
    if chainer.config.train:
        #Verarbeitung während des Lernens
    else:
        #Was tun, wenn Sie nicht lernen?

Wenn eine Rückübertragung nicht erforderlich ist, fügen Sie sie in chainer.using_config ('train', False) ein.

Schließen Sie die Verarbeitung, für die keine Rückübertragung erforderlich ist, mit "chainer.using_config (" train ", False)" ein. Dies gilt für Fälle, in denen das Flag "flüchtig" aktiviert wurde, als "chainer.Variable" generiert wurde.

Nicht erforderlich für Chainer v2 alpha, wird aber in Zukunft benötigt (nach der Beta)

Flüchtiges Argument in chainer.Variable entfernt

Es bleibt in der Alpha-Phase v2, aber der "flüchtige" in "chainer.Variable" wird in Zukunft entfernt. Anstelle von "flüchtig" wird es von "chainer.using_config (" enable_backprop ",)" gesteuert. Da es möglich ist, Numpy-Array und Cupy-Array anstelle von "Variable" an den Aufruf von "chainer.functions" und "chainer.links" zu übergeben, gibt es meines Erachtens auch die Möglichkeit, den Generierungsprozess von "Variable" zu löschen.

Vor der Korrektur:

    x = Variable(xp.asarray(batch_x), volatile=Train)

Überarbeitet:

    with chainer.using_config('enable_backprop', False):
        x = Variable(xp.asarray(batch_x))

Ausführung nach Änderung

c:\project_2\chainer-cifar>python src\train.py -g 0 -m vgg -p model\temp -b 100 --iter 200 --lr 0.1 --optimizer sgd --weight_decay 0.0001 --lr_decay_iter 100,150
DEBUG: nvcc STDOUT mod.cu
Bibliothek C.:/Users/user_name/AppData/Local/Theano/compiledir_Windows-10-10.0.14393-Intel64_Family_6_Model_58_Stepping_9_GenuineIntel-2.7.11-64/tmpiwxtcf/265abc51f7c376c224983485238ff1a5.lib und Objekt C.:/Users/user_name/AppData/Local/Theano/compiledir_Windows-10-10.0.14393-Intel64_Family_6_Model_58_Stepping_9_GenuineIntel-2.7.11-64/tmpiwxtcf/265abc51f7c376c224983485238ff1a5.Erstellen von exp

Using gpu device 0: GeForce GTX 1080 (CNMeM is disabled, cuDNN 5105)
C:\Users\user_name\Anaconda\lib\site-packages\theano-0.8.2-py2.7.egg\theano\sandbox\cuda\__init__.py:600: UserWarning: Your cuDNN version is more recent than the one Theano officially supports. If you see any problems, try updating Theano or downgrading cuDNN to version 5.
  warnings.warn(warn)
loading dataset...
start training
epoch 0 done
train loss: 2.29680542204 error: 85.5222222221
valid loss: 1.95620539665 error: 81.3800000548
test  loss: 1.95627536774 error: 80.6099999845
test time: 1.04036228008s
elapsed time: 23.5432411172
epoch 1 done
train loss: 1.91133875476 error: 76.8000000185
valid loss: 1.83026596069 error: 73.6399999559
test  loss: 1.8381768012 error: 73.2900000066
test time: 0.993011643337s

Um Theano herum ist eine Warnung aufgetreten, bevor es zu Chainer v2 gelangt ist, aber es scheint zu funktionieren.

Schließlich

Es ist nicht schwer, Chainer v2 zu reparieren, aber da es viele Stellen gab, an denen "Dropout" und "BatchNormalization" verwendet wurden, wurde der Korrekturbetrag entsprechend erhöht. Infolge des Fixes ist der Code etwas sauberer, da das Argument "train", das einige Funktionen hatten, nicht mehr benötigt wird. Ich denke, dass eine Menge Code, der für v1 implementiert wurde, in v2 nicht funktioniert. Daher habe ich das Gefühl, dass es viele Fälle gibt, in denen selbst wenn ich versuche, den Code für v1 zu verschieben, den ich unmittelbar nach der offiziellen Veröffentlichung von v2 aufgenommen habe, er nicht funktioniert.

Recommended Posts

Ich habe versucht, meinen eigenen Quellcode mit Chainer v2 alpha kompatibel zu machen
Ich habe versucht, mein eigenes High-School-Mädchen BOT im Rinna-Stil mit LINE BOT (Python & Heroku) zu machen.
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, meinen eigenen Datensatz mit Chainer Trainer zu lernen
Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
Ich habe versucht, mit Python Machine Learning ein Echtzeit-Modell zur Trennung von Tonquellen zu erstellen
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, Othello AI zu machen, dass ich 7,2 Millionen Hände durch tiefes Lernen mit Chainer gelernt habe
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, Deep Learning mit Spark × Keras × Docker skalierbar zu machen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, Jojo mit LSTM ein seltsames Zitat zu machen
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, mit Hy anzufangen
Ich habe mit TWE-Lite-2525A einen Öffnungs- / Schließsensor (Twitter-Link) erstellt
Ich habe versucht, die Genauigkeit meines eigenen neuronalen Netzwerks zu verbessern
765 Ich habe versucht, die drei Berufsfamilien durch CNN zu identifizieren (mit Chainer 2.0.0).
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
[AWS] [GCP] Ich habe versucht, die Verwendung von Cloud-Diensten mit Python zu vereinfachen
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
Ich habe versucht, den Winkel von Sin und Cos mit Chainer zu lernen
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe eine Web-API erstellt
Ich habe versucht, TSP mit QAOA zu lösen
[Zaif] Ich habe versucht, den Handel mit virtuellen Währungen mit Python zu vereinfachen
Ich habe versucht, einen URL-Verkürzungsdienst mit AWS CDK serverlos zu machen
Ich versuchte mein Bestes, um zu Lasso zurückzukehren
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Ich habe versucht, mein eigenes Modul zu veröffentlichen, damit ich es per Pip installieren kann
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Als ich versuchte, eine VPC mit AWS CDK zu erstellen, konnte ich es aber nicht schaffen
[Patentanalyse] Ich habe versucht, mit Python eine Patentkarte zu erstellen, ohne Geld auszugeben
Ich habe eine Burgsuch-API mit Elasticsearch + Sudachi + Go + Echo erstellt
Ich habe versucht, Kanas handschriftliche Zeichenerkennung Teil 3/3 Zusammenarbeit mit der GUI mithilfe von Tkinter durchzuführen
Ich habe mein Bestes versucht, um eine Optimierungsfunktion zu erstellen, aber es hat nicht funktioniert.
Ich habe versucht, eine einfache Bilderkennungs-API mit Fast API und Tensorflow zu erstellen
Ich habe versucht, Deep Learning mit Spark × Keras × Docker 2 Multi-Host-Edition skalierbar zu machen
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe Flask mit Remote-Containern von VS Code ausprobiert