2017-10-03 5 views
2

J'essaie de comprendre l'enveloppe cellulaire RNN dans TensorFlow (version 1.3) avec le code suivant (tiré de here).tf.nn.rnn_cell.MultiRNNCell crée une discordance de forme variable?

import tensorflow as tf 
import numpy as np 
tf.reset_default_graph() 
X = np.random.randn(2, 10, 8) 

X[1, 6:] = 0 
X_lengths = [10, 6] 

cell = tf.nn.rnn_cell.LSTMCell(num_units=64, state_is_tuple=True) 
cell = tf.nn.rnn_cell.DropoutWrapper(cell=cell, output_keep_prob=0.5) 

# cell = tf.nn.rnn_cell.MultiRNNCell(cells=[cell] * n, state_is_tuple=True) 
cell = tf.nn.rnn_cell.MultiRNNCell(cells=[cell for _ in range(n)], state_is_tuple=True) 

outputs, last_states = tf.nn.dynamic_rnn(
    cell=cell, 
    dtype=tf.float64, 
    sequence_length=X_lengths, 
    inputs=X) 
result = tf.contrib.learn.run_n(
    {"outputs": outputs, "last_states": last_states}, 
    n=1, 
    feed_dict=None) 
print(result[0]["outputs"].shape) 
print(result[0]["outputs"]) 
... 

La première question est liée à la ligne de code qui implique tf.nn.rnn_cell.MultiRNNCell. Plus précisément, le code s'exécute correctement lorsque n=1 (ce qui signifie qu'une seule couche est réellement générée). Lorsque n>=2 est utilisé, il y a toujours un message d'erreur comme suit (à la fois la ligne d'origine commenté et une autre mise en œuvre dessous ont suggéré here donner les mêmes informations d'erreur):

ValueError: Trying to share variable rnn/multi_rnn_cell/cell_0/lstm_cell/kernel, but specified shape (128, 256) and found shape (72, 256).

Sur la base de mon enquête jusqu'à présent, l'erreur vient à l'appel de fonction tf.nn_dynamic_rnn(). Mais je ne pouvais pas comprendre la raison exacte pour l'instant. Quelqu'un pourrait-il expliquer et donner des directives sur l'utilisation des emballages de cellules RNN?

La deuxième question concerne un message d'AVERTISSEMENT relatif à la dépréciation de la fonction tf.contrib.learn.run_n. Le message suggère également ce qui suit: Utilisez plutôt les utilitaires tf.train.*. Vous pouvez utiliser learn/estimators/estimator.py comme exemple. Je ne pouvais pas non plus trouver un bon moyen d'utiliser les bons utilitaires ici (pardonnez mes connaissances superficielles sur TensorFlow).
Tous les commentaires/suggestions concernant l'une ou l'autre ou les deux questions sont les bienvenus. Merci!

+0

Je vous recommande de poser votre deuxième question séparément. Stack O aime garder chaque question assez atomique. Je crois que la première question a été répondue (le correctif fonctionne sur mon système de toute façon). – Engineero

+0

Merci pour la suggestion. J'ai fait quelques recherches et j'ai trouvé que [CentAu] (https://stackoverflow.com/questions/44418495/replacement-of-tf-contrib-learn-run-n-in-tensorflow-1-0) a posé la même question avant mais n'a pas encore reçu de réponse. Pour ne pas dupliquer la question, peut-être pourriez-vous faire la lumière ici. –

Répondre

0

Vous devez définir votre tableau de cellules différemment à partir de peut-être la version 1.1. Je devine que le code que vous travaillez a été écrit avant cela. Utilisez quelque chose comme:

cells = [] 
for _ in range(n) 
    cell = tf.nn.rnn_cell.LSTMCell(num_units=64, state_is_tuple=True) 
    cell = tf.nn.rnn_cell.DropoutWrapper(cell=cell, output_keep_prob=0.5) 
    cells.append(cell) 
cell = tf.nn.rnn_cell.MultiRNNCell(cells, state_is_tuple=True) 

Le problème est que la syntaxe que vous avez essaye actuellement de réutiliser le même objet celln fois, de sorte que vous exécutez pour quelques problèmes avec les variables de partage. Si vous le faites comme je le suggère, vous définissez chaque cell de façon unique et évitez de partager accidentellement des variables.

+0

Merci Engineero, votre suggestion est juste. Le partage de variables est le problème. Connaissez-vous la solution pour la deuxième question? (J'ai réalisé que vous tapez probablement la réponse pendant que j'édite la deuxième question). –