Joyeux Noël! !! !! !! @ tabe2314.
Dans cet article, je présenterai mes meilleures pratiques personnelles lorsque je peaufinerai un modèle existant pour créer un nouveau modèle en tant que technique de chaînage pouvant être utilisée à partir de demain.
Le réglage fin est le processus consistant à copier les paramètres d'un modèle qui a été formé à un autre problème ou à un autre ensemble de données et à l'utiliser comme valeur initiale des paramètres d'un nouveau réseau neuronal afin d'entraîner le réseau neuronal. Un cas typique est l'utilisation d'un réseau formé avec ImageNet, un jeu de données général de reconnaissance d'objets, pour d'autres problèmes tels que la détection d'objets et la segmentation sémantique.
En général, le Deep Learning nécessite une grande quantité de données d'entraînement, mais en réglant avec précision à l'aide d'un modèle entraîné à l'avance (avec une grande quantité de données) comme valeur initiale, la quantité de données liées au problème que vous souhaitez réellement résoudre n'est pas importante. Vous pourrez peut-être atteindre des performances suffisantes même si elles sont suffisantes. Cela a également pour effet de raccourcir le temps d'apprentissage.
Au fait, lors de la mise au point avec Chainer, je pense que je veux souvent baser le modèle publié sur Caffe's Model Zoo. Dans un tel cas, il est recommandé de convertir d'abord le modèle Caffe en modèle Chainer, puis de copier les paramètres en utilisant la procédure décrite ci-dessous. Cette section décrit comment procéder. À titre d'exemple, utilisez VGG (https://gist.github.com/ksimonan/3785162f95cd2d5fee77#file-readme-md).
Chargez-le en tant que modèle Chainer du modèle Caffe téléchargé avec chainer.links.caffe.CaffeFunction
. Le chargement d'un grand modèle prend beaucoup de temps.
python
from chainer.links.caffe import CaffeFunction
vgg = CaffeFunction('VGG_ILSVRC_19_layers.caffemodel')
Après lecture, vous pouvez accéder à chaque couche et à ses paramètres en tapant `` vgg.conv1_1.W.data '' avec le nom défini du côté Caffe.
Comme il faut du temps pour charger un modèle de Caffe, il est recommandé de sauvegarder le modèle chargé par Caffe Function
comme modèle de Chainer.
À partir de Chainer 1.5, la sérialisation HDF5 est prise en charge. Cependant, pour l'utiliser, la définition de réseau de Chainer est requise par la spécification, mais si vous chargez le modèle Caffe, il est difficile de le créer séparément.
Pour cette raison, c'est une bonne idée de l'enregistrer en utilisant cPickle
.
python
import cPickle as pickle
pickle.dump(vgg, open('vgg.pkl', 'wb'))
Nous allons vous montrer comment copier des paramètres d'un modèle converti à partir de Caffe par la procédure ci-dessus ou d'un autre modèle Chainer entraîné vers un nouveau modèle. La méthode présentée ici est utile lorsque la source et le nouveau modèle ont des configurations réseau partiellement différentes. Si la configuration est exactement la même, la procédure est très simple, il suffit de former le modèle d'origine chargé tel quel et d'enregistrer le modèle mis à jour sous un nom différent.
En passant, il existe les situations suivantes dans lesquelles un réglage fin est effectué en modifiant partiellement la configuration du réseau.
--Remplacez uniquement la couche finale à appliquer aux problèmes avec différentes catégories de classification (utilisez le modèle formé avec, par exemple, ImageNet pour la reconnaissance de scène)
Tout cela peut être réalisé en passant le modèle source et le nouveau modèle à la fonction copy_model
ci-dessous.
Cette fonction recherche le lien (fonction avec paramètres) du modèle d'origine qui porte le même nom que le lien de la destination de copie et la forme du paramètre, et les copie.
Si la chaîne est imbriquée, cela se fait de manière récursive.
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
Vous pouvez désormais copier automatiquement uniquement les pièces communes vers le nouveau modèle avec une configuration différente du modèle d'origine. Ensuite, apprenez le nouveau modèle comme vous le souhaitez!
―― Le réglage fin est une technique très importante dans la pratique.
CaffeFunction
et enregistrez-le avec pickle
.copy_model
, vous pouvez copier les paramètres de la pièce commune au nouveau modèle à partir du modèle d'origine.
――Après cela, faites bouillir ou faites cuire un nouveau modèle!Recommended Posts