欢迎访问宙启技术站
智能推送

Python实现的LeNet卷积神经网络模型

发布时间:2023-12-11 06:21:01

LeNet是一种经典的卷积神经网络模型,最早由Yann LeCun等人在1998年提出,主要用于手写数字识别任务。它是深度学习领域中的一个里程碑,为后来更复杂的卷积神经网络模型奠定了基础。

LeNet模型由两个部分组成:卷积层和全连接层。接下来,我们将使用Python来实现一个简化版本的LeNet模型,并用MNIST数据集进行训练和测试。

首先,我们需要导入相关的库和模块。我们将使用Keras库来搭建神经网络模型,使用MNIST数据集进行训练和测试。

import numpy as np
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

接下来,我们需要加载MNIST数据集并进行预处理。代码如下:

# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 进行数据预处理
x_train = x_train.reshape(-1, 28, 28, 1)
x_test = x_test.reshape(-1, 28, 28, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
num_classes = 10
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

上述代码将训练集和测试集加载到numpy数组中,并进行了一系列的预处理。我们将输入数据的形状从(60000, 28, 28)改变为(60000, 28, 28, 1),并将数据类型转化为float32,最后我们将像素值进行了归一化处理。

接下来,我们可以开始构建LeNet模型了。代码如下:

model = Sequential()
model.add(Conv2D(6, kernel_size=(5, 5), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(16, kernel_size=(5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(120, activation='relu'))
model.add(Dense(84, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

上述代码中,我们首先创建了一个Sequential模型。然后依次添加了两个卷积层和两个最大池化层,再添加了三个全连接层,最后一个全连接层的输出使用了softmax函数进行分类。

最后,我们需要对模型进行编译和训练。代码如下:

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adam(),
              metrics=['accuracy'])

model.fit(x_train, y_train,
          batch_size=128,
          epochs=20,
          verbose=1,
          validation_data=(x_test, y_test))

上述代码中,我们指定了损失函数为交叉熵,优化算法为Adam,度量指标为准确率。然后我们对模型进行了20个轮次的训练,每个批次的大小为128,并将测试集设置为验证数据。

使用LeNet模型进行手写数字识别的训练和测试非常简单,只需几行代码就可以完成。通过这个例子,我们可以更好地理解卷积神经网络的基本原理和LeNet模型的结构。

当训练完成后,我们可以使用这个模型对新的手写数字进行识别。例如,我们可以使用以下代码对新的手写数字进行预测:

pred = model.predict(new_data)

这是一个简化版本的LeNet模型的实现和使用例子,希望可以帮助你更好地理解卷积神经网络模型的原理和应用。实际上,LeNet模型有很多改进的版本,可以应用于更复杂的任务,例如物体识别、人脸识别等。