在Keras中CNN联合LSTM进行分类实例

1. 简介

在图像识别和语音处理等领域,经常需要同时考虑时序信息和空间信息。本文介绍了如何在Keras中将卷积神经网络(CNN)与长短记忆网络(LSTM)结合起来,用于处理此类问题。我们将实现一个简单的图像分类模型,以更好地理解这种深度学习模型的工作原理。

2. 数据集

本文使用的数据集是MNIST手写数字数据集。该数据集包含60,000张训练图像和10,000张测试图像,每张图像都是28x28像素的灰度图像。每个图像都标记有其对应的数字类别,从0到9。

from keras.datasets import mnist

# 加载MNIST数据集

(x_train, y_train), (x_test, y_test) = mnist.load_data()

3. 数据预处理

在输入图像进入模型之前,我们需要进行一些预处理。具体来说,我们将所有图像缩放到固定大小(本例中为28x28像素),并将它们转换为网络期望的形状(4维张量)。此外,我们将图像像素值标准化为0到1之间的范围。

from keras.preprocessing.image import ImageDataGenerator

# 定义图像生成器

datagen = ImageDataGenerator(rescale=1./255)

# 将图像转换为4维张量

x_train = x_train.reshape((60000, 28, 28, 1))

x_test = x_test.reshape((10000, 28, 28, 1))

# 对图像进行标准化处理

datagen.fit(x_train)

train_generator = datagen.flow(x_train, y_train, batch_size=32)

test_generator = datagen.flow(x_test, y_test, batch_size=32)

4. 构建模型

现在我们可以开始构建模型了。本文使用了一种常见的CNN + LSTM结构,也称为ConvLSTM模型。该模型的输入是一个4维张量(样本数量,时间步长,图像高度,图像宽度),输出是一个softmax分类器。我们使用了2层卷积层和1层LSTM层,以及一些池化层和批标准化层。

from keras.models import Sequential

from keras.layers import Conv2D, MaxPooling2D, BatchNormalization

from keras.layers import LSTM, Flatten, Dense

model = Sequential()

# 第一层卷积层

model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(None, 28, 28, 1)))

model.add(BatchNormalization())

# 第二层卷积层

model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))

model.add(BatchNormalization())

# 第一层池化层

model.add(MaxPooling2D(pool_size=(2, 2)))

# 第三层卷积层

model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))

model.add(BatchNormalization())

# 第四层卷积层

model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))

model.add(BatchNormalization())

# 第二层池化层

model.add(MaxPooling2D(pool_size=(2, 2)))

# LSTM层

model.add(Flatten())

model.add(Dense(128, activation='relu'))

model.add(BatchNormalization())

model.add(LSTM(128, activation='tanh', return_sequences=False))

# 输出层

model.add(Dense(10, activation='softmax'))

# 编译模型

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

5. 训练模型

现在我们可以使用上面定义的生成器来训练模型。由于这是一个相对较大的模型,并且需要较长的时间来训练,本文将Epochs数量设置为5。

# 训练模型

model.fit(train_generator, epochs=5, validation_data=test_generator)

注意:由于训练时间较长,建议在GPU上运行该程序。

6. 评估模型

现在我们使用测试数据集来评估模型的性能。我们将显示模型的准确性和损失函数。

# 评估模型

loss, accuracy = model.evaluate_generator(test_generator, steps=len(x_test) / 32)

print('Test loss:', loss)

print('Test accuracy:', accuracy)

7. 总结

在本文中,我们介绍了如何在Keras中构建一个CNN + LSTM模型,用于图像分类。我们使用了MNIST手写数字数据集,并实现了一个简单的模型。该模型可作为在处理时序数据和空间数据时的深度学习模型的起点。我们强烈建议读者继续学习,以便能够自己构建更为复杂和高效的CNN + LSTM模型。

后端开发标签