CNN实现对手写字体的迭代

导入库

import torchvision
import torch
from torchvision.transforms import ToTensor
from torch import nn
import matplotlib.pyplot as plt

导入手写字体数据

train_ds=torchvision.datasets.MNIST('data/',train=True,transform=ToTensor(),download=True)
test_ds=torchvision.datasets.MNIST('data/',train=False,transform=ToTensor(),download=True)
train_dl=torch.utils.data.DataLoader(train_ds,batch_size=64,shuffle=True)
test_dl=torch.utils.data.DataLoader(test_ds,batch_size=46)
imgs,labels=next(iter(train_dl))
print(imgs.shape)
print(labels.shape)

从上述代码中可以看到,train_dl返回的图片数据是四维的,4个维度分别代表批次、通道数、高度和宽度(batch,channel,height,width),这正是PyTorch下卷积模型所需要的图片输入格式

创建卷积模型并训练

下面创建卷积模型来识别MNIST手写数据集。我们所创建的卷积模型先试用两个卷积层和两个池化层,然后将最后一个池化的输出展平为二维数据形式连接到全连接层,最后是输出层,中间的每一层都是用ReLU函数激活,输出层的输出张量长度为10,与类别数一致。代码如下

class Model(nn.Module):def __init__(self):super().__init__()self.conv1=nn.Conv2d(1,6,5)   #初始化第一个卷积层self.conv2=nn.Conv2d(6,16,5)  #初始化第二个卷积层self.liner_1=nn.Linear(16*4*4,256)  #初始化全连接层16*4*4为输入的特征,256为输出的特征#就是将一个大小为16×4×4的输入特征映射到一个大小为256的输出特征空间中self.liner_2=nn.Linear(256,10)  #初始化输出层def forward(self,input):#调用第一个卷积层和池化层x=torch.max_pool2d(torch.relu(self.conv1(input)),2)#调用第二个卷积层和池化层x=torch.max_pool2d(torch.relu(self.conv2(x)),2)# view()方法将数据展平为二维形式# torch.Size([64,16,4,4])->torch.Size([64,16*4*4])x=x.view(-1,16*4*4)x=torch.relu(self.liner_1(x))  # 全连接层x=self.liner_2(x)  #输出层return x#判断当前可用的device,如果显卡可用,就设置为cuda,否则设置为cpu
device="cuda" if torch.cuda.is_available() else "cpu"
print("Using {} device".format(device))#初始化模型,并使用.to()方法将其上传到device
#如果GPU可以用,会上传到显存,如果device是CPU,依保留在内存
model=Model().to(device)  # 初始化模型并设置设备
print(model)loss_fn=nn.CrossEntropyLoss() # 初始化交叉熵损失函数optimizer=torch.optim.SGD(model.parameters(),lr=0.001) # 初始化优化器def train(dataloader,model,loss_fn,optimizer):size=len(dataloader.dataset)  # 获取当前数据集样本总数量num_batches=len(dataloader)  #获得当前dataloader总批次数# train_loss用于累计所有批次的损失之和,correct用于累计预测正确的样本总数train_loss,correct=0,0for X,y in dataloader:  #对dataloader进行迭代X,y=X.to(device),y.to(device)  #每一批次的数据设置为使用当前device进行预测,并计算一个批次的损失pred=model(X)loss=loss_fn(pred,y)  # 返回的是平均损失#使用反向传播算法,根据损失优化模型参数optimizer.zero_grad()  #将模型参数的梯度全部归零loss.backward()  # 损失反向传播,计算模型参数梯度optimizer.step()  # 根据梯度优化参数with torch.no_grad():# correct 用于累计预测正确的样本总数correct+=(pred.argmax(1)==y).type(torch.float).sum().item()#train_loss用于累计所有批次的损失之和train_loss+=loss.item()#train_loss是所有批次的损失之和,所以计算全部样本的平均损失时需要处于总批次数train_loss/=num_batches#correct是预测正确的样本总是,若计算整个epoch总体正确率,需除以样本总数量correct/=sizereturn train_loss,correctdef test(dataloader,model):size=len(dataloader.dataset)num_batches=len(dataloader)test_loss,correct=0,0with torch.no_grad():for X,y in dataloader:X,y=X.to(device),y.to(device)pred=model(X)test_loss+=loss_fn(pred,y).item()correct+=(pred.argmax(1)==y).type(torch.float).sum().item()test_loss/=num_batchescorrect/=sizereturn test_loss,correctepochs=50  #一个epoch代表对全部数据训练一遍train_loss=[]  #每个epoch训练中训练数据集的平均损失被添加到此列表
train_acc=[] #每个epoch训练中训练数据集的平均正确率被添加到此列表
test_loss=[]  #每个epoch训练中测试数据集的平均损失被添加到此列表
test_acc=[] #每个epoch训练中测试数据集的平均正确率被添加到此列表for epoch in range(epochs):#调用train()函数训练epoch_loss,epoch_acc=train(train_dl,model,loss_fn,optimizer)#调用test()函数测试epoch_test_loss,epoch_test_acc=test(test_dl,model)train_loss.append(epoch_loss)train_acc.append(epoch_acc)test_loss.append(epoch_test_loss)test_acc.append(epoch_test_acc)#定义一个打印模版template=("epoch:{:2d},train_loss:{:.5f},train_acc:{:.1f}%,test_loss:{:.5f},test_acc:{:.1f}%")#输出当前的epoch的训练集损失、训练集正确率、测试集损失、测试集正确率print(template.format(epoch,epoch_loss,epoch_acc*100,epoch_test_loss,epoch_test_acc*100))print("Done!")plt.plot(range(1,epochs+1),train_loss,label="train_loss")
plt.plot(range(1,epochs+1),test_loss,label='test_loss',ls="--")
plt.xlabel('epoch')
plt.legend()
plt.show()plt.plot(range(1, epochs + 1), train_acc, label="train_acc")
plt.plot(range(1, epochs + 1), test_acc, label='test_acc', ls="--")
plt.xlabel('acc')
plt.legend()
plt.show()

函数式API

import torch.nn.functional as Fclass Model(nn.Module):def __init__(self):super().__init__()self.conv1=nn.Conv2d(1,6,5)   #初始化第一个卷积层self.conv2=nn.Conv2d(6,16,5)  #初始化第二个卷积层self.liner_1=nn.Linear(16*4*4,256)  #初始化全连接层16*4*4为输入的特征,256为输出的特征#就是将一个大小为16×4×4的输入特征映射到一个大小为256的输出特征空间中self.liner_2=nn.Linear(256,10)  #初始化输出层def forward(self,input):#调用第一个卷积层和池化层x=F.max_pool2d(F.relu(self.conv1(input)),2)#调用第二个卷积层和池化层x=F.max_pool2d(F.relu(self.conv2(x)),2)# view()方法将数据展平为二维形式# torch.Size([64,16,4,4])->torch.Size([64,16*4*4])x=x.view(-1,16*4*4)x=F.relu(self.liner_1(x))  # 全连接层x=self.liner_2(x)  #输出层return x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows实现MySQL5.7主从复制(详细版)

使用免安装版本(官网下载地址) 在Windows上安装两种MySQL服务并同时开启服务 1.下载配置 打开解压文件所在位置,就新建一个配置文件my.ini。 2.主库安装 主库的my.ini配置文件如下: [mysqld] #设置主库端口,注意须是…

uniapp开发移动端遇到的问题记录

1. 键盘弹起时页面整体上移问题 很常见但我解决过程中遇到了很多问题 我的键盘没有遮盖到输入框,但手机键盘弹起后,form部分会整体上移一点,并且底部的操作也会弹到键盘上方 网上写得很复杂,什么动态赋值高度balabala。看到有一…

英文vos安装,vos3000 web3.0

英文vos安装,vos3000英文软件工具安装,Web V3.0是一个安全且强大的批发 VOIP 计费解决方案,具有新的 Web 界面和无与伦比的令人惊叹的新功能。现在使用移动应用程序或网络浏览器控制您的 VOS3000 VOIP 计费服务器 yumsed -i "s|enabled…

使用pytorch搭建ResNeXt并基于迁移学习训练

冻结除最后全连接层以外的所有权重,只去单独训练它最后一层的的权重,这个方法,冻结了所有网络的权重。 for param in net.parameters():param.requires_grad False

测试熟悉新技术

一:redis 1.定义 简单来说 redis 就是key-value 类型的数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,它有5种基本数据类型: String(…

C语言之指针和函数

目录 作为函数参数的指针 二值互换 scanf函数和指针 指针的类型 空指针 标量型 在C语言程序中,指针的一个重要作用就是作为函数参数使用,下面我们就来学习作为函数参数的指针的相关内容。 作为函数参数的指针 假如我有一个神奇的能力,能…

win32 WM_MENUSELECT消息学习

之前写了一些win32的程序,处理菜单单击都是处理WM_COMMAND消息,通过 LOWORD(wParam) 获取菜单ID,判断单击的是哪个菜单项; 还有一些其他菜单消息; 当在菜单项中移动光标或鼠标,程序会收到许多WM_MENUSELEC…

stm32f103系统滴答定时器

简介 SysTick定时器, 是一个24位的定时器, 只能向下计数(n->0). 从RELOAD寄存器中自动重装载定时初值. 24位可以粗略约等于16M个数字. 寄存器 库函数配置系统定时器中断 选择8分频还是系统时钟源. 系统滴答次数, 也就是重装载值, 每次结束都会产生一个中断. 使用系统时钟…

12.28

1 有道云笔记 2 #include <iostream>using namespace std;class person { private:int *age;string &name; public:person(int age,string name):age(new int(age)),name(name){}~person(){delete age;}person(const person &other):age(new int(*(other.age)…

软件测试/测试开发丨学习笔记之Python运算符

运算符的作用 Python基础语法的内容通常表示不同数据或变量之间的关系 算数运算符 运算符描述加-减*乘/除%取模**幂//取整除 取模与取余区别 概念上&#xff1a;取模是计算机术语&#xff0c;取余属于数学概念&#xff1b; 结果上&#xff1a;当同号的两个数相除&#xff…

程序员如何高效学习技术?

我们相信努力学习一定会有收获&#xff0c;但是方法不当&#xff0c;既让人身心疲惫&#xff0c;也没有切实的回报。 不少朋友每天都阅读技术文章&#xff0c;但是第二天就忘干净了。工作中领导和同事都认可你的沟通和技术能力&#xff0c;但是跳槽面试却屡屡碰壁。面试官问技术…

系统学习新技术的心得体会

在当今快速发展的技术时代&#xff0c;持续学习和掌握新技术已经成为保持竞争力和创新能力的关键。系统学习新技术不仅仅是获取知识和技能&#xff0c;更是一种挑战自我、拓展视野和实现个人成长的过程。在这个过程中&#xff0c;我积累了一系列宝贵的心得体会。 首先&#xf…

EasyExcel多线程批量导出数据,动态表头,静态资源访问

1.导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>2.建立实体 Data public class ActResultLogVO implements Serializable {private static…

关于MySql字段类型的实践总结

当字段为数值类型时应使用无符号UNSIGNED修饰 ALTER TABLE infoMODIFY COLUMN user_id int UNSIGNED NOT NULL; 当字段为varchar类型时应注意是否选择合适的字符集 例如存储一些范围值&#xff0c;数字英文字符时&#xff08;IP、生日、客户端标识等或以“,”分隔的数据&…

Google Chrome 现在会在后台扫描泄露的密码

谷歌表示&#xff0c;Chrome 安全检查功能将在后台运行&#xff0c;检查网络浏览器中保存的密码是否已被泄露。 如果桌面用户正在使用标记为危险的扩展程序&#xff08;从 Chrome Web Store 中删除&#xff09;、最新的 Chrome 版本&#xff0c;或者如果启用安全浏览来阻止 Go…

Dolphinscheduler-3.2.0 离线部署 伪集群模式

Dolphinscheduler-3.2.0(离线)伪集群模式 一、依赖(前置准备工作) 1.JDK&#xff1a;版本要求 JDK(1.8),安装并配置 JAVA_HOME 环境变量,并将其下的 bin 目录追加到PATH 环境变量中; 2.数据库&#xff1a;PostgreSQL(8.2.15) 或者MySQL(5.7),两者任选其一即可,如 MySQL 则需要…

我的NPI项目之行业黑话 -- 电子/机构/软件/认证

因为最近的NPI项目&#xff0c;参加了很多项目的会议&#xff0c;有电子/机构/软件/认证相关的各方面的专业词汇就出现了。这里我将之称为黑话&#xff0c;就是对我&#xff08;纯软件) 来说是黑盒的话。这里简单记录并用于理解。 EE有关&#xff1a; Layout&#xff0c;一直…

基于Qt之QChart 图表(优美的曲线图案例)

## 项目演示 平台:ubuntu18.04 Qt版本:QT5.14.2 源码位置GitCode:https://gitcode.com/m0_45463480/QCharts/tree/main ## QChart 图表 自从 Qt 发布以来,给跨平台的用户带来很多便利。在 Qt5.7 之前,Qt 在开源社区版本里没有 Qt Charts(自带的绘图组件库)。这使得像…

安卓开发学习笔记

Android发展历史 开发工具 Android Studio 安装工具 下载页面&#xff1a;下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 安装步骤 要求代理&#xff0c;关闭就可以 下载SDK 完成后创建新项目 努力学习中~

12-28

#include <iostream>using namespace std; class Person {int *age;string &name; public:void ss(){cout<<"年龄:"<<*age<<endl<<"名字:"<<name<<endl;}//拷贝构造函数(深拷贝&#xff09;Person(const Pe…