是否可以使用 CNN 的扁平层的输出作为 RNN 的输入?

Posted

技术标签:

【中文标题】是否可以使用 CNN 的扁平层的输出作为 RNN 的输入?【英文标题】:Is it possible to use the output of a flatten layer of a CNN to be the input of a RNN? 【发布时间】:2020-01-05 17:59:15 【问题描述】:

我目前正在做关于在线/动态签名验证的荣誉研究项目。我正在使用 SVC 2004 数据集(任务 2)。我研究的目的是创建一个 CRNN(卷积递归神经网络),它可以识别签名是真实的还是伪造的。这是模型的代码:(我的数据预处理可以在这里找到:Data preprocessing code

class crnn_model:
def __init__(self, trainX, trainy, testX, testy, optimizer_method):
   self.trainX = trainX
   self.trainy = trainy
   self.testX = testX
   self.testy = testy

   self.evaluate_model(optimizer_method)

def evaluate_model(self, optimizer_method):
    verbose, epochs, batch_size = 0, 40, 10
    n_timesteps, n_features, n_outputs = len(self.trainX), 7, 2
    model = keras.Sequential()
    model.add(keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps, n_features), use_bias=True))
    model.add(keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu'))
    model.add(keras.layers.Dropout(0.5))
    model.add(keras.layers.MaxPooling1D(pool_size=2))
    model.add(keras.layers.Flatten())
    model.add(keras.layers.LSTM(2, input_shape=[30592,1], return_sequences=True))
    model.summary()

    # Compile the model
    model.compile(optimizer=optimizer_method, loss='categorical_crossentropy', metrics=['accuracy'])

    #fit model
    model.fit(self.trainX, self.trainy, epochs=epochs, batch_size=batch_size, verbose=verbose)

    #evaluate model
    _, accuracy = model.evaluate(self.testX, self.testy, batch_size=batch_size, verbose=0)
    return accuracy

这不是我的最终代码,但是我遇到了以下错误:

ValueError: Input 0 is in compatible with layer lstm_1: expected ndim=3, found ndim=2

非常感谢您抽出宝贵的时间以及有关 RNN 或 CNN 的任何提示。

【问题讨论】:

【参考方案1】:

Flatten 将形状为 (batch_size, timesteps, features) 的张量转换为 (batch_size, timesteps*features),这就是您收到错误 found ndim=2 的原因。根据您要实现的目标,您可能会:

删除 Flatten 以将卷积后的学习特征传递到 LSTM,或 Reshape 扁平化张量到 (batch_size, timesteps*features, 1) 本质上是说每个时间步长都是一个特征。

在任何一种情况下,LSTM 都需要一个 3 阶的张量。但是等等,仅仅因为你重塑并不意味着它是正确的,这完全取决于你想要实现的目标以及信息流/计算图的方式网络应该是这样的。

【讨论】:

您的第一个解决方案解决了上面提到的错误@nuric,但是,我收到以下错误: ValueError: Error when checks input: expected conv1d_1_input to have 3 dimensions, but got array with shape (960, 1 )

以上是关于是否可以使用 CNN 的扁平层的输出作为 RNN 的输入?的主要内容,如果未能解决你的问题,请参考以下文章

keras---cnn---rnn---lstm

后CNN探索,如何用RNN进行图像分类

将 RNN 和 CNN 与千层面相结合

RNN 和 CNN-RNN 不能正确训练,总是预测一类

CNN、RNN、DNN的一般解释

RNN和LSTM