【问题标题】:How to use output of complete LSTM sequence ? tensorflow如何使用完整 LSTM 序列的输出?张量流
【发布时间】:2016-05-10 14:39:57
【问题描述】:

我在这里可能是错的,但在这里。 我正在使用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 单元的输出来预测类别。 我试过用

替换最后一行
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 模型可能不同)

对此的任何想法也表示赞赏。

【问题讨论】:

    标签: python machine-learning tensorflow deep-learning


    【解决方案1】:

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

    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_dim=0。如果您每批次处理多个输入(我猜这对于 RNN 来说不太常见?),那么您的第 0 维是样本 ID,您将需要使用 concat_dim=1

    【讨论】:

    • 非常优雅的答案!你有没有尝试过:将所有输出组合起来进行类预测?我想知道这实际上可以总体上提高预测性能。
    • 我自己没有,但我知道有人将不同时间步长的结果汇总在一起,而不是仅仅从最后一步获取课程,我不相信它会产生任何明显的改进。无论如何,我认为在 OP 案例中,他实际上有一个问题,即每个时间步需要一个输出,所以这对他来说不仅仅是一种优化,而是一种要求。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-05
      • 2018-03-25
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多