2016-05-10 68 views
3

我可能在這裏錯了,但這裏。 我使用的是post中的代碼。如何使用完整LSTM序列的輸出? tensorflow

具體地,在

outputs, states = rnn.rnn(lstm_cell, _X, initial_state=_istate) 

    # Linear activation 
    # Get inner loop last output 
    return tf.matmul(outputs[-1], _weights['out']) + _biases['out'] 

上面的代碼的代碼使用多對一預測方案。

enter image description here

我想知道如果我可以使用多對多的方案與此代碼。 並使用所有LSTM單元的輸出來預測類別。 我試圖與

return tf.matmul(outputs, _weights['out']) + _biases['out'] 

替換最後一行但後來我得到一個錯誤

File "/media/anilil/Data/charm/Cnn/train_lstm_ucf.py", line 165, in <module> 
    pred = RNN(x, istate, weights, biases,keep_prob) 
    File "/media/anilil/Data/charm/Cnn/train_lstm_ucf.py", line 163, in RNN 
    return tf.matmul(outputs, _weights['out']) + _biases['out'] 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_ops.py", line 938, in matmul 
    a = ops.convert_to_tensor(a, name="a") 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 529, in convert_to_tensor 
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/constant_op.py", line 178, in _constant_tensor_conversion_function 
    return constant(v, dtype=dtype, name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/constant_op.py", line 161, in constant 
    tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape)) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_util.py", line 319, in make_tensor_proto 
    _AssertCompatible(values, dtype) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_util.py", line 256, in _AssertCompatible 
    raise TypeError("List of Tensors when single Tensor expected") 
TypeError: List of Tensors when single Tensor expected 

背景信息(非重要)

感謝您的輸入。如果這種方法能產生更好的結果,我不確定自己。

我試圖複製this paper 具體來說就是本文中的activity recognition

他們所做的是用單個幀訓練一個CNN來預測幀屬於哪個類,然後使用它的密集層特徵來訓練LSTM,從而理解單個幀之間的時間關係並改進識別準確度。

我已經複製了CNN的結果,並獲得了61%的單幀精度(表1:-RGB單幀)精度。

我已經從這個網絡中提取了(fc-6)特徵,並將其作爲LSTM的輸入,但是其準確性提高了〜71.2%,我得到的LSTM精度降低了51%。不知道爲什麼會發生。 (可能他們使用的LSTM模型是不同的我的猜測)

任何想法,以及讚賞以及。

回答

5

要獲取所有輸出的列表,你可以做到以下幾點:

return [tf.matmul(output, _weights['out']) + _biases['out'] for output in outputs] 

這將返回TensorFlow張量,每一個輸出的蟒蛇陣列。

相反,如果你想要的串接所有的輸出張量,通過這個數組tf.concat

transformed_outputs = [tf.matmul(output, _weights['out']) + _biases['out'] for output in outputs] 
return tf.concat(concat_dim=0, values=transformed_outputs) 

注意,這裏我用concat_dim=0。如果每批處理多個輸入(對於RNN我不太常見,我猜?),那麼您的第0維是樣本ID,您需要使用concat_dim=1

+0

非常高雅的答案!你有沒有試過這個:將所有輸出結合起來進行類別預測?我想知道這實際上可以改善一般的預測性能。 –

+0

我自己並沒有這樣做,但我認識那些把不同時間步調的成績彙總在一起的人,而不是僅僅從最後一步獲得成績,我不相信這會帶來明顯的改善。 無論如何,我認爲在OP案例中,他實際上有一個問題,每個時間步需要一個輸出,所以這不僅僅是他的優化,而是一個需求。 – Ishamael

1

請注意outputs是一個不是張量的列表。

這是一個有趣的想法,它取決於你如何組合輸出。一個簡單的方法可能是:

return tf.matmul(outputs[1], W[1]) + tf.matmul(outputs[2], W[2]) ... 

(使用列表理解什麼的。)

我不知道這樣可以提高預測結果,但有趣的。