2017-01-30 2 views
0

J'essaie de mettre en œuvre un RNN basé sur des cellules LSTM en tensorflow. J'ai une séquence de mots dans chaque rangée qui forme les caractéristiques et une colonne nommée labels (qui est soit 1 ou 0) qui sert de cible. Je suis confronté à des difficultés dans l'interprétation des sorties de dynamic_RNN. Le dynamic_RNN renvoie les sorties et les états. Je ai divisé mes données en lots de 256. J'ai rembourré/coupé chaque rangée pour avoir une longueur uniforme de 160. Je les ai ensuite incorporés (en utilisant un gant) de sorte que chaque mot devient un vecteur de cent dimensions. Après cela mon chaque exemple se transforme en une matrice de 160 par 100, et chaque lot à la fonction RNN devient un tenseur de forme - (256, 160, 100). Maintenant que la dimension hidden_dimension de la cellule LSTM est fixée à 300, la dimension attendue du vecteur d'état caché pour chaque exemple (de taille 160 x 100) est 1 x 300. Cependant, lorsque je vérifie la forme de rnn_states.h, je reçois ce qui suit Je m'attendais à ce que les dimensions soient de 256 x 300. Je ne suis pas sûr de savoir comment aller plus loin.Difficulté à interpréter la sortie de tensorflow's dynamic_rnn

J'ajoute du code ci-dessous que j'ai utilisé et leurs formes. J'ai deux tenseurs - train_context et train_utterance. Je prends 128 échantillons de chaque, les incorporer et les concaténer plus tard pour former un lot d'entrée de 256. Pouvez-vous me dire où je vais mal?

train_context.get_shape() 
# TensorShape([Dimension(128), Dimension(160)]) 

train_utterance.get_shape() 
# TensorShape([Dimension(128), Dimension(160)]) 

context_embedded = tf.cast(tf.nn.embedding_lookup(embeddings_W,\ 
train_context, name="embed_context"), dtype = tf.float64) 

utterance_embedded = tf.cast(tf.nn.embedding_lookup(embeddings_W,\ 
train_utterance, name="embed_utterance"), dtype = tf.float64) 

context_embedded.get_shape() 
# TensorShape([Dimension(128), Dimension(160), Dimension(100)]) 
utterance_embedded.get_shape() 
# TensorShape([Dimension(128), Dimension(160), Dimension(100)]) 

inputs = tf.concat(0, [context_embedded, utterance_embedded]) 
inputs.get_shape() 
# TensorShape([Dimension(256), Dimension(160), Dimension(100)]) 

cell = tf.nn.rnn_cell.LSTMCell(300, forget_bias=2.0, use_peepholes=True,\ 
state_is_tuple=True) 

cell.state_size 
# LSTMStateTuple(c=300, h=300) 

rnn_outputs, rnn_states = tf.nn.dynamic_rnn(cell, inputs, dtype=tf.float64,\ 
parallel_iterations=64, time_major=False) 


rnn_states.h.get_shape() 
# TensorShape([Dimension(None), Dimension(300)]) 

Je ne suis pas en mesure de comprendre pourquoi la dimension est Aucun x 300. Je me attendais que ce soit 256 x 300. Merci à l'avance.

Répondre

1

get_shape est le meilleur effort. En général, Tensorflow ne connaît pas toujours les tailles des tenseurs au moment de la construction du graphique. None signifie simplement que la dimension est inconnue au moment de la construction.

La seule façon garantie de trouver la forme d'un Tensor de Python est d'exécuter le graphique (par exemple, par l'intermédiaire session.run() ou .eval()) pour évaluer un Tensor à une valeur spécifique, dont la forme vous pouvez inspecter.

(Si vous voulez consommer la forme dans le graphique, il y a aussi tf.shape.)

Hope that helps!