Da Chainer auf 2.0 aktualisiert wurde und nicht mehr abwärtskompatibel ist, werde ich ein modifiziertes Teil schreiben, damit es mit 2.0.2 am Beispiel von AlexNet betrieben werden kann.
Ich denke, dass dieser Teil hauptsächlich geändert wird und nichts anderes geändert werden muss. In Version 1.x wurde die Klassenvererbung direkt im Teil init durchgeführt, in Version 2.x wurde sie jedoch für die Verwendung mit self.init_scope () geändert :. Die Notation des Init-Teils hat sich entsprechend geändert. Zuvor wurde "fc_n = L.function ()" beschrieben, aber "self" wurde als "self.fc_n = L.function ()" hinzugefügt, und das letzte "ist" Du brauchst es nicht mehr.
Beachten Sie, dass, wenn Sie vergessen, "," hier zu löschen, "TypeError:" Tupel "-Objekt kann nicht aufgerufen werden". Ich war süchtig nach diesem Fehler und fragte mich, ob der Datensatz schlechter war.
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)
...
Außerdem wurde der Zug, der nur während des Lernens reflektiert wird, aus der Funktion gelöscht und in with chainer.using_config ()
angegeben.
model = L.Classifier(Alex())
with chainer.using_config('train',False):
y = (x)
Grundsätzlich scheint es üblich zu sein, mit dieser chainer.config
zu setzen, und usecudnn
wird auch damit gesetzt.
Wenn Sie "chainer.config.use_cudnn =" never "" schreiben, können Sie festlegen, dass nicht alle gleichzeitig verwendet werden.
Es gibt nichts, was nicht funktioniert, wenn Sie es nicht ändern, aber die Arten von Trainer.extend nehmen zu.
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'))
Es scheint, dass das Diagramm von Verlust und Genauigkeit automatisch durch Schreiben ausgegeben wird, aber es hat nicht gut funktioniert, da gesagt wurde, dass es keine Matplotlib gibt, die in meine Umgebung aufgenommen werden sollte.
Es fühlt sich an, als hätte ich es geändert und tatsächlich verschoben, aber das Feed-Forward-Netzwerk, das nur aus allgemeinem Linear besteht, hat sich nicht besonders geändert, aber das auf AlexNet basierende Netzwerk ist äußerst lernfähig. Ich fühle mich wie es spät ist. Wahrscheinlich schlecht geschrieben ...
Andere Änderungen sind auch in diesem Beamten geschrieben Chainer docs
Recommended Posts