如何在RNN中输入CNN输出作为输入序列(使用Tensorflow)

时间:2017-11-13 08:23:31

标签: python tensorflow rnn

我使用tensorflow实现了一个简单的CNN。到目前为止,我曾经在最后一个卷积层放置一个大小为2的完全连接层,以区分我的2个类。 现在我想将最后一个卷积层提供给RNN然后执行分类。

最后一个卷积层的输出称为“cnn_output”,并且是该形式的张量
<tf.Tensor 'Sigmoid_1:0' shape=(?, 168, 32) dtype=float32>

在将它送到rnn之前我用这个命令拆分它:
input_series = tf.split(axis=2, num_or_size_splits= 32, value = cnn_output)

分裂的结果是该类型的32张量:
<tf.Tensor 'split:0' shape=(?, 168, 1) dtype=float32>

rnn的变量定义如下:
cell = tf.contrib.rnn.BasesLSTMCell(32, state_is_tuple=True)
cell_state = tf.placeholder(tf.float32, [168,32])
hidden_state = tf.placeholder(tf.float32, [168,32])
init_state = tf.contrib.rnn.LSTMStateTuple( cell_state, hidden_state)

将cnn的输出提供给rnn我使用此命令
states_series, current_state = tf.nn.static_rnn(cell, input_series, init_state)

在此行我收到以下错误

ValueError: linear is expecting 2D arguments: [TensorShape([Dimension(None), Dimension(168), Dimension(1)]), TensorShape([Dimension(168), Dimension(32)])]
对我而言,张力的第一个未知维度似乎有问题,但我不知道如何处理它。
我尝试将cell_state和hidden_​​state的形状更改为[None,168,32],但似乎没有帮助。
我也尝试使用dynamic_rnn(不确定与static_rnn的区别)但是也没有用

编辑更新: 我设法通过使用此命令重新整形rnn的input_series来运行代码而不会出现错误:

input_series = [tf.reshape(ipt,[-1,168 ])for ipt in input_series]

导致像这样的张量

<tf.Tensor 'Reshape_21:0' shape=(?, 168) dtype=float32>

虽然我还不确定rnn单元是否正常工作。我会检查并更新

1 个答案:

答案 0 :(得分:0)

我认为您的错误来自于占位符是2D而不是3D的事实。您忘了添加批量维度。

尝试像这样定义它们:

cell_state = tf.placeholder(tf.float32, [None,168,32])
hidden_state = tf.placeholder(tf.float32, [None,168,32])

(您可能需要将32更改为1,因为您的输入每个都有1个通道)