Dies ist der dritte Beitrag zu Qiita. (Artikel 3)
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.
-OS: macOS Catalina (Version 10.15.1) ・ Python: 3.5.4 ・ Nnabla: 1.3.0
Das Beispielnetzwerk ist unten definiert. (Wie Letztes Mal bisher)
article3_add_layer.py
import nnabla as nn
import nnabla.functions as F
# [define network]
x = nn.Variable()
y = F.add_scalar(x, 0.5) # <-- (1)weit
y = F.mul_scalar(y, -2)
Es ist einfach in Form von $ y = (x + 0,5) \ times2 $.
Letztes Mal $ y = (x + 0,5) \ times2 $ über $ y = (x + 0,5) ^ 2 \ times2 unter Verwendung des oben erläuterten Inhalts Ich werde Ihnen zeigen, wie Sie es in $ ändern können. Der Code ist unten.
article3_add_layer.py
# [get middle variable]
h1 = y.parent.inputs[0]
additional_layer = F.pow_scalar(h1, 2.0)
redefine_layer = F.mul_scalar(additional_layer, **y.parent.info.args)
# [rewire_on]
y.rewire_on(redefine_layer)
Die Funktionsprüfung wurde unten kurz vor rewire_on oben durchgeführt, wobei dazwischen gedruckt wurde.
article3_add_layer.py
def print_func(f):
print('{} output = {}'.format(f.name, f.outputs[0].d))
# [print & forward]
x.d.fill(0)
y.forward()
print('--- before ---')
y.visit(print_func)
print('y.d = {}'.format(y.d))
print('')
# [rewire_on]
y.rewire_on(redefine_layer)
# [print & forward]
y.forward()
print('--- after ---')
y.visit(print_func)
print('y.d = {}'.format(y.d))
print('')
Ausgabe
--- before ---
AddScalar output = 0.5
MulScalar output = -1.0
y.d = -1.0
--- after ---
AddScalar output = 0.5
PowScalar output = 0.25
MulScalar output = -0.5
y.d = -0.5
h1 = y.parent.inputs [0]
erhält den Teil (1).Additional_layer = F.pow_scalar (h1, 2.0)
definiert die neue Ebene, die Sie nach (1) hinzufügen wollten.y.parent.info.args
repräsentiert die mul_scalar-Ebene im y.parent
-Teil, und .info.args
erhält die Argumente, die dieser Ebene gegeben wurden. Das heißt, Sie können damit genau dieselbe mul_scalar-Ebene wie eine vorhandene mul_scalar-Ebene definieren.y.rewire_on (redefine_layer)
den Ausgabeknoten redefine_layer
der im Berechnungsgraphen neu definierten Schicht mit y
, um die gewünschte Operation abzuschließen.Ich habe vorgestellt, wie man eine neue Ebene einfügt. Sie können es auch verwenden, um eine Quantisierungsebene in die Ausgabe jeder Aktivierung eines vorhandenen trainierten Modells einzufügen oder um Faltung + Chargennormalisierung in eine einzelne Faltung zu falten. Nächstes Mal werde ich auf diesen Bereich eingehen.
Recommended Posts