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

Python实现经典的LeNet神经网络架构

发布时间:2023-12-17 08:13:46

LeNet是最早应用于手写字体识别的卷积神经网络架构,由Yann LeCun于1998年提出。它是深度学习领域的开山之作,被广泛应用于图像分类、目标检测等任务。在这篇文章中,我们将使用Python来实现经典的LeNet神经网络架构,并演示如何在MNIST数据集上进行手写数字识别。

首先,我们需要导入必要的库,包括numpy、tensorflow和keras。

import numpy as np
import tensorflow as tf
from tensorflow import keras

接下来,我们需要定义LeNet神经网络的架构。LeNet由两个卷积层、两个池化层和三个全连接层组成。下面是LeNet的神经网络结构的定义:

def lenet_model():
  model = keras.Sequential([
    keras.layers.Conv2D(6, kernel_size=5, strides=1, activation='relu', input_shape=(32,32,1)),
    keras.layers.AveragePooling2D(),
    keras.layers.Conv2D(16, kernel_size=5, strides=1, activation='relu'),
    keras.layers.AveragePooling2D(),
    keras.layers.Flatten(),
    keras.layers.Dense(120, activation='relu'),
    keras.layers.Dense(84, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
  ])
  return model

在上述代码中,我们使用了Sequential模型来构建神经网络。首先,我们添加了一个卷积层,该层有6个过滤器,每个过滤器的大小为5x5,步幅为1,并使用ReLU作为激活函数。接下来,我们使用了一个平均池化层,用于对输入进行下采样。然后,我们又添加了一个卷积层,该层有16个过滤器,其它参数与 个卷积层相同。再次添加了一个平均池化层进行下采样。然后,我们使用Flatten层将卷积层的输出展平。最后,我们添加了三个全连接层,分别为120个神经元、84个神经元和10个神经元,激活函数分别为ReLU和softmax。

接下来,我们需要加载数据集并进行预处理。我们将使用MNIST数据集,该数据集包含手写数字的图像和相应的标签。

(x_train, y_train), (x_test, y_test) = keras.datasets.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 / 255.0
x_test = x_test / 255.0

在上述代码中,我们首先使用keras的load_data()函数加载MNIST数据集,然后将训练集和测试集分别赋值给x_train、y_train和x_test、y_test变量。接下来,我们将输入图像的形状从(样本数, 28, 28)调整为(样本数, 28, 28, 1),并将像素值归一化为0到1之间的范围。

现在,我们可以创建LeNet模型并进行训练和评估。

model = lenet_model()

# 编译模型
model.compile(optimizer='adam', 
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), 
              metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))

# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print('
Test accuracy:', test_acc)

在上述代码中,我们首先创建LeNet模型,然后使用compile()函数编译模型。我们选择adam优化器,使用交叉熵作为损失函数,评估指标为准确率。接下来,我们使用fit()函数训练模型,将训练集输入训练模型5个轮次,并使用验证集进行验证。最后,我们使用evaluate()函数评估模型在测试集上的准确率。

这就是使用Python实现经典的LeNet神经网络架构的方法和示例代码。通过这个示例,我们可以理解神经网络的基本架构和训练过程,以及如何在MNIST数据集上进行手写数字识别。