Puisque Chainer a été mis à jour vers 2.0 et n'est plus rétrocompatible, j'écrirai la partie modifiée afin qu'elle puisse être utilisée avec 2.0.2 en utilisant AlexNet comme exemple.
Je pense que cette partie est principalement modifiée, et il n'y a rien d'autre à changer.
Dans la v1.x, l'héritage de classe était effectué directement dans la partie init, mais dans la v2.x il a été changé pour être utilisé avec self.init_scope ():.
La notation de la partie init a changé en conséquence. Auparavant, fc_n = L.function (),
était décrit, mais self.
était ajouté comme self.fc_n = L.function ()
, et le dernier`, ʻest Vous n'en avez plus besoin.
Notez que si vous oubliez de supprimer ,
ici, vous obtiendrez TypeError: 'tuple' object is not callable
.
J'étais accro à cette erreur, me demandant si l'ensemble de données était pire.
python:v1.x_Alex.py
class Alex(chainer.Chain):
def __init__(self):
super(Alex, self).__init__(
conv1=L.Convolution2D(None, 96, 11, stride=4),
conv2=L.Convolution2D(None, 256, 5, pad=2),
conv3=L.Convolution2D(None, 384, 3, pad=1),
conv4=L.Convolution2D(None, 384, 3, pad=1),
conv5=L.Convolution2D(None, 256, 3, pad=1),
fc6=L.Linear(None, 4096),
fc7=L.Linear(None, 4096),
fc8=L.Linear(None, 1000),
)
self.train = True
...
v2.x_Alex.py
class Alex(chainer.Chain):
def __init__(self):
super(Alex, self).__init__()
with self.init_scope():
self.conv1 = L.Convolution2D(None, 96, 11, stride=4)
self.conv2 = L.Convolution2D(None, 256, 5, pad=2)
self.conv3 = L.Convolution2D(None, 384, 3, pad=1)
self.conv4 = L.Convolution2D(None, 384, 3, pad=1)
self.conv5 = L.Convolution2D(None, 256, 3, pad=1)
self.fc6 = L.Linear(None, 4096)
self.fc7 = L.Linear(None, 4096)
self.fc8 = L.Linear(None, 1000)
...
De plus, le train qui n'est reflété que pendant l'apprentissage a été supprimé de la fonction et spécifié dans with chainer.using_config ()
.
model = L.Classifier(Alex())
with chainer.using_config('train',False):
y = (x)
Fondamentalement, il semble qu'il soit courant de définir avec ce chainer.config
, et ʻusecudnnest également défini avec cela. Si vous écrivez
chainer.config.use_cudnn = 'never'`, vous pouvez définir de ne pas utiliser tous à la fois.
Il n'y a rien qui ne fonctionne que si vous le modifiez, mais les types de trainer.extend augmentent.
if extensions.PlotReport.available():
trainer.extend(extensions.PlotReport(['main/loss', 'validation/main/loss'],
'epoch', file_name='loss.png'))
trainer.extend(extensions.PlotReport(['main/accuracy', 'validation/main/accuracy'],
'epoch', file_name='accuracy.png'))
Il semble que le graphique de perte et de précision soit automatiquement sorti par écrit, mais cela n'a pas bien fonctionné car il a été dit qu'il n'y avait pas de matplotlib qui devrait être inclus dans mon environnement.
J'ai l'impression de l'avoir changé et de l'avoir déplacé, mais le réseau à feed-forward composé uniquement de Linear général n'a pas changé en particulier, mais le réseau basé sur AlexNet est extrêmement d'apprentissage. J'ai l'impression qu'il est tard. Probablement mal écrit ...
D'autres changements sont également écrits dans ce Chainer docs
Recommended Posts