5 votes

tf.get_variable n'accepte pas les tenseurs pour la forme

Il semble que tf.get_variable n'accepte pas un Tensor pour la forme, seulement int . Ceci est différent tf.Variable qui peut accepter Tensors . Est-ce correct, et si oui, existe-t-il une solution de contournement pour obtenir tf.get_variable pour fonctionner lorsque la forme est un Tensor ? Je ne veux pas courir session à ce stade de la construction du graphe, car cela compliquerait beaucoup de choses en aval.

J'essaie d'utiliser les liaisons cuDNN pour les RNN, ce qui implique d'appeler params_size() sur un modèle créé à l'aide de CudnnLSTM . Cela renvoie le nombre de paramètres à conserver dans le tampon de paramètres sous la forme de Tensor qui est ensuite utilisé pour créer la variable qui contient les paramètres. Au lieu d'utiliser tf.Variable avec tous ses avertissements, j'aimerais utiliser tf.get_variable pour contenir les valeurs des paramètres, de sorte que je puisse facilement les initialiser en utilisant tous les divers initialisateurs compatibles avec tf.get_variable etc. Toutes les nouvelles machines sont construites autour tf.get_variable et de devoir revenir au niveau inférieur. tf.Variable est très encombrant. Cela semble être une limitation très étrange de tf.get_variable de ne pas accepter Tensors quand tf.Variable fait.

0voto

P-Gn Points 10410

La solution de contournement consiste à fournir un initialisateur qui a une forme, mais une forme dynamique. Par exemple, au lieu de

s = tf.placeholder(tf.int32, shape=())
init = tf.random_normal_initializer()
tf.get_variable('foo', shape=(s,), initializer=init) # error, shape cannot be a Tensor

vous utiliseriez

s = tf.placeholder(tf.int32, shape=())
init = tf.random_normal((s,))
tf.get_variable('foo', initializer=init, validate_shape=False)

Notez cependant que l'initialisation de la variable est maintenant délicate. Appeler tf.global_variables_initializer() va tenter d'initialiser 'foo' Vous devez donc vous assurer qu'il peut être initialisé (en fournissant certaines valeurs si nécessaire) ou gérer l'initialisation vous-même.

Une autre solution consiste à initialiser votre variable à n'importe quelle valeur (par exemple un scalaire de zéro), puis de la remplacer par la variable suivante tf.assign une valeur avec la forme souhaitée lorsque la forme est connue. Il est un peu plus facile de travailler avec cette méthode lors de l'initialisation puisque la valeur initiale est rejetée après que le fir assign Il peut donc constituer une bonne alternative.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X