tensorflow - CNN 特征(维度)输入 LSTM Tensorflow

标签 tensorflow lstm convolution

最近我正在做一个项目,我应该将图像作为 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/

相关文章:

python - Keras pad_sequences 为基数为 10 的 int () 抛出无效文字

c++ - Nvidia NPP nppiFilter 在与 2d 内核卷积时产生垃圾

tensorflow - Tensorflow 中基于 CuDnnGRU 的 RNN 实现的简单示例

python - LSTM Autoencoder 的这些实现之间的区别?

python - Keras 提前停止 : Which min_delta and patience to use?

sequence - 如何训练序列项的 LSTM 模型?

python - 如何将特征单独输入到LSTM模型中

keras - 如何从 keras 中的 Conv2D 正确获取层权重?

machine-learning - 如何确定Keras Conv2D函数中的 'filter'参数

tensorflow - 如何反转 tensorflow 中的 tf.image.per_image_standardization() 函数?