2017-01-30 112 views
0

我試圖在張量流中實現基於LSTM細胞的RNN。我在每一行中都有一個單詞序列,這些單詞組成了一個名爲labels(它是1或0)的特徵和一列作爲目標的列。我在解釋dynamic_RNN的輸出時遇到困難。 dynamic_RNN返回輸出和狀態。 我已經將我的數據分成了256個批次。我已將每行的填充/切片 的統一長度設置爲160.然後將它們嵌入(使用手套),以便每個單詞變成一百維矢量。在這之後,我的每個例子都變成了一個160×100的矩陣,並且每個RNN函數的批次變成一個形狀張量 - (256,160,100)。現在假定LSTM單元格的hidden_​​dimension設置爲300,每個示例(大小160 x 100)的隱藏狀態矢量的預期維度爲1 x 300.但是,當我檢查rnn_states.h的形狀時,我得到以下 -解釋tensorflow輸出的困難dynamic_rnn

我期待的尺寸是256 x 300.我不知道如何繼續下去。

我在下面添加了一些代碼,我使用了它們的形狀。我有兩個張量 - train_contexttrain_utterance。我選擇每個樣本128個,之後嵌入並連接它們以形成256個輸入批次。你能告訴我我哪裏出錯了嗎?

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)]) 

我無法弄清楚,爲什麼尺寸無X 300。我期待它是提前256×300感謝。

回答

1

get_shape是最好的努力。一般來說,Tensorflow並不總是知道圖表構建時的張量大小。 None僅僅意味着在施工時維度是未知的。

唯一可以保證的方式找到從Python中的張量的形狀是運行的曲線圖(例如,經由session.run().eval())到張量評估爲特定的值,其形狀可以檢查。

(如果你想在圖形中消耗的形狀,也有tf.shape。)

希望幫助!