[PYTHON] Persönliche Best Practices bei der Feinabstimmung mit Chainer

Fröhliche Weihnachten! !! !! !! @ tabe2314.

In diesem Artikel werde ich meine persönlichen Best Practices vorstellen, wenn ich ein vorhandenes Modell verfeinere, um ein neues Modell als Chainer-Technik zu erstellen, das ab morgen verwendet werden kann.

Feintuning

Bei der Feinabstimmung werden die Parameter eines Modells kopiert, das in einem anderen Problem oder einem anderen Datensatz trainiert wurde, und als Anfangswert der Parameter des neuen neuronalen Netzes verwendet, um das neuronale Netz zu trainieren. Ein typischer Fall ist die Verwendung eines mit ImageNet, einem allgemeinen Objekterkennungsdatensatz, trainierten Netzwerks für andere Probleme wie Objekterkennung und semantische Segmentierung.

Im Allgemeinen erfordert Deep Learning eine große Menge an Trainingsdaten. Durch die Feinabstimmung unter Verwendung eines im Voraus trainierten Modells (mit einer großen Datenmenge) als Anfangswert ist die Datenmenge in Bezug auf das Problem, das Sie tatsächlich lösen möchten, jedoch nicht groß. Möglicherweise können Sie eine ausreichende Leistung erzielen, auch wenn diese ausreicht. Es hat auch den Effekt, die Lernzeit zu verkürzen.

Konvertieren eines Caffe-Modells in ein Chainer-Modell

Übrigens denke ich, dass ich bei der Feinabstimmung mit Chainer oft das Modell verwenden möchte, das im Caffe's Model Zoo veröffentlicht wurde. In solchen Fällen wird empfohlen, zuerst das Caffe-Modell in das Chainer-Modell zu konvertieren und dann die Parameter wie unten beschrieben zu kopieren. In diesem Abschnitt wird beschrieben, wie das geht. Verwenden Sie als Beispiel VGG (https://gist.github.com/ksimonyan/3785162f95cd2d5fee77#file-readme-md).

1. Laden Sie das Caffe-Modell

Laden Sie es als Chainer-Modell des Caffe-Modells, das mit chainer.links.caffe.CaffeFunction heruntergeladen wurde. Das Laden eines großen Modells nimmt viel Zeit in Anspruch.

python


from chainer.links.caffe import CaffeFunction
vgg = CaffeFunction('VGG_ILSVRC_19_layers.caffemodel')

Nach dem Lesen können Sie auf jede Ebene und ihre Parameter zugreifen, indem Sie "vgg.conv1_1.W.data" mit dem auf der Caffe-Seite festgelegten Namen eingeben.

2. Speichern Sie als Chainer-Modell

Da das Laden eines Caffe-Modells einige Zeit in Anspruch nimmt, wird empfohlen, das mit "Caffe Function" geladene Modell als Chainer-Modell zu speichern. Ab Chainer 1.5 wird die HDF5-Serialisierung unterstützt. Um dies zu verwenden, ist die Netzwerkdefinition von Chainer jedoch gemäß Spezifikation erforderlich. Wenn Sie jedoch das Caffe-Modell laden, ist es schwierig, es separat zu erstellen. Aus diesem Grund ist es eine gute Idee, es mit "cPickle" zu speichern.

python


import cPickle as pickle
pickle.dump(vgg, open('vgg.pkl', 'wb'))

Kopieren Sie die Parameter in ein neues Modell

Wir zeigen Ihnen, wie Sie Parameter von einem Modell, das nach dem obigen Verfahren von Caffe konvertiert wurde, oder von einem anderen trainierten Chainer-Modell in ein neues Modell kopieren. Die hier vorgestellte Methode ist nützlich, wenn die Quelle und das neue Modell teilweise unterschiedliche Netzwerkkonfigurationen aufweisen. Wenn die Konfiguration genau gleich ist, ist das Verfahren sehr einfach. Trainieren Sie einfach das geladene Originalmodell so wie es ist und speichern Sie das aktualisierte Modell unter einem anderen Namen.

Übrigens gibt es die folgenden Situationen, in denen eine Feinabstimmung durchgeführt wird, indem die Netzwerkkonfiguration teilweise geändert wird.

All dies kann erreicht werden, indem das Quellmodell und das neue Modell an die unten stehende Funktion "copy_model" übergeben werden. Diese Funktion sucht nach dem Link (Funktion mit Parametern) des Originalmodells, der denselben Namen wie der Link des Kopierziels und der Form des Parameters hat, und kopiert diese. Wenn die Kette verschachtelt ist, erfolgt dies rekursiv.

python


def copy_model(src, dst):
    assert isinstance(src, link.Chain)
    assert isinstance(dst, link.Chain)
    for child in src.children():
        if child.name not in dst.__dict__: continue
        dst_child = dst[child.name]
        if type(child) != type(dst_child): continue
        if isinstance(child, link.Chain):
            copy_model(child, dst_child)
        if isinstance(child, link.Link):
            match = True
            for a, b in zip(child.namedparams(), dst_child.namedparams()):
                if a[0] != b[0]:
                    match = False
                    break
                if a[1].data.shape != b[1].data.shape:
                    match = False
                    break
            if not match:
                print 'Ignore %s because of parameter mismatch' % child.name
                continue
            for a, b in zip(child.namedparams(), dst_child.namedparams()):
                b[1].data = a[1].data
            print 'Copy %s' % child.name

Jetzt können Sie automatisch nur die gemeinsamen Teile mit einer anderen Konfiguration als das ursprüngliche Modell in das neue Modell kopieren. Dann lernen Sie das neue Modell nach Ihren Wünschen!

Zusammenfassung

――Feinabstimmung ist eine sehr wichtige Technik im praktischen Einsatz.

Recommended Posts

Persönliche Best Practices bei der Feinabstimmung mit Chainer
Best Practices für den Umgang mit Daten mit Pandas
Persönliche Best-Practice-Vorlage, die verwendet werden soll, wenn Sie MVP mit Flask erstellen möchten
Die Lambda-Funktion bietet Best Practice mit CircleCI + Lamvery
Seq2Seq (1) mit Chainer
Persönliche Best Practices für die Python-Entwicklungsumgebung mit VS-Code
Verwenden Sie Tensorboard mit Chainer
Vorsichtsmaßnahmen bei der Verwendung von Chainer