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.
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
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
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.
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)
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)
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.)
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?
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.
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))
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.
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.