是否可以使用 CNN 的展平层的输出作为 RNN 的输入?
Is it possible to use the output of a flatten layer of a CNN to be the input of a RNN?
我目前正在进行 online/dynamic 签名验证的荣誉研究项目。我正在使用 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 的提示。
Flatten
将形状为 (batch_size, timesteps, features)
的张量转换为 (batch_size, timesteps*features)
,这就是您收到错误 found ndim=2
的原因。根据您想要实现的目标,您可能会:
- 删除
Flatten
以将卷积学习的特征传递到 LSTM,或
Reshape
到 (batch_size, timesteps*features, 1)
的扁平张量本质上是说每个时间步长都是一个特征。
在任何一种情况下,LSTM 都需要 3 阶张量。但是等等,仅仅因为你重塑并不意味着它是正确的,这完全取决于你想要实现的目标以及信息流/计算图的方式网络应该是这样的。
我目前正在进行 online/dynamic 签名验证的荣誉研究项目。我正在使用 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 的提示。
Flatten
将形状为 (batch_size, timesteps, features)
的张量转换为 (batch_size, timesteps*features)
,这就是您收到错误 found ndim=2
的原因。根据您想要实现的目标,您可能会:
- 删除
Flatten
以将卷积学习的特征传递到 LSTM,或 Reshape
到(batch_size, timesteps*features, 1)
的扁平张量本质上是说每个时间步长都是一个特征。
在任何一种情况下,LSTM 都需要 3 阶张量。但是等等,仅仅因为你重塑并不意味着它是正确的,这完全取决于你想要实现的目标以及信息流/计算图的方式网络应该是这样的。