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.
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.
Ü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).
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.
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'))
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!
――Feinabstimmung ist eine sehr wichtige Technik im praktischen Einsatz.
Recommended Posts