最近我正在做一个项目,我应该将图像作为 CNN 的输入并提取特征并将其输入 LSTM 进行训练。我使用 2 层 CNN 进行特征提取,并从全连接层获取特征并尝试将它们输入 LSTM。问题是,当我想将 FC 层作为输入提供给 LSTM 时,我会收到关于错误维度的错误。我的 FC 层是一个维度为 (128,1024) 的张量。我尝试像这样 reshape 它 tf.reshape(fc,[-1]) 这给了我一个张量 ok (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 个元素的张量 reshape 为“ConvNet/Reshape”(操作:“Reshape”)的形状 [1](1 个元素),输入形状为:[128,1024]、[1],输入张量计算为部分形状:输入[1] = [1]。
最佳答案
您处理问题的方式存在逻辑错误。将数据折叠为一维张量不会解决任何问题(即使你让它正常工作)。
如果您将图像序列作为输入,您的输入张量应该是 5D(batch、sequence_index、x、y、channel)或类似的排列。 conv2d 应该提示额外的维度,但你可能错过了其中之一。您应该先尝试修复它。
接下来使用 conv3d 和 max_pool3d,深度窗口为 1(因为您不希望不同的帧在此阶段交互)。
完成后,您应该仍然有 5D 张量,但 x 和 y 维度应该为 1(您应该检查这一点,如果不是这种情况,请修复操作)。
RNN 部分需要 3D 张量(batch、sequence_index、fature_index)。您可以使用 tf.squeeze 从 5D 张量中删除 1 尺寸的维度并获得此 3D 张量。您不必 reshape 任何东西。
如果您不使用批处理,也没关系,但操作仍会期望维度存在(但对您来说它将是 1)。缺少尺寸会导致形状出现问题。
关于tensorflow - CNN 特征(维度)输入 LSTM Tensorflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50156512/