[英]How to feed CNN output as input series in a RNN (using Tensorflow)
我已经使用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单元是否正常工作。 我将检查并更新
我认为您的错误来自您的占位符是2D而非3D的事实。 您忘记添加批次尺寸。
尝试这样定义它们:
cell_state = tf.placeholder(tf.float32, [None,168,32])
hidden_state = tf.placeholder(tf.float32, [None,168,32])
(鉴于您的输入各有1个通道,您可能必须将32更改为1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.