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

Python 如何使用完整LSTM序列的输出?张量流,python,machine-learning,tensorflow,deep-learning,Python,Machine Learning,Tensorflow,Deep Learning,我可能错了,但事情是这样的。 我在这里用的是代码 特别是 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'] 上面的代码使用多对一预测方案 我想知道我是否可以使

我可能错了,但事情是这样的。 我在这里用的是代码

特别是

    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单元的输出来预测类别。 我已试着用替换最后一行

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
文件“/media/anilil/Data/charm/Cnn/trainlstm_ucf.py”,第165行,在
pred=RNN(x,istate,权重,偏差,keep_prob)
文件“/media/anilil/Data/charm/Cnn/train_lstm_ucf.py”,第163行,RNN
返回tf.matmul(输出,_权重['out'])+_偏差['out']
matmul中的文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/ops/math_ops.py”,第938行
a=运算。将_转换为_张量(a,name=“a”)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/framework/ops.py”,第529行,在convert_to_tensor中
ret=conversion\u func(值,dtype=dtype,name=name,as\u ref=as\u ref)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/ops/constant_op.py”,第178行,在_constant_tensor_conversion_函数中
返回常量(v,dtype=dtype,name=name)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/ops/constant_op.py”,第161行,常量
tensor_util.make_tensor_proto(值,dtype=dtype,shape=shape))
文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/framework/tensor_util.py”,第319行,在make_tensor_proto中
_资产可兼容(值、数据类型)
文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/framework/tensor_util.py”,第256行,在_AssertCompatible中
raise TypeError(“需要单个张量时的张量列表”)
TypeError:需要单个张量时的张量列表
背景信息(非重要) 谢谢你的意见。我自己也不确定这种方法是否会产生更好的结果

我正在尝试复制 具体来说,本文的研究成果是

他们所做的是用单个帧训练CNN,以预测该帧属于哪一类,然后使用该帧的密集层特征训练LSTM,从而了解单个帧之间的时间关系并提高识别精度

我用CNN复制了结果,获得了61%的单帧精度(表1:-RGB单帧)

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


请注意,
输出是一个列表,而不是一个张量

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

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]
这将返回TensorFlow张量的python数组,每个输出一个

如果您想要一个串联所有输出的张量,请将此数组传递给
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\u dim=0
。如果您每批处理多个输入(我想这对RNN不太常见?),那么您的第0个维度是样本ID,您需要使用
concat\u dim=1

非常优雅的答案!你有没有尝试过这样的方法:合并所有的输出以进行类预测?我想知道这实际上可以提高总体预测性能。我自己没有,但我知道有人将不同时间段的结果汇总在一起,而不是仅仅从最后一个步骤获得类,我认为这不会产生任何明显的改进。无论如何,我认为在OP的情况下,他实际上有一个问题,要求每个时间步有一个输出,所以这不仅仅是对他的优化,而是一个要求。