Ceci est le deuxième message de qiita. (article2)
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)
article2_rewire_on.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.0)
C'est simplement sous la forme $ y = (x + 0,5) \ times2 $.
A ce moment, la variable y est une variable qui a le résultat de la formule ci-dessus, et le résultat de F.add_scalar (x, 0.5)
, qui est un calcul intermédiaire, est appelé (1).
Je vais vous expliquer comment supprimer (1) ci-dessus et définir simplement $ y = x \ times2 $.
Il utilise la variable membre rewire_on
de nnabla.Variable
dans la référence nnabla. Ceci est également (relativement) facile à comprendre en référence. Je l'ai pratiqué ci-dessous.
article2_rewire_on.py
h1 = y.parent.inputs[0] # = (1)
x.rewire_on(h1)
Le contrôle de fonctionnement a été effectué ci-dessous.
article2_rewire_on.py
# [check func for visit]
def get_func_name(f):
print(f.name)
print('--- before ---')
y.visit(get_func_name)
print('')
# [rewire_on]
h1 = y.parent.inputs[0] # = (1)
x.rewire_on(h1)
print('--- after ---')
y.visit(get_func_name)
print('')
production
--- before ---
AddScalar
MulScalar
--- after ---
MulScalar
h1
ci-dessus. Voir Last pour une explication détaillée à ce sujet.h1
disparaît avec x.rewire_on (h1)
. Pour être précis, il semble que «h1» soit remplacé par «x» sur le graphe de calcul. La description peut être comprise à partir du code, mais lorsque le graphe de calcul est divisé en un graphe partiel qui se connecte à l'entrée avec le nœud qui rewire_on
comme point de départ et le point final, et un graphe partiel qui est transmis à la sortie,[point de départ côté sortie] .rewire_on ([entrée Point final sur le côté])
. (Comme il est difficile de comprendre avec des mots, j'aimerais publier un chiffre bientôt.)visite
utilisée précédente, les noms de couches de toutes les couches sont affichés par get_func_name (f)
. En conséquence, après rewire_on
, ʻAddScalar` qui calcule (1) a disparu, donc l'opération souhaitée a été confirmée.Vous pouvez utiliser rewire_on
non seulement pour supprimer le calque intermédiaire, mais aussi pour insérer un nouveau calque. J'ai réussi à le faire moi-même, mais je me suis dit "Je voulais que quelqu'un écrive quelque chose comme qiita", alors je l'écrirai la prochaine fois.