是否可以将CNN的平坦层的输出用作RNN的输入?

时间:2019-09-02 18:24:05

标签: python-3.x keras conv-neural-network recurrent-neural-network

我目前正在做有关在线/动态签名验证的荣誉研究项目。我正在使用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:输入0与lstm_1层不兼容:预期ndim = 3,找到ndim = 2

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

1 个答案:

答案 0 :(得分:0)

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

  • 删除Flatten,将经过学习的卷积特征传递到LSTM中,或者
  • Reshape展平为(batch_size, timesteps*features, 1)的张量,基本上说每个时间步都是一个特征。

在这两种情况下,LSTM都期望一个张量为3的张量。但是,等等,仅仅因为您重塑并不意味着它是正确的,这全都取决于您要实现的目标以及信息流/计算图的方式。网络应该看起来像这样。