Chainer v2 alpha
Depuis la sortie de Chainer v2 alpha, j'ai essayé de supporter mon propre code source. Je me suis référé au site suivant.
J'ai créé une branche pour Chainer v2 dans le référentiel de Reconnaissance d'image de CIFAR-10 créé avant.
https://github.com/dsanno/chainer-cifar/tree/chainer_v2
Comme vous pouvez le voir sur la diapositive Chainer Meetup, j'ai pu l'installer avec la commande suivante.
J'ai ajouté --no-cache-dir
juste au cas où.
$ pip install chainer --pre --no-cache-dir
$ pip install cupy --no-cache-dir
Comme la modification de Chainer v2 rompt la rétrocompatibilité, je peux m'attendre à ce que cela ne fonctionne pas, mais je vais l'essayer pour le moment.
$ 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
L'erreur suivante s'est produite.
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'
C'est une erreur que l'argument de «call» de «chainer.links.BatchNormalization» est passé même s'il n'y a pas de «test».
Depuis Chainer v2, l'argument dropout
train` n'est plus nécessaire, supprimez-le.
Exemple de modification:
Avant correction:
h = F.dropout(F.max_pooling_2d(h, 2), 0.25, train=train)
modifié:
h = F.dropout(F.max_pooling_2d(h, 2), 0.25)
L'argument test
de BatchNormalization
n'est plus nécessaire, supprimez-le comme dans le cas de dropout
.
Avant correction:
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)
Modifié:
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): #Retirer le train
h = self.bn(self.conv(x)) #Supprimer le test
if self.activation is None:
return h
return self.activation(h)
Suppression des arguments train
et test
des appels à dropout
et BatchNormalization
.
À ce rythme, ces fonctions fonctionneront en mode d'apprentissage.
À partir de Chainer v2, utilisez with chainer.using_config ('train',):
pour contrôler si la formation est en cours.
with chainer.using_config('train', False):
#Que faire si vous n'apprenez pas(Calcul de la précision des données de test, etc.)
chainer.config
a été ajouté à partir de Chainer v2, et il est maintenant possible de juger s'il apprend, si une rétro-propagation est nécessaire, etc. avec config
.
J'avais l'habitude de juger si j'apprenais ou non avec l'argument train
de ma propre fonction comme indiqué ci-dessous, mais à partir de la v2, l'argument train
n'est pas nécessaire et il peut être jugé avec configuration.config.train
. C'est bon.
Avant correction:
def my_func(x, train=True):
if train:
#Traitement pendant l'apprentissage
else:
#Que faire si vous n'apprenez pas
Modifié:
def my_func(x):
if chainer.config.train:
#Traitement pendant l'apprentissage
else:
#Que faire si vous n'apprenez pas
Entourez les processus qui ne nécessitent pas de rétro-propagation avec chainer.using_config ('train', False)
.
Ceci s'applique aux cas où l'indicateur volatile
était activé lorsque la chainer.Variable
a été générée.
Il reste dans la phase alpha v2, mais le "volatile" dans "chainer.Variable" sera supprimé à l'avenir.
Au lieu de volatile
, il sera contrôlé par chainer.using_config ('enable_backprop',)
.
Puisqu'il est possible de passer le tableau Numpy et le tableau Cupy au lieu de «Variable» à l'appel de «chainer.functions» et «chainer.links», je pense qu'il existe une option pour supprimer le processus de génération de «Variable» également.
Avant correction:
x = Variable(xp.asarray(batch_x), volatile=Train)
Modifié:
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
Bibliothèque 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 et objet 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.Créer 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
Un avertissement est apparu autour de Theano avant de passer à Chainer v2, mais cela semble fonctionner.
Ce n'est pas difficile à corriger pour Chainer v2, mais comme il y avait de nombreux endroits où «dropout» et «BatchNormalization» étaient utilisés, la quantité de correction a été augmentée en conséquence.
À la suite du correctif, le code est un peu plus propre car l'argument train
que certaines fonctions avaient n'est plus nécessaire.
Je pense que beaucoup de code implémenté pour la v1 ne fonctionnera pas dans la v2, donc je pense qu'il y a de nombreux cas où même si j'essaie de déplacer le code pour la v1 que j'ai récupéré immédiatement après la publication officielle de la v2, cela ne fonctionne pas.
Recommended Posts