[PYTHON] [NNabla] Hinzufügen einer Quantisierungsschicht zur mittleren Schicht eines trainierten Modells

Einführung

Dies ist der 4. Beitrag zu Qiita. (Artikel 4) Als ich von letztes Mal fortfuhr, während ich nnabla verwendete, fühlte ich mich wie "Ich wünschte, ich hätte diese Art von Informationen in Qiita" Zusammenfassung dessen, was ich in der nnabla-Referenz gefunden habe und dir () (Standard-Python-Funktion, die Mitgliedsvariablen und Funktionen von Argumenten zurückgibt) Ich werde.

1. Anforderungen

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

2. Bereiten Sie das trainierte Netzwerk vor

Verwenden Sie dieses Mal aus Nnablas geschultem Modell MobileNet_v1 wie folgt.

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\'']

Kommentar

3. Fügen Sie dem trainierten Modell eine Quantisierungsebene hinzu

Fügen Sie jeder oben erhaltenen Aktivierung, Pooling und Affiliate (Identifizierungsausgabe) von mobilet_v1 eine Quantisierungsschicht hinzu. Der tatsächliche Code ist unten.

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

Die Funktionsprüfung wurde unten durchgeführt.

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

Da die Ausgabe lang ist, werden einige Teile weggelassen, aber in der folgenden Form. Zur Änderung wird "MinMaxQuantize" (Quantisierungsschicht) nach "ReLU", "AveragePooling", "Affine" hinzugefügt.

----- before -----
ImageAugmentation
MulScalar
AddScalar
Convolution
BatchNormalization
ReLU
DepthwiseConvolution
BatchNormalization
ReLU
Convolution
...(Folgendes wird weggelassen)...

----- after -----
ImageAugmentation
MulScalar
AddScalar
Convolution
BatchNormalization
ReLU
MinMaxQuantize
DepthwiseConvolution
BatchNormalization
ReLU
MinMaxQuantize
Convolution
...(Folgendes wird weggelassen)...

Kommentar

4. Zusammenfassung

Unter Verwendung des Inhalts, der bis zu Letztes Mal veröffentlicht wurde, wurde das Hinzufügen einer Quantisierungsschicht zu einem vorhandenen Netzwerk vorgestellt. Es ist unentschlossen, was das nächste Mal gepostet werden soll.

Recommended Posts

[NNabla] Hinzufügen einer Quantisierungsschicht zur mittleren Schicht eines trainierten Modells
[NNabla] So fügen Sie eine neue Ebene zwischen den mittleren Ebenen eines vorgefertigten Netzwerks hinzu
[NNabla] So erhalten Sie die Ausgabe (Variable) der mittleren Schicht des erstellten Netzwerks
[NNabla] So entfernen Sie die mittlere Ebene eines vorgefertigten Netzwerks
So berechnen Sie die Volatilität einer Marke
Die Entscheidung von scikit-learn Wie man ein Holzmodell visualisiert
[Ubuntu] So löschen Sie den gesamten Inhalt des Verzeichnisses
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
So ermitteln Sie den Skalierungskoeffizienten eines bipolaren Wavelets
So verbinden Sie den Inhalt der Liste mit einer Zeichenfolge
So bestimmen Sie die Existenz eines Selenelements in Python
So überprüfen Sie die Speichergröße einer Variablen in Python
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
So ermitteln Sie die Speicheradresse des Pandas-Datenrahmenwerts
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
So machen Sie einen Screenshot des Chrome-Bildschirms (verhindern Sie, dass er in der Mitte abgeschnitten wird)
Erfahren Sie anhand eines einfachen Regressionsmodells den Ablauf der Bayes'schen Schätzung und die Verwendung von Pystan
So fügen Sie ein Paket mit PyCharm hinzu
So überprüfen Sie die Version von Django
Ermitteln Sie den Wert der mittleren Schicht von NN
Fügen Sie mithilfe des Keras-Backends eine Ebene hinzu
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
So setzen Sie eine Zeilennummer am Anfang einer CSV-Datei
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
So spielen Sie ein Video ab, während Sie die Anzahl der Bilder ansehen (Mac)
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
So finden Sie den Bereich des Boronoi-Diagramms
Wie man eine Benutzergruppe mit Slack-Benachrichtigung erwähnt, wie man die ID einer Benutzergruppe überprüft
So erhalten Sie den "Namen" eines Feldes, dessen Wert durch das Auswahlattribut im Django-Modell begrenzt ist
Visualisieren Sie die innere Schicht des neuronalen Netzwerks
Veröffentlichung eines geschulten Modells von fastText
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
[Python] So sortieren Sie nach dem N-ten M-ten Element eines mehrdimensionalen Arrays
So fügen Sie einen Suchpfad für Python-Module hinzu
Ein Memorandum zur Ausführung des Befehls! Sudo magic in Jupyter Notebook
Ich möchte dem Anfang einer WAV-Datei 1 Sekunde lang Stille hinzufügen
[Numpy, scipy] Wie berechnet man die Quadratwurzel einer Elmeet-Matrix mit halbregelmäßigem Wert?
So erstellen Sie einen Raspberry Pi, der die Tweets eines bestimmten Benutzers spricht
[PyTorch] Beispiel ⑧ ~ So erstellen Sie ein komplexes Modell ~
[Bachstelze] Fügen Sie dem Bachstelzenprojekt eine Anmeldeseite hinzu
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
So zeigen Sie das Änderungsdatum einer Datei in C-Sprache bis zu Nanosekunden an
Wie identifiziere ich das Element mit der geringsten Anzahl von Zeichen in einer Python-Liste?
[Ruby] Wie ersetze ich nur einen Teil der Zeichenkette, der mit dem regulären Ausdruck übereinstimmt?
So überprüfen Sie in Python, ob sich eines der Elemente einer Liste in einer anderen Liste befindet
Die weltweit am einfachsten zu verstehende Erklärung zur Herstellung von LINE BOT (1) [Kontoerstellung]
Ein Memo darüber, wie man das schwierige Problem der Erfassung von FX mit AI überwinden kann
Eine Geschichte über den Versuch, Linter mitten in einem Python (Flask) -Projekt vorzustellen
So ändern Sie das generierte Bild von GAN in ein qualitativ hochwertiges Bild nach Ihren Wünschen
Fügen Sie eine Funktion hinzu, um dem Wetter heute mitzuteilen, dass der Bot locker ist (hergestellt von Python).
Lesen Sie die Python-Markdown-Quelle: So erstellen Sie einen Parser
Wie man die Portnummer des xinetd-Dienstes kennt
So schreiben Sie eine GUI mit dem Befehl maya
So ermitteln Sie die Anzahl der Stellen in Python