第29课 手写数字识别 课件(20张PPT)

资源下载
  1. 二一教育资源

第29课 手写数字识别 课件(20张PPT)

资源简介

(共20张PPT)
第29课 
手写数字识别
第六单元 AI项目工坊
第29课 课堂导入
问题情境
我们之前已经学习过如何识别标准的LED数字。然而,在现实生活中,人们手写的数字形状多样、笔画粗细不一,远比标准的LED数字复杂得多。如果继续使用之前的方法进行识别,效果往往无法满足实际需求。
我们需要根据手写数字的特点 ,重新训练一个专门用于识别手写数字的模型。
第29课 学习内容
一 准备数据
三 训练模型
二 搭建人工神经网络
四 调用模型识别手写数字
学习内容
一、准备数据
第29课 学习内容
要训练这样的模型,需要大量的手写数字图像数据。为此,科研人员收集并整理了一些数据集,如MNIST手写数字数据集。该数据集包含大量真实手写数字的图像,并被划分为两部分。
一、训练数据,用于训练模型,帮助模型学习如何从图像中提取特征并识别出对应的数字。
二、测试数据,用于验证模型的识别效果。
一、准备数据
第29课 学习内容
你知道数据集里的图像内容和图像特征吗?运行配套资源中的《数据集查看器》软件,选择data文件夹,查看里面的训练数据和测试数据,并回答后面的问题。
一、准备数据
第29课 学习内容
1. 可以发现,这个数据集有_______条数据用于训练,有______条数据用于测试,图像的分辨率是_______。
2. 由此可以推测,神经网络的输入层可能需要_____________个输入节点,输出层可能需要_____个输出节点。
60 000
10 000
28 x 28
28x28(784)
10
搭建神经网络,就是根据任务要求确定网络层数、层类型及参数的过程。同时还需要设计各层之间的连接方式,使人工神经网络能够有效提取数据特征并完成推理。
思考以下两个问题:
· 手写数字存储在什么类型的媒体中?
· 根据之前所学,要提取此类媒体的特征,可以使用什么技术?
二、搭建人工神经网络
第29课 学习内容
图像文件
卷积神经网络
二、搭建人工神经网络
第29课 学习内容
该人工神经网络由三层组成:一个卷积层conv,两个全连接层fc1和fc2。其中,卷积层负责从图像中提取特征;全连接层负责整合提取到的特征,并最终将它们映射为0到9这十个数字类别的概率。
class SimpleConvNet(nn.Module):
def __init__(self):
super(SimpleConvNet, self).__init__()
# 卷积层,提取特征
# 输入是1个通道(黑白图);输出是8个通道,类似于用8种方式寻找特征
self.conv = nn.Conv2d(1, 8, kernel_size=3, padding=1)
# 输入为8×28×28大小的特征,输出为128个通道的特征
self.fc1 = nn.Linear(8 * 28 * 28, 128)
# 用于分类
# 输入为128个通道的特征;输出为10个数字类别的概率
self.fc2 = nn.Linear(128, 10)
# 负责根据输入数据,输出结果
def forward(self, x):
x = F.relu(self.conv(x))
x = x.view(-1, 8 * 28 * 28)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return F.log_softmax(x, dim=1)
二、搭建人工神经网络
第29课 学习内容
卷积层
全连接层
全连接层
28x28像素
输入图像(1个通道)
8个28x28特征图
(8个通道)
8x28x28个参数
...
128个
参数
...
0
1
2
3
4
5
6
7
8
9
x
x=F.relu(self.conv(x))
x = x.view(-1, 8 * 28 *a 28)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return F.log_softmax(x, dim=1)
第29课 学习内容
三、训练模型
训练过程可看作人工神经网络的“学习”过程:通过大量已知类别的图像,不断调整参数,使网络逐步提升对手写数字的识别能力。注意,训练模型通常比使用模型要耗费更多的算力,因此最好在高性能计算机系统中训练模型。
第29课 学习内容
三、训练模型
选择合适的方式,利用数据训练模型
1. 参照以下方法,获得用于训练的软件或程序。
方法一:利用人工智能模型生成训练代码。
方法二:参考配套资源中的 train.py 程序。
方法三:运行配套资源中的《神经网络训练器》软件。
第29课 学习内容
三、训练模型
训练程序通常包含两个核心函数:train和 evaluate ,它们分别用于模型的训练阶段和验证阶段。其中,train函数负责控制人工神经网络基于训练数据进行学习,即通过前向传播计算预测结果,并利用损失函数衡量预测与真实标签之间的误差,再通过反向传播自动调整网络参数;而evaluate函数则是在每轮训练后,使用一组独立的验证数据评估当前模型的性能,以判断其泛化能力。
第29课 学习内容
以《神经网络训练器》软件为例。
2. 参照界面提示,选择人工神经网络和数据集后单击“开始训练”按钮,观察训练过程中损失和准确率等指标的变化。
3. 单击“保存模型”按钮,将训练后的模型保存起来。
三、训练模型
第29课 学习内容
训练指标中的损失反映了模型预测结果与真实标签之间的差距,数值越低(最低为 0)表示模型越准确;准确率则表示模型在测试数据中正确识别的比例。
三、训练模型
第29课 学习内容
四、调用模型识别手写数字
   
训练结束后,可编程调用训练得到的模型,对手写数字进行识别。
第29课 学习内容
四、调用模型识别手写数字
   
配套资源提供了《手写数字识别》软件,运行后在右侧画板输入数字,程序就可以将相应的数字识别出来。
大家可以先用这个软件体验一下。
每次都能识别对吗?更换不同的模型,识别效果有什么不同?
第29课 学习内容
四、调用模型识别手写数字
   
# 引入编程库
import os
import cv2
import torch
from model import SimpleConvNet , ComplexNet , TinyNet
# 自动选择可用的计算设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 选择神经网络的类型
model = SimpleConvNet()
# 加载训练好的模型,注意修改模型的路径
model.load_state_dict(torch.load('models/digit_model.pth’))
# 把模型加载到运算设备中
model.to(device)
# test 文件夹中放着很多手写数字图像
for root, dirs, files in os.walk('test’):
for file in files:
img_path = os.path.join(root, file)
try:
# 图像转换成灰度图 ,像素值范围0到255
img = cv2.cvtColor(cv2.imread(img_path), cv2.COLOR_BGR2GRAY)
# 确保图像为黑白图
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)[1]
# 分辨率调整到28x28,与训练数据保持一致
img = cv2.resize(img, (28, 28))
# 根据图像进行识别
predicted, confidence = model.predict(img)
print(f'{file} --- {predicted}’)
except Exception as e:
print(f'{file} --- 预测失败,错误: {e}')
也可以参照配套资源中的程序,采用编程方式调用模型,进行手写数字的识别。
第29课 学习内容
四、调用模型识别手写数字
   
经过充分训练的模型,通常可以较好地识别图像中的手写数字。不过总有一些数字无法被模型正确识别出来,这与用于训练模型的数据集、模型自身的结构、训练过程等都有关系。
1. MNIST数据集里有训练数据和测试数据。训练数据用于“教”模型识别数字,测试数据则用于“测”模型的学习成果。
2. 通过准备数据、搭建神经网络、训练模型、调用模型这几个步骤能够实现手写数字的识别。
3. 训练中的准确率和损失是两个重要的训练指标,共同用于评估模型的学习效果。
第29课 课堂总结
第29课 拓展与提升
你是社区服务中心的一名志愿者,经常协助老年人完成健康讲座报名登记。你发现,不少老人常常将手机号写在卡片上,然后志愿者们再逐条将这些信息人工录入系统,工作量较大。
为了提高效率,社区服务中心的老师提议:能不能开发一个智能系统,只要拍一下照,就能自动识别手写的手机号?这样,志愿者们只需核对,无需输入,既能减轻负担,也能减少出错。你们几位同学觉得这想法很有意义,决定试一试。
尝试设计一个手写手机号识别系统,让技术真正发挥作用。如果条件允许,可编程实现设计的系统。

展开更多......

收起↑

资源预览