un “gel” de certaines variables/étendues dans tensorflow: stop_gradient vs passer des variables à minimiser
Je suis en train de mettre en œuvre Contradictoire NN, ce qui nécessite de "geler" l'une ou l'autre partie du graphique des cours de formation en alternance minibatches. I. e. il y a deux sous-réseaux: G et D.
G( Z ) -> Xz
D( X ) -> Y
où la perte de la fonction de G
dépend D[G(Z)], D[X]
.
J'ai d'abord besoin de former des paramètres D avec tous les G paramètres fixes, puis paramètres dans G avec les paramètres D fixe. La perte de fonction dans le premier cas sera négatif de la perte de fonction dans le second cas, et la mise à jour devra appliquer les paramètres de savoir si la première ou de la deuxième sous-réseau.
J'ai vu que tensorflow a tf.stop_gradient
fonction. Pour les fins de la formation de la D (en aval) de sous-réseau que je peux utiliser cette fonction pour bloquer le flux de gradient de
Z -> [ G ] -> tf.stop_gradient(Xz) -> [ D ] -> Y
La tf.stop_gradient
est très succinctement annoté avec aucun exemple de ligne (et l'exemple seq2seq.py
est trop long et pas facile à lire), mais regarde comme il doit être appelée lors de la création graphique. N'implique que si je veux bloquer/débloquer les flux de gradient en alternant les lots, j'ai besoin de re-créer et re-initialiser le modèle des graphes?
Aussi, il semble que on ne peut pas bloquer le gradient qui coule à travers le G (en amont) le réseau par le biais de tf.stop_gradient
, droit?
Comme une alternative, j'ai vu que l'on peut passer à la liste des variables à l'optimiseur d'appel comme opt_op = opt.minimize(cost, <list of variables>)
, ce qui serait une solution de facilité si l'on peut obtenir toutes les variables dans la portée de chaque sous-réseau. Peut-on obtenir un <list of variables>
pour un tf.portée?
Vous devez vous connecter pour publier un commentaire.
La façon la plus simple pour atteindre cet objectif, comme vous le mentionnez dans votre question, c'est de créer deux optimiseur opérations à l'aide de différents appels à
opt.minimize(cost, ...)
. Par défaut, l'optimiseur utilise toutes les variables detf.trainable_variables()
. Si vous voulez filtrer les variables d'une portée particulière, vous pouvez utiliser l'optionscope
argumenttf.get_collection()
comme suit:tensorboard
, je vois mon graphe d'être doublé, par exemple, je reçoisgradients
etgradients_1
. Est-il les résultats escomptés?@mrry réponse est complètement à droite et peut-être plus générale que ce que je suis sur le point de suggérer. Mais je pense que d'une façon plus simple d'y parvenir est de passer le python référence directement à
var_list
:J'ai un exemple ici: https://gist.github.com/ahwillia/8cedc710352eb919b684d8848bc2df3a
Une autre option que vous pourriez envisager est que vous pouvez définir éducables=False sur une variable. Ce qui signifie qu'il ne sera pas modifié par la formation.
Je ne sais pas si ma démarche a bas côtés, mais j'ai résolu ce problème pour moi avec cette construction:
Donc si
do_gradient = 1
, les valeurs et les gradients de flux de à travers, mais sido_gradient = 0
, les valeurs ne le débit à travers le stop_gradient op, qui sera le gradients de couler en arrière.Pour mon scénario, en accrochant do_gradient jusqu'à un indice d'une random_shuffle tenseur de me laisser au hasard pour former les différentes pièces de mon réseau.