如何使用完整 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
.
我在这里可能是错的,但这里是。 我正在使用 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
.