[PYTHON] Meilleures pratiques personnelles lors de la mise au point avec Chainer

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.

Réglage fin

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.

Conversion d'un modèle Caffe en modèle Chainer

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).

1. Chargez le modèle Caffe

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.

2. Enregistrer en tant que modèle Chainer

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'))

Copier les paramètres dans un nouveau modèle

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!

Résumé

―― Le réglage fin est une technique très importante dans la pratique.

Recommended Posts

Meilleures pratiques personnelles lors de la mise au point avec Chainer
Meilleures pratiques pour manipuler les données avec les pandas
Modèle de bonnes pratiques personnelles à utiliser lorsque vous souhaitez créer MVP avec Flask
La fonction Lambda déploie les meilleures pratiques avec CircleCI + Lamvery
Seq2Seq (1) avec chainer
Meilleures pratiques personnelles pour l'environnement de développement Python basé sur VS Code
Utiliser tensorboard avec Chainer
Précautions lors de l'utilisation de Chainer