我使用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单元是否正常工作。我会检查并更新
答案 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个通道)