当前位置:网站首页>机器学习之深度学习卷积神经网络,实现基于CNN网络的手写字体识别
机器学习之深度学习卷积神经网络,实现基于CNN网络的手写字体识别
2022-06-28 15:24:00 【华为云】
实现基于CNN网络的手写字体识别
首先下载数据
1、搭建CNN网络模型;
class CNN(nn.Module): def __init__(self): super(CNN,self).__init__() ''' 一般来说,卷积网络包括以下内容: 1.卷积层 2.神经网络 3.池化层 ''' self.conv1=nn.Sequential( nn.Conv2d( #--> (1,28,28) in_channels=1, #传入的图片是几层的,灰色为1层,RGB为三层 out_channels=16, #输出的图片是几层 kernel_size=5, #代表扫描的区域点为5*5 stride=1, #就是每隔多少步跳一下 padding=2, #边框补全,其计算公式=(kernel_size-1)/2=(5-1)/2=2 ), # 2d代表二维卷积 --> (16,28,28) nn.ReLU(), #非线性激活层 nn.MaxPool2d(kernel_size=2), #设定这里的扫描区域为2*2,且取出该2*2中的最大值 --> (16,14,14) ) self.conv2=nn.Sequential( nn.Conv2d( # --> (16,14,14) in_channels=16, #这里的输入是上层的输出为16层 out_channels=32, #在这里我们需要将其输出为32层 kernel_size=5, #代表扫描的区域点为5*5 stride=1, #就是每隔多少步跳一下 padding=2, #边框补全,其计算公式=(kernel_size-1)/2=(5-1)/2= ), # --> (32,14,14) nn.ReLU(), nn.MaxPool2d(kernel_size=2), #设定这里的扫描区域为2*2,且取出该2*2中的最大值 --> (32,7,7),这里是三维数据 ) self.out=nn.Linear(32*7*7,10) #注意一下这里的数据是二维的数据 def forward(self,x): x=self.conv1(x) x=self.conv2(x) #(batch,32,7,7) #然后接下来进行一下扩展展平的操作,将三维数据转为二维的数据 x=x.view(x.size(0),-1) #(batch ,32 * 7 * 7) output=self.out(x) return output2、设计损失函数,选择优化函数;
# 添加优化方法optimizer=torch.optim.Adam(cnn.parameters(),lr=LR)# 指定损失函数使用交叉信息熵loss_fn=nn.CrossEntropyLoss()3、实现模型训练与测试。
step=0for epoch in range(EPOCH): #加载训练数据 for step,data in enumerate(train_loader): x,y=data #分别得到训练数据的x和y的取值 b_x=Variable(x) b_y=Variable(y) output=cnn(b_x) #调用模型预测 loss=loss_fn(output,b_y)#计算损失值 optimizer.zero_grad() #每一次循环之前,将梯度清零 loss.backward() #反向传播 optimizer.step() #梯度下降 #每执行50次,输出一下当前epoch、loss、accuracy if (step%50==0): #计算一下模型预测正确率 test_output=cnn(test_x) y_pred=torch.max(test_output,1)[1].data.squeeze() accuracy=sum(y_pred==test_y).item()/test_y.size(0) print('now epoch : ', epoch, ' | loss : %.4f ' % loss.item(), ' | accuracy : ' , accuracy)
代码:
import torchimport torch.nn as nnfrom torch.autograd import Variableimport torch.utils.data as Dataimport torchvision#Hyper prametersEPOCH=1BATCH_SIZE=50LR=0.001DOWNLOAD_MNIST=Falsetrain_data = torchvision.datasets.MNIST( root='./mnist', train=True, transform=torchvision.transforms.ToTensor(), #将下载的文件转换成pytorch认识的tensor类型,且将图片的数值大小从(0-255)归一化到(0-1) download=DOWNLOAD_MNIST)train_loader=Data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)test_data=torchvision.datasets.MNIST( root='./mnist', train=False,)with torch.no_grad(): test_x=Variable(torch.unsqueeze(test_data.data, dim=1)).type(torch.FloatTensor)[:2000]/255 #只取前两千个数据吧,差不多已经够用了,然后将其归一化。 test_y=test_data.targets[:2000]'''开始建立CNN网络'''class CNN(nn.Module): def __init__(self): super(CNN,self).__init__() ''' 一般来说,卷积网络包括以下内容: 1.卷积层 2.神经网络 3.池化层 ''' self.conv1=nn.Sequential( nn.Conv2d( #--> (1,28,28) in_channels=1, #传入的图片是几层的,灰色为1层,RGB为三层 out_channels=16, #输出的图片是几层 kernel_size=5, #代表扫描的区域点为5*5 stride=1, #就是每隔多少步跳一下 padding=2, #边框补全,其计算公式=(kernel_size-1)/2=(5-1)/2=2 ), # 2d代表二维卷积 --> (16,28,28) nn.ReLU(), #非线性激活层 nn.MaxPool2d(kernel_size=2), #设定这里的扫描区域为2*2,且取出该2*2中的最大值 --> (16,14,14) ) self.conv2=nn.Sequential( nn.Conv2d( # --> (16,14,14) in_channels=16, #这里的输入是上层的输出为16层 out_channels=32, #在这里我们需要将其输出为32层 kernel_size=5, #代表扫描的区域点为5*5 stride=1, #就是每隔多少步跳一下 padding=2, #边框补全,其计算公式=(kernel_size-1)/2=(5-1)/2= ), # --> (32,14,14) nn.ReLU(), nn.MaxPool2d(kernel_size=2), #设定这里的扫描区域为2*2,且取出该2*2中的最大值 --> (32,7,7),这里是三维数据 ) self.out=nn.Linear(32*7*7,10) #注意一下这里的数据是二维的数据 def forward(self,x): x=self.conv1(x) x=self.conv2(x) #(batch,32,7,7) #然后接下来进行一下扩展展平的操作,将三维数据转为二维的数据 x=x.view(x.size(0),-1) #(batch ,32 * 7 * 7) output=self.out(x) return output cnn=CNN()# print(cnn)# 添加优化方法optimizer=torch.optim.Adam(cnn.parameters(),lr=LR)# 指定损失函数使用交叉信息熵loss_fn=nn.CrossEntropyLoss()'''开始训练我们的模型哦'''step=0for epoch in range(EPOCH): #加载训练数据 for step,data in enumerate(train_loader): x,y=data #分别得到训练数据的x和y的取值 b_x=Variable(x) b_y=Variable(y) output=cnn(b_x) #调用模型预测 loss=loss_fn(output,b_y)#计算损失值 optimizer.zero_grad() #每一次循环之前,将梯度清零 loss.backward() #反向传播 optimizer.step() #梯度下降 #每执行50次,输出一下当前epoch、loss、accuracy if (step%50==0): #计算一下模型预测正确率 test_output=cnn(test_x) y_pred=torch.max(test_output,1)[1].data.squeeze() accuracy=sum(y_pred==test_y).item()/test_y.size(0) print('now epoch : ', epoch, ' | loss : %.4f ' % loss.item(), ' | accuracy : ' , accuracy)'''打印十个测试集的结果'''test_output=cnn(test_x[:10])y_pred=torch.max(test_output,1)[1].data.squeeze() #选取最大可能的数值所在的位置print(y_pred.tolist(),'predecton Result')print(test_y[:10].tolist(),'Real Result')边栏推荐
- 第四大运营商,难成「鲶鱼」
- 笔试面试算法经典–最长回文子串
- With a return of 5000 times, the South African newspaper invested in Tencent to make a province
- 隐私计算 FATE - 离线预测
- 一个bug肝一周...忍不住提了issue
- Li Kou today's question -522 Longest special sequence
- A bug liver a week I can't help mentioning issue
- go-zero 微服务实战系列(七、请求量这么高该如何优化)
- How can the digital intelligent supply chain management platform of the smart Park optimize process management and drive the development of the park to increase speed and quality?
- 当下不做元宇宙,就像20年前没买房!
猜你喜欢

Flutter简单实现多语言国际化

实验6 8255并行接口实验【微机原理】【实验】

Go zero micro Service Practice Series (VII. How to optimize such a high demand)

使用Karmada实现Helm应用的跨集群部署

Fleet | background Discovery issue 3: Status Management

With 120billion yuan, she will ring the bell for IPO again

如何从零搭建10万级 QPS 大流量、高并发优惠券系统

After QQ was stolen, a large number of users "died"

第四大运营商,难成「鲶鱼」
![数组中的第K大元素[堆排 + 建堆的实际时间复杂度]](/img/69/bcafdcb09ffbf87246a03bcb9367aa.png)
数组中的第K大元素[堆排 + 建堆的实际时间复杂度]
随机推荐
WPF 视频硬解码渲染播放(无空域)(支持4K、8K、高帧率视频)
R语言ggplot2可视化:使用patchwork包将3个ggplot2可视化结果自定义组合起来构成组合图、两个子图横向组合后和另外一个图纵向组合构成最终组合图
[C language] how to implement plural types
云杉网络DeepFlow帮助5G核心网和电信云构建可观测性
Curve 替换 Ceph 在网易云音乐的实践
动力电池,是这样被“瓜分”的
R语言ggplot2可视化:使用patchwork包(直接使用加号+)将一个ggplot2可视化结果和数据表格横向组合起来形成最终结果图
字节跳动数据平台技术揭秘:基于 ClickHouse 的复杂查询实现与优化
Go zero micro Service Practice Series (VII. How to optimize such a high demand)
Fleet | "backstage exploration" issue 3: status management
web Worker 轮询请求
[C language] how to generate normal or Gaussian random numbers
R language ggplot2 visualization: use the patchwork package (directly use the plus sign +) to horizontally combine the two ggplot2 visualization results to form a single visualization result graph
智能化转型被加速,企业需要新的工具箱
看界面控件DevExpress WinForms如何创建一个虚拟键盘
R language ggplot2 visualization: use the patchwork package (directly use the plus sign +) to horizontally combine a ggplot2 visualization result and a piece of text content to form a final result gra
Spark SQL generate JSON
Case driven: a detailed guide from getting started to mastering shell programming
R语言ggplot2可视化:使用patchwork包将两个ggplot2可视化结果横向构成新的结果可视化组合图(使用|符号)
ROS knowledge points - build an ROS development environment using vscode