[PYTHON] [NNabla] Comment ajouter une couche de quantification à la couche intermédiaire d'un modèle entraîné

introduction

Ceci est le 4ème message de qiita. (article4) Dans la continuité de la dernière fois, alors que j'utilisais nnabla, j'ai réussi à me sentir comme "J'aurais aimé avoir ce genre d'informations dans qiita" Résumé de ce que j'ai trouvé dans la référence nnabla et dir () (fonction python standard, qui renvoie des variables membres et des fonctions d'arguments) Je vais.

1. Exigences

-OS: macOS Catalina (version 10.15.1) ・ Python: 3.5.4 ・ Nnabla: 1.3.0

2. Préparez le réseau formé

Cette fois, à partir du modèle entraîné de Nnabla, utilisez MobileNet_v1 comme suit.

article4_add_quantization_for_network.py


import nnabla as nn
import nnabla.functions as F
import nnabla.parametric_functions as PF
from nnabla.models.imagenet import MobileNet

if __name__ == "__main__":
    # [load network]
    mobilenet = MobileNet()
    nnp = mobilenet.nnp
    net = nnp.get_network('Runtime', batch_size=1)
    y =  net.outputs['y\'']

Commentaire

3. Ajoutez une couche de quantification au modèle entraîné

Ajoutez une couche de quantification à chaque activation, mise en commun et affiliation (sortie d'identification) de mobilenet_v1 obtenu ci-dessus. Le code réel est ci-dessous.

article4_add_quantization_for_network.py


class AddQuantizeLayer:
    def __init__(self, _net):
        self.net = _net

    def add_quantize_layer_all(self):
        # [quantize]
        count = 0
        for key in self.net.variables:
            var = self.net.variables[key]
            func = var.parent
            if type(func) != type(None):
                if func.info.type_name in ['ReLU', 'AveragePooling', 'Affine']:
                    count = self.add_quantize_layer_one(var, count)

    def add_quantize_layer_one(self, _var, _count):
        var_out_cur = _var.function_references[0].outputs[0]
        # [quantize]
        q_out = PF.min_max_quantize(_var, ql_min=0, ql_max=255, x_min_max=True, name='MinMaxQuantize_{}'.format(_count))
        # [redefine function]
        var_out_new = self.redefine_layer(var_out_cur.parent, q_out)
        var_out_cur.rewire_on(var_out_new)
        return _count + 1

    @staticmethod
    def redefine_layer(_func, _input):
        if _func.info.type_name == 'DepthwiseConvolution':
            return F.depthwise_convolution(_input, *_func.inputs[1:], **_func.info.args)
        elif _func.info.type_name == 'Convolution':
            return F.convolution(_input, *_func.inputs[1:], **_func.info.args)
        elif _func.info.type_name == 'AveragePooling':
            return F.average_pooling(_input, **_func.info.args)
        elif _func.info.type_name == 'Affine':
            return F.affine(_input, *_func.inputs[1:], **_func.info.args)
        elif _func.info.type_name == 'Softmax':
            return F.softmax(_input, **_func.info.args)
        else:
            print('[error] redefine_layer()')
            print('_func is unexpected layer.')
            print('_func.info.type_name = {}'.format(_func.info.type_name))
            exit(0)

# [quantize]
AddQuantizeLayer_class = AddQuantizeLayer(net)
AddQuantizeLayer_class.add_quantize_layer_all()

Le contrôle de fonctionnement a été effectué ci-dessous.

article4_add_quantization_for_network.py


def print_func(f):
    print('{}'.format(f.name))

print('----- before -----')
y.visit(print_func)
print('')

# [quantize]
AddQuantizeLayer_class = AddQuantizeLayer(net)
AddQuantizeLayer_class.add_quantize_layer_all()

print('----- after -----')
y.visit(print_func)
print('')

Puisque la sortie est longue, certaines parties seront omises, mais elles seront sous la forme suivante. En tant que changement, MinMaxQuantize (couche de quantification) est ajouté après ReLU, ʻAveragePooling et ʻAffine.

----- before -----
ImageAugmentation
MulScalar
AddScalar
Convolution
BatchNormalization
ReLU
DepthwiseConvolution
BatchNormalization
ReLU
Convolution
...(Ce qui suit est omis)...

----- after -----
ImageAugmentation
MulScalar
AddScalar
Convolution
BatchNormalization
ReLU
MinMaxQuantize
DepthwiseConvolution
BatchNormalization
ReLU
MinMaxQuantize
Convolution
...(Ce qui suit est omis)...

Commentaire

4. Résumé

En utilisant le contenu publié jusqu'à Dernière fois, j'ai présenté comment ajouter une couche de quantification à un réseau existant. On ne sait pas quoi publier la prochaine fois.

Recommended Posts

[NNabla] Comment ajouter une couche de quantification à la couche intermédiaire d'un modèle entraîné
[NNabla] Comment ajouter une nouvelle couche entre les couches intermédiaires d'un réseau pré-construit
[NNabla] Comment obtenir la sortie (variable) de la couche intermédiaire du réseau construit
[NNabla] Comment supprimer le niveau intermédiaire d'un réseau prédéfini
Comment calculer la volatilité d'une marque
La décision de scikit-learn Comment visualiser un modèle en bois
[Ubuntu] Comment supprimer tout le contenu du répertoire
J'ai fait une fonction pour vérifier le modèle de DCGAN
Comment trouver le coefficient de mise à l'échelle d'une ondelette bipolaire
Comment connecter le contenu de la liste dans une chaîne de caractères
Comment déterminer l'existence d'un élément sélénium en Python
Comment vérifier la taille de la mémoire d'une variable en Python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
Comment afficher le résultat de sortie de la commande man Linux dans un fichier
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
Comment prendre une capture d'écran de l'écran Chrome (l'empêcher de se couper au milieu)
Apprenez le flux de l'estimation bayésienne et comment utiliser Pystan grâce à un modèle de régression simple
Comment ajouter un package avec PyCharm
Comment vérifier la version de Django
Obtenez la valeur de la couche intermédiaire de NN
Ajouter une couche à l'aide du backend Keras
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Comment mettre un numéro de ligne au début d'un fichier CSV
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
Comment lire une vidéo tout en regardant le nombre d'images (Mac)
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Comment trouver la zone du diagramme de Boronoi
Comment mentionner un groupe d'utilisateurs avec une notification de mou, comment vérifier l'ID d'un groupe d'utilisateurs
Comment obtenir le "nom" d'un champ dont la valeur est limitée par l'attribut choice dans le modèle Django
Visualisez la couche interne du réseau neuronal
Publication d'un modèle entraîné de fastText
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
[python] Comment trier par le Nth Mth élément d'un tableau multidimensionnel
Comment ajouter un chemin de recherche de module Python
Un mémorandum expliquant comment exécuter la commande magique! Sudo dans Jupyter Notebook
Je veux ajouter du silence pendant 1 seconde au début d'un fichier wav
[Numpy, scipy] Comment calculer la racine carrée d'une matrice Elmeet à valeur semi-régulière
Comment faire un Raspberry Pi qui parle les tweets d'un utilisateur spécifié
[PyTorch] Exemple ⑧ ~ Comment créer un modèle complexe ~
[Wagtail] Ajouter une page de connexion au projet Wagtail
Comment obtenir une liste de fichiers dans le même répertoire avec python
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
Comment afficher la date de modification d'un fichier en langage C jusqu'à nanosecondes
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
[Ruby] Comment remplacer uniquement une partie de la chaîne de caractères correspondant à l'expression régulière?
Comment vérifier en Python si l'un des éléments d'une liste est dans une autre liste
L'explication la plus simple au monde sur la création de LINE BOT (1) [Account preparation]
Un mémo sur la façon de surmonter le problème difficile de la capture d'effets avec l'IA
Une histoire sur la tentative d'introduire Linter au milieu d'un projet Python (Flask)
Comment changer l'image générée de GAN en une image de haute qualité à votre goût
Ajouter une fonction pour indiquer la météo d'aujourd'hui au bot slack (fabriqué par python)
Lire la source Python-Markdown: Comment créer un analyseur
Comment connaître le numéro de port du service xinetd
Comment écrire une interface graphique à l'aide de la commande maya
Comment obtenir le nombre de chiffres en Python