Ceci est le troisième message de qiita. (article3)
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.
-OS: macOS Catalina (version 10.15.1) ・ Python: 3.5.4 ・ Nnabla: 1.3.0
L'exemple de réseau est défini ci-dessous. (Identique à Dernière fois jusqu'à présent)
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)loin
y = F.mul_scalar(y, -2)
C'est simplement sous la forme $ y = (x + 0,5) \ times2 $.
Dernière fois $ y = (x + 0.5) \ times2 $ above $ y = (x + 0.5) ^ 2 \ times2 en utilisant le contenu expliqué ci-dessus Je vais vous montrer comment le changer en $. Le code est ci-dessous.
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)
La vérification du fonctionnement a été effectuée ci-dessous juste avant rewire_on ci-dessus, avec impression entre les deux.
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('')
production
--- 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]
récupère la partie (1).à la sortie de mul_scalar, mul_scalar lui-même sera écrasé et disparaîtra, donc
redefine_layer = F.mul_scalar (additional_layer, ** y.parent.info.args)` sera utilisé comme l'existant. Redéfinissez exactement la même couche mul_scalar et écrasez le mul_scalar existant pour obtenir le comportement souhaité.y.parent.info.args
représente la couche mul_scalar dans la partie y.parent
, et .info.args
obtient les arguments donnés à cette couche. Autrement dit, vous pouvez l'utiliser pour définir exactement la même couche mul_scalar qu'une couche mul_scalar existante.y.rewire_on (redefine_layer)
, écrasez le nœud de sortie redefine_layer
de la couche redéfinie sur le graphe de calcul par y
pour terminer l'opération souhaitée.rewire_on
? , Quelle est chaque sortie? Je sortie cela. En tant que couche, pow_scalar a augmenté et je pense que les chiffres sont conformes à la formule.J'ai présenté comment insérer un nouveau calque. Vous pouvez également l'utiliser pour insérer une couche de quantification dans la sortie de chaque activation d'un modèle entraîné existant, ou pour convoluer Convolution + Normalisation par lots en une seule Convolution. La prochaine fois, je parlerai de ce domaine.
Recommended Posts