---license: MIT License tasks:- Domain-Specific Large Models- Image-to-Text---#### Clone with HTTP在个人中心->模型->我的模型,查询访问令牌。可以通过令牌进行git仓库的使用。```bash git clone http://git.aistudio.baidu.com/2973232/paddleOCRdemo.git```# Handwritten Digit Recognition with LeNet-5### 本项目使用PaddlePaddle实现基于LeNet-5的卷积神经网络(CNN)模型,用于手写数字识别任务。我们将使用MNIST数据集进行训练和验证,MNIST数据集包含了0-9共10个数字的手写图片。## 模型概述### LeNet-5是一个卷积神经网络,最早于1998年由Yann LeCun等人提出,用于手写数字识别。该网络包含7层(2个卷积层,2个池化层,2个全连接层和1个输出层)。LeNet-5在手写数字识别任务中取得了很好的性能。## 代码说明### 以下代码段展示了如何使用PaddlePaddle创建LeNet-5模型、加载预训练权重、准备优化器、损失函数、评估指标等,然后使用fit()方法进行训练。```bash### 数据准备import paddleimport numpy as npimport matplotlib.pyplot as pltpaddle.__version__import paddle.vision.transforms as T#数据归一化transform = T.Normalize(mean=[127.5],std=[127.5])#训练数据集train_dataset = paddle.vision.datasets.MNIST(mode='train',transform=transform)#评估数据集eval_dataset = paddle.vision.datasets.MNIST(mode='test',transform=transform)print("训练样本量:{},测试样本量:{}".format(len(train_dataset),len(eval_dataset)))#模型封装network= paddle.vision.models.LeNet(num_classes=10)paddle.summary(network,(1,1,28,28))model = paddle.Model(network)model.prepare(paddle.optimizer.Adam(learning_rate=0.001,parameters=network_4.parameters()), paddle.nn.CrossEntropyLoss(), paddle.metric.Accuracy())#模型流程训练model.fit(train_dataset, #训练数据集 eval_dataset, #评估数据集 epochs=5, #训练轮次 batch_size=64, #批次训练大小 verbose=1 )#模型配置def show_img(img,predict): plt.figure() plt.title("predict:{}".format(predict)) plt.imshow(img.reshape([28,28]),cmap=plt.cm.summer) plt.show()### 实例模型调用(请将模型实例地址更新为pdmodel所在)from paddle.static import InputSpecnetwork = paddle.vision.models.LeNet(num_classes=10)model = paddle.Model(network,inputs=[InputSpec(shape=[-1,1,28,28],dtype='float32',name='image')])model.load('work/mnist')model.prepare(paddle.optimizer.Adam(learning_rate=0.0001,parameters=network.parameters()), paddle.nn.CrossEntropyLoss(), paddle.metric.Accuracy())model.fit(train_dataset,eval_dataset,epochs=3,batch_size=128,verbose=1)result = model.predict(eval_dataset)indexs = [3,45,78,564,7721]for i in indexs: show_img(eval_dataset[i][0],np.argmax(result[0][i]))```### 或者```bashimport paddleimport numpy as npfrom PIL import Imagedef preprocess_image(image_path): # 加载图片并转换为灰度模式 img = Image.open(image_path).convert('L') # 调整图片大小为 28x28 img = img.resize((28, 28), Image.ANTIALIAS) # 将图片转换为 numpy 数组并标准化 img_array = np.array(img, dtype=np.float32) / 255.0 # 转换数组的形状以匹配模型的输入要求 [batch_size, num_channels, height, width] img_array = img_array.reshape([1, 1, 28, 28]) return img_array# 加载模型loaded_model = paddle.jit.load('lenet_mnist.pdmodel')# 开启评估模式loaded_model.eval()# 对输入图片进行预处理image_path = 'path/to/your/image.png'input_image = preprocess_image(image_path)# 将 numpy 数组转换为 PaddlePaddle Tensorinput_tensor = paddle.to_tensor(input_image)# 使用模型进行预测output = loaded_model(input_tensor)# 获取预测结果并找到概率最大的类别predicted_class = np.argmax(output.numpy(), axis=1)print(f'Predicted class: {predicted_class[0]}')```## 模型局限性与可能的偏差### 适用场景LeNet-5模型在手写数字识别任务中表现较好,特别适用于处理28x28大小的单通道手写数字图像。在以下场景中,LeNet-5的性能较好:图像分辨率较低,如28x28像素。图像中只有单个手写数字。图像为单通道(灰度)。### 局限性与偏差尽管LeNet-5在手写数字识别任务上表现较好,但在以下场景中可能存在局限性:对于高分辨率或彩色图像的处理,LeNet-5可能不是最佳选择。LeNet-5可能无法很好地处理包含多个手写数字或其他类型字符的复杂场景。如果训练数据集存在样本不平衡问题,模型可能会表现出对某些数字的识别能力较弱。训练数据及方法可能导致模型的偏差:如果训练数据集中的手写数字样式与实际应用场景中的手写数字差异较大,模型可能在实际应用中的表现较差。如果训练数据集的样本分布不均匀,模型可能对某些数字的识别能力较弱。### 训练数据介绍本项目使用的是MNIST数据集,这是一个广泛用于手写数字识别任务的标准数据集。数据集包含60,000个训练样本和10,000个测试样本,每个样本都是一个28x28像素的单通道(灰度)手写数字图像。数据集中的数字范围从0到9。MNIST数据集可以通过PaddlePaddle的paddle.vision.datasets.MNIST模块方便地下载和加载。数据集会自动划分为训练集和测试集,并进行必要的预处理操作,如归一化和数据增强。## 数据评估及结果为了评估模型在不同数据集上的性能,我们可以使用PaddlePaddle提供的paddle.metric.Accuracy来计算模型的准确率。评估数据可以从MNIST数据集的测试集中获得,或者从其他手写数字识别任务的相关数据集中获得。评测结果可以通过表格或图像等多种方式展示,如下:数据集 准确率MNIST 测试集 98.5%可以通过绘制混淆矩阵来进一步分析模型在各个数字上的识别性能,以找出模型在哪些数字上表现