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

Python 3.x 是否可以使用CNN的扁平层输出作为RNN的输入?,python-3.x,keras,conv-neural-network,recurrent-neural-network,Python 3.x,Keras,Conv Neural Network,Recurrent Neural Network,我目前正在做在线/动态签名验证的荣誉研究项目。我正在使用SVC 2004数据集(任务2)。我的研究目的是创建一个CRNN(卷积递归神经网络),可以识别签名是真实的还是伪造的。以下是模型的代码:(我的数据预处理可以在这里找到: 这不是我的最终代码,但是我遇到了以下错误: ValueError:输入0与层lstm_1不兼容:预期ndim=3,发现ndim=2 非常感谢您的时间和关于RNN或CNN的任何提示。展平将形状张量(批大小、时间步长、特征)转换为(批大小、时间步长*特征),这就是为什么您会得到

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

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

ValueError:输入0与层lstm_1不兼容:预期ndim=3,发现ndim=2


非常感谢您的时间和关于RNN或CNN的任何提示。

展平
将形状张量
(批大小、时间步长、特征)
转换为
(批大小、时间步长*特征)
,这就是为什么您会得到错误
发现ndim=2
。根据您试图实现的目标,您可能:

  • 移除
    展平
    以将卷积的学习特征传递到LSTM,或
  • 将展平张量重塑为
    (批量大小,时间步*特征,1)
    本质上说每个时间步都是一个特征

在任何一种情况下,LSTM都期望一个等级为3的张量。但是,等等,仅仅因为你重塑并不意味着它是正确的,它完全取决于你试图实现什么以及网络的信息流/计算图应该是什么样子。

展平
转换一个形状的张量
(批量大小、时间步长、特性)
(批量大小、时间步长*功能)
这就是为什么会出现错误
发现ndim=2
。根据您试图实现的目标,您可能会:

  • 移除
    展平
    以将卷积的学习特征传递到LSTM,或
  • 将展平张量重塑为
    (批量大小,时间步*特征,1)
    本质上说每个时间步都是一个特征

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

你的第一个解决方案解决了上面提到的错误@nuric,但是,我得到了以下错误:ValueError:检查输入时出错:预期conv1d_1_输入有3维,但得到了形状为(960,1)的数组。您的第一个解决方案解决了上面提到的错误@nuric,但是,我得到了以下错误:ValueError:检查输入时出错:预期conv1d_1_输入有3维,但得到了形状为(960,1)的数组
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