CNN功能(尺寸)提供给LSTM Tensorflow

时间:2018-05-03 13:40:08

标签: tensorflow lstm convolution

所以最近我正在开展一个项目,我应该把图像作为CNN的输入并提取功能并将它们提供给LSTM进行培训。我正在使用2层CNN进行特征提取,并且我将这些特征形成为完全连接的层,并尝试将它们提供给LSTM。问题是当我想将FC层作为输入提供给LSTM时,我得到关于错误维度的错误。我的FC层是具有(128,1024)维度的Tensor。我尝试重塑它像tf.reshape(fc,[ - 1])这给了我一个张量好(131072,) 维度仍然不会工作。任何人都可以给我任何关于如何将FC提供给LSTM的想法吗?在这里我只写了部分代码并且我得到了错误。

带有32个滤镜的卷积层,内核大小为5

conv1 = tf.layers.conv2d(x, 32, 5, activation=tf.nn.relu)
# Max Pooling (down-sampling) with strides of 2 and kernel size of 2
conv1 = tf.layers.max_pooling2d(conv1, 2, 2)

# Convolution Layer with 32 filters and a kernel size of 5
conv2 = tf.layers.conv2d(conv1, 64, 3, activation=tf.nn.relu)
# Max Pooling (down-sampling) with strides of 2 and kernel size of 2
conv2 = tf.layers.max_pooling2d(conv2, 2, 2)

# Flatten the data to a 1-D vector for the fully connected layer
fc1 = tf.contrib.layers.flatten(conv2)

# Fully connected layer (in contrib folder for now)
fc1 = tf.layers.dense(fc1, 1024)
# Apply Dropout (if is_training is False, dropout is not applied)
fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training)
s = tf.reshape(fc1, [1])
rnn_cell = rnn.BasicLSTMCell(n_hidden, forget_bias=1.0)
outputs, states = rnn.static_rnn(rnn_cell, s, dtype=tf.float32)
return tf.matmul(outputs[-1], rnn_weights['out']) + rnn_biases['out']

这是错误: ValueError:无法使用131072个元素重新形成张量,以便为输入形状的“ConvNet / Reshape”(op:'Reshape')形成[1](1个元素):[128,1024],[1]并将输入张量计算为部分形状:输入[1] = [1]。

1 个答案:

答案 0 :(得分:2)

您在解决问题时遇到了逻辑错误。将数据折叠到1D张量不会解决任何问题(即使你让它正常工作)。

如果您将一系列图像作为输入,则输入张量应为5D(批处理,sequence_index,x,y,通道)或类似的排列。 conv2d应该抱怨额外的维度,但你可能错过了其中一个。你应该先尝试修复它。

接下来使用conv3d和max_pool3d,窗口为1,深度(因为你不希望不同的帧在这个阶段进行交互)。

当你完成后你应该仍然有5D张量,但是x和y尺寸应该是1(你应该检查一下,如果不是这样的话,修复操作。)

RNN部分需要3D张量(batch,sequence_index,fature_index)。您可以使用tf.squeeze从5D张量中移除1个尺寸的尺寸并获得此3D张量。你不应该重塑任何东西。

如果你不使用批次,那没关系,但是操作仍然期望维度存在(但对你来说它将是1)。缺少尺寸会导致线条形状出现问题。