如何使用完整 LSTM 序列的输出?张量流

How to use output of complete LSTM sequence ? tensorflow

我在这里可能是错的,但这里是。 我正在使用 post.

中的代码

具体是

中的代码
    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']

上面的代码使用了多对一预测方案。

我想知道我是否可以在这段代码中使用多对多方案。 并使用所有 LSTM 单元的输出来预测 class。 我尝试用

替换最后一行
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 来预测 class 该帧属于哪个,然后使用它的密集层特征来训练 LSTM,从而理解帧之间的时间关系单帧,提高识别准确率。

我已经用 CNN 重现了结果,得到单帧精度(table 1:- RGB 单帧)精度为 61%。

我已经从该网络中提取了 (fc-6) 特征并将其作为 LSTM 的输入,但精度并没有提高到 ~71.2%,我得到的 LSTM 精度降低了 51%。不知道为什么会这样。 (我猜可能他们使用的 LSTM 模型不同)

对此的任何想法也很感激。

请注意 outputs 是一个列表而不是张量。

这是一个有趣的想法,如何组合输出取决于您。一种简单的方法可能是:

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

(使用列表理解或其他东西。)

我不确定这是否可以改善预测结果,但很有趣。

要获取所有输出的列表,您可以执行以下操作:

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

这将 return 一个 python 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.