2017-05-25 100 views
2

我正在使用dynamic_rnn和LSTMCell,後者放出一個包含內部狀態的LSTMStateTuple。調用這個對象的重塑(我的錯誤)會導致一個張量,而不會在創建圖表時造成任何錯誤。通過圖形輸入輸入時,我在運行時也沒有出現任何錯誤。在LSTMStateTuple上調用變形將它變成張量

代碼:

cell = tf.contrib.rnn.LSTMCell(size, state_is_tuple=True, ...) 
outputs, states = tf.nn.dynamic_rnn(cell, inputs, ...) 
print(states) # state is an LSTMStateTuple 
states = tf.reshape(states, [-1, size]) 
print(states) # state is a tensor of shape [?, size] 

這是一個錯誤(我問,因爲它沒有記錄任何地方)?什麼是重構張量控制?

回答

0

我已經進行了類似的實驗,它可能給你一些提示:

>>> s = tf.constant([[0, 0, 0, 1, 1, 1], 
        [2, 2, 2, 3, 3, 3]]) 
>>> t = tf.constant([[4, 4, 4, 5, 5, 5],                
        [6, 6, 6, 7, 7, 7]]) 
>>> g = tf.reshape((s, t), [-1, 3]) # <tf.Tensor 'Reshape_1:0' shape=(8, 3) dtype=int32> 
>>> sess.run(g) 
array([[0, 0, 0], 
     [1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5], 
     [6, 6, 6], 
     [7, 7, 7]], dtype=int32) 

我們可以看到,它只是串接兩個張量在第一維和進行整形。由於LSTMStateTuple就像一個namedtuple,所以它和元組的效果相同,我認爲這也是你的情況。

讓我們走的更遠,

>>> st = tf.contrib.rnn.LSTMStateTuple(s, t) 
>>> gg = tf.reshape(st, [-1, 3]) 
>>> sess.run(gg) 
    array([[0, 0, 0], 
      [1, 1, 1], 
      [2, 2, 2], 
      [3, 3, 3], 
      [4, 4, 4], 
      [5, 5, 5], 
      [6, 6, 6], 
      [7, 7, 7]], dtype=int32) 

我們可以看到,如果我們創建一個LSTMStateTuple,結果證實了我們的假設。