Mnist数据集可以算是学习深度学习最常用到的了。这个数据集包含70000张手写数字图片,分别是60000张训练图片和10000张测试图片,训练集由来自250个不同人手写的数字构成,一般来自高中生,一半来自工作人员,测试集(testset)也是同样比例的手写数字数据,并且保证了测试集和训练集的作者不同。每个图片都是2828个像素点,数据集会把一张图片的数据转成一个2828=784的一维向量存储起来。
里面的图片数据如下所示,每张图是0-9的手写数字黑底白字的图片,存储时,黑色用0表示,白色用0-1的浮点数表示。
打开后会有四个文件:
训练数据集:train-images-idx3-ubyte.gz
训练数据集标签:train-labels-idx1-ubyte.gz
测试数据集:t10k-images-idx3-ubyte.gz
测试数据集标签:t10k-labels-idx1-ubyte.gz
将这四个文件下载后放置到需要用的文件夹下即可不要解压!下载后是什么就怎么放!
文件夹下运行下面的代码,即可自动检测数据集是否存在,若没有会自动进行下载,下载后在这一路径:
#下载数据集fromtorchvisionimportdatasets,transformstrain_set=datasets.MNIST("data",train=True,download=True,transform=transforms.ToTensor(),)test_set=datasets.MNIST("data",train=False,download=True,transform=transforms.ToTensor(),)
参数解释:
datasets.MNIST:是Pytorch的内置函数torchvision.datasets.MNIST,可以导入数据集
train=True:读入的数据作为训练集
transform:读入我们自己定义的数据预处理操作
download=True:当我们的根目录(root)下没有数据集时,便自动下载
如果这时候我们通过联网自动下载方式download我们的数据后,它的文件路径是以下形式:原文件夹/data/MNIST/raw
test:自己写的测试图片
main:主函数
model:训练的模型参数,会自动生成
data:数据集文件夹
14轮左右,模型识别准确率达到99%以上
1)导入必要的包及预处理,本人学习时做了较多注释,且用的是下载好的文件,如果是自己的请更改对应的文件目录哦。importosimportmatplotlib.pyplotaspltimporttorchfromPILimportImagefromtorchimportnnfromtorch.nnimportConv2d,Linear,ReLUfromtorch.nnimportMaxPool2dfromtorchvisionimporttransformsfromtorchvision.datasetsimportMNISTfromtorch.utils.dataimportDataLoader#Dataset:创建数据集的函数;__init__:初始化数据内容和标签#__geyitem:获取数据内容和标签#__len__:获取数据集大小#daataloader:数据加载类,接受来自dataset已经加载好的数据集#torchbision:图形库,包含预训练模型,加载数据的函数、图片变换,裁剪、旋转等#torchtext:处理文本的工具包,将不同类型的额文件转换为datasets#预处理:将两个步骤整合在一起transform=transforms.Compose({transforms.ToTensor(),#将灰度图片像素值(0~255)转为Tensor(0~1),方便后续处理#transforms.Normalize((0.1307,),(0.3081)),#归一化,均值0,方差1;mean:各通道的均值std:各通道的标准差inplace:是否原地操作})
3)构建模型
成功运行的话请给个免费的赞吧!(调试不易)
4)模型训练
每次训练完成后会自动保存参数到pkl模型中,如果路径中有Pkl文件,下次运行会自动加载上一次的模型参数,在这个基础上继续训练,第一次运行时没有模型参数,结束后会自动生成。#模型训练deftrain():#index=0forindex,datainenumerate(train_loader):#获取训练数据以及对应标签#fordataintrain_loader:input,target=data#input为输入数据,target为标签y_predict=model(input)#模型预测loss=criterion(y_predict,target)optimizer.zero_grad()#梯度清零loss.backward()#loss值反向传播optimizer.step()#更新参数#index+=1ifindex%100==0:#每一百次保存一次模型,打印损失torch.save(model.state_dict(),"./model/model.pkl")#保存模型torch.save(optimizer.state_dict(),"./model/optimizer.pkl")print("训练次数为:{},损失值为:{}".format(index,loss.item()))
5)加载模型
6)模型测试#模型测试deftest():correct=0#正确预测的个数total=0#总数withtorch.no_grad():#测试不用计算梯度fordataintest_loader:input,target=dataoutput=model(input)#output输出10个预测取值,概率最大的为预测数probability,predict=torch.max(input=output.data,dim=1)#返回一个元祖,第一个为最大概率值,第二个为最大概率值的下标#loss=criterion(output,target)total+=target.size(0)#target是形状为(batch_size,1)的矩阵,使用size(0)取出该批的大小correct+=(predict==target).sum().item()#predict和target均为(batch_size,1)的矩阵,sum求出相等的个数print("测试准确率为:%.6f"%(correct/total))
6)自己手写数字图片识别函数(可选用)
7)MNIST中的数据识别测试数据
8)测试自己的手写数字图片(可选)
将所有代码按顺序放到编辑器中,安装好对应的包,就可以顺利运行啦。
如果成功运行了请给我一个免费的赞吧,这对我真的很重要!!!