minist数据集训练与测试
项目使用的是pytorch框架
数据集的加载:
注意事项:加载进的数据集并不符合卷积神经网络的训练格式,需要先使用Dataloader进行修改,而且加载时要先利用transform把图片数据转化为tensor张量形式
train_data=torchvision.datasets.MNIST('./data',True,torchvision.transforms.ToTensor(),download=True)
test_data=torchvision.datasets.MNIST('./data',False,torchvision.transforms.ToTensor(),download=True)
train_datasize=len(train_data) #训练集的长度
test_datasize=len(test_data)
print('训练集的长度为:{}'.format(train_datasize))
print('测试集的长度为:{}'.format(test_datasize))
#加载数据集部分
train_dataloader=DataLoader(train_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)
网络的搭建:
搭建网络的过程中,需要先计算好图片的像素点,根据卷积过程的计算公式,计算出输出的数值,如果计算错误会报错
#搭建神经网络:十个分类的网络:minist数据集是黑白图片,单通道,大小是28*28,种类是10个,本次采取2层卷积层和一层全连接层实现
class lf(nn.Module):def __init__(self):super(lf, self).__init__()self.model=nn.Sequential( #原图像的像素点是1*28*28nn.Conv2d(1,16,5,1,2), #输入形式的单通道形式,输出通道改为16 像素点为:16*28*28nn.MaxPool2d(2), #像素点为 16*14*14nn.Conv2d(16,32,5,1,2), #输出通道改为32通道nn.MaxPool2d(2), #像素点为:32*7*7nn.Flatten(), #展开后的数据大小为:32*7*7=1568nn.Linear(1568,98), #填写98的原因,反照CFR数据训练比例,64除以1024再乘上1568nn.Linear(98,10) #输出10类数据,判断概率性)def forward(self,x):x=self.model(x) #训练网络return x
设置参数:
手动设置学习率,0.03,训练轮数 ,30轮
使用优化器:
选择交叉熵损失函数,适用于多分类问题
优化器选择随机梯度下降法
loss_function=nn.CrossEntropyLoss() #分类问题使用交叉熵损失函数optim=torch.optim.SGD(l.parameters(),lr=0.01) #随机梯度下降法优化器,设定学习速率为0.03train_step=0 #记录训练的次数test_step=0 #记录测试的次数epoch=30 #训练十轮
训练网络:
for i in range(30):print('第{}轮训练开始了'.format(i+1))for data in train_dataloader: #加载数据,每一轮batch_size都是64张图片imgs,target=data #加载的data类型包括图片和标签数值俩钟数据???output=l(imgs) #向模型中输入数据,返回的数据由output保存loss=loss_function(output,target) #计算损失函数的损失值optim.zero_grad() #每一轮训练都需要梯度清零,否则下一轮的梯度下降将会被上一轮训练的梯度值所影响loss.backward() #反向传播,优化模型optim.step() #梯度下降
训练过程中注意反向传播,如果没有反向传播的话将不会梯度下降(或者下降效果非常差,试过了)
测试网络:
with torch.no_grad(): #在此过程中,梯度始终为0,不会改变训练好的模型,可以用于验证模型for data in test_dataloader:imgs,target=dataoutput=l(imgs)loss=loss_function(output,target)test_loss+=loss #误差累加test_step+=1 #测试步骤加一writer.add_scalar('test_loss',test_loss,test_step)accuracy=(output.argmax(1)==target).sum() #通过argmax函数把张量数据转化为位置信息,“1”表示横向比对,再将位置信息与target的位置信息相匹配,把匹配的结果求和,即可得到正确测试的数量#每一轮之后,开始保存模型total_accuracy=total_accuracy+accuracy print("整体的测试集的准确率为:{}".format(total_accuracy/test_datasize)) #预测正确的总量除以全部数据量,将得出每一轮训练的准确率torch.save(l,'保存模型{}.pth'.format(i+1)) #第一个参数千万不能带括号!!使用实例化的名称即可
总结
所有的讲解都在代码的注释中,以上仅仅是大概的过程
训练板块
import torch
import torchvision.datasets
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWritertrain_data=torchvision.datasets.MNIST('./data',True,torchvision.transforms.ToTensor(),download=True)
test_data=torchvision.datasets.MNIST('./data',False,torchvision.transforms.ToTensor(),download=True)
train_datasize=len(train_data) #训练集的长度
test_datasize=len(test_data)
print('训练集的长度为:{}'.format(train_datasize))
print('测试集的长度为:{}'.format(test_datasize))
#加载数据集部分
train_dataloader=DataLoader(train_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)writer=SummaryWriter('./logs') #可视化训练过程
#搭建神经网络:十个分类的网络:minist数据集是黑白图片,单通道,大小是28*28,种类是10个,本次采取2层卷积层和一层全连接层实现
class lf(nn.Module):def __init__(self):super(lf, self).__init__()self.model=nn.Sequential( #原图像的像素点是1*28*28nn.Conv2d(1,16,5,1,2), #输入形式的单通道形式,输出通道改为16 像素点为:16*28*28nn.MaxPool2d(2), #像素点为 16*14*14nn.Conv2d(16,32,5,1,2), #输出通道改为32通道nn.MaxPool2d(2), #像素点为:32*7*7nn.Flatten(), #展开后的数据大小为:32*7*7=1568nn.Linear(1568,98), #填写98的原因,反照CFR数据训练比例,64除以1024再乘上1568nn.Linear(98,10) #输出10类数据,判断概率性)def forward(self,x):x=self.model(x) #训练网络return xif __name__ == '__main__':l=lf() #创建网络模型loss_function=nn.CrossEntropyLoss() #分类问题使用交叉熵损失函数optim=torch.optim.SGD(l.parameters(),lr=0.01) #随机梯度下降法优化器,设定学习速率为0.03train_step=0 #记录训练的次数test_step=0 #记录测试的次数epoch=30 #训练十轮l.train() #改为训练网络for i in range(30):print('第{}轮训练开始了'.format(i+1))for data in train_dataloader: #加载数据,每一轮batch_size都是64张图片imgs,target=data #加载的data类型包括图片和标签数值俩钟数据???output=l(imgs) #向模型中输入数据,返回的数据由output保存loss=loss_function(output,target) #计算损失函数的损失值optim.zero_grad() #每一轮训练都需要梯度清零,否则下一轮的梯度下降将会被上一轮训练的梯度值所影响loss.backward() #反向传播,优化模型optim.step() #梯度下降train_step+=1 #训练次数增加if train_step%100==0:print('训练次数:{},loss:{}'.format(train_step,loss.item()))writer.add_scalar('train',loss.item(),train_step) #可视化训练,图像名称,y内容,x内容,显示训练的效果print('训练结束了')#测试开始l.eval() #改为测试网络test_loss=0 #误差初始化total_accuracy=0with torch.no_grad(): #在此过程中,梯度始终为0,不会改变训练好的模型,可以用于验证模型for data in test_dataloader:imgs,target=dataoutput=l(imgs)loss=loss_function(output,target)test_loss+=loss #误差累加test_step+=1 #测试步骤加一writer.add_scalar('test_loss',test_loss,test_step)accuracy=(output.argmax(1)==target).sum() #通过argmax函数把张量数据转化为位置信息,“1”表示横向比对,再将位置信息与target的位置信息相匹配,把匹配的结果求和,即可得到正确概率#每一轮之后,开始保存模型total_accuracy=total_accuracy+accuracyprint("整体的测试集的准确率为:{}".format(total_accuracy/test_datasize))torch.save(l,'保存模型{}.pth'.format(i+1)) #第一个参数千万不能带括号!!print('-------loss总和为:{}----------'.format(test_loss))
验证板块:
测试的图片的格式必须符合训练好的模型的网络要求输入格式,所以我事先使用opencv把图片灰度化了
import torch
import torchvision.transforms
from PIL import Image
from torch import nn
img='5.jpg' #读取单通道的图片,此模型就是适合单通道验证
image=Image.open(img)
print(image)
transform=torchvision.transforms.Compose([torchvision.transforms.Resize((28,28)),torchvision.transforms.ToTensor()]) #修改测试图片的大小及转化为张量形式
image=transform(image)
#需要导入卷积层
class lf(nn.Module):def __init__(self):super(lf, self).__init__()self.model=nn.Sequential( #原图像的像素点是1*28*28nn.Conv2d(1,16,5,1,2), #输入形式的单通道形式,输出通道改为16 像素点为:16*28*28nn.MaxPool2d(2), #像素点为 16*14*14nn.Conv2d(16,32,5,1,2), #输出通道改为32通道nn.MaxPool2d(2), #像素点为:32*7*7nn.Flatten(), #展开后的数据大小为:32*7*7=1568nn.Linear(1568,98), #填写98的原因,反照CFR数据训练比例,64除以1024再乘上1568nn.Linear(98,10) #输出10类数据,判断概率性)def forward(self,x):x=self.model(x) #训练网络return x
model =torch.load('lf49.pth',map_location=torch.device('cpu')) #加载网络模型,并且把GPU训练的模型映射到cpu上
print(model)
image=torch.reshape(image,(1,1,28,28)) #batch_size=1,输入通道为1 ,大小为28*28,修改输入图片适合卷积层的图像形式
model.eval() #测试模式
output=model(image)
print(output)
print(output.argmax(1)) #横向寻找对应位置,位置0--9,对应数字0--9,打印出相应的位置就是输出相应的分类结果
我测试的图片是车牌号码分割出来的这两张:
测试结果如下:
返回数值5 测试正确
测试结果如下:
返回数值 0,测试正确
minist数据集训练与测试相关推荐
- 深度学习入门 FashionMNIST数据集训练和测试(30层神经网路)
使用pytorch框架.模型包含13层卷积层.2层池化层.15层全连接层.为什么叠这么多层?就是玩. FashionMNIST数据集包含训练集6w张图片,测试集1w张图片,每张图片是单通道.大小28× ...
- caffe学习(五):cifar-10数据集训练及测试(Ubuntu)
简介 网站链接:CIFAR-10 CIFAR-10数据集包括由10个类别的事物,每个事物各有6000张彩色图像,每张图片的大小是32*32. 整个数据集被分成了5个训练集和1个测试集,各有10000张 ...
- yolo-v2 自己的数据集训练以及测试流程(仅供内部使用!)
warning 该流程仅供内部使用,外部人士使用可能会报很多很多错误! 步骤 先清除backup文件夹中老的权重文件: 将标定好图片以及annotation .txt文件拷贝到obj文件夹,一一对应, ...
- CIFAR10数据集训练及测试
一.数据集介绍 该数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图.这里面有50000张用于训练,构成了5个训练批,每一批10000张图:另外10000用于测试,单 ...
- 【数据挖掘】分类任务简介 ( 分类概念 | 分类和预测 | 分类过程 | 训练集 | 测试集 | 数据预处理 | 有监督学习 )
文章目录 I . 分类概念 II . 分类 ( 离散值 ) 和 预测 ( 连续值 ) III . 分类过程 IV . 分类过程中使用的数据集 ( 训练集 | 测试集 | 新数据 ) V . 数据预处理 ...
- MINIST数据集测试不同参数对网络的影响
目录 一.介绍 1.实验环境 2.网络结构 二.网络效果 1.初始状态 2.有BN层 3.激活函数 tanh sigmoid relu 4. 正则化 L2正则化 Dropout 5.优化器 6. 学习 ...
- FCN制作自己的数据集、训练和测试 caffe
原文:http://blog.csdn.net/zoro_lov3/article/details/74550735 FCN制作自己的数据集.训练和测试全流程 花了两三周的时间,在导师的催促下,把FC ...
- 【caffe】mnist数据集lenet训练与测试
在上一篇中,费了九牛二虎之力总算是把Caffe编译通过了,现在我们可以借助mnist数据集,测试下Caffe的训练和检测效果. 准备工作:在自己的工作目录下,新建一个文件夹,命名为mnist_test ...
- NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练、测试(某个单词的相关词汇)
NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练.测试(某个单词的相关词汇) 目录 输出结果 设计思路 核心代码 输出结果 寻找训练文本中与morning最相关的10个词汇: ...
- TF之pix2pix:基于TF利用Facades数据集训练pix2pix模型、测试并进行生成过程全记录
TF之pix2pix:基于TF利用Facades数据集训练pix2pix模型.测试并进行生成过程全记录 目录 TB监控 1.SCALARS 2.IMAGES 3.GRAPHS 4.DISTRIBUTI ...
最新文章
- 【tool】网站测试分类
- 《数据库SQL实战》查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
- 深度 | 一篇文章带你进入无监督学习:从基本概念到四种实现模型(附论文)
- 算法面试:精选微软等公司经典的算法面试100题 第26-35题
- restful get不传参数404_flask-restful编写上传图片api
- windows 批处理把所有java源码导入一个txt文件中
- Opencv3 Robert算子 Sobel算子 拉普拉斯算子 自定义卷积核——实现渐进模糊
- 犀牛书学习笔记(3):函数
- 在Kali中使用Ettercap进行ARP欺骗
- html怎么把图片左移_html元素向左移代码 html
- 计算机通信子网的作用,通信子网
- AI算法模型线上部署方法总结
- 化学实验室改造方案怎么做?
- stm32f407能跑linux吗_stm32能跑linux吗
- python 画图效果
- Flink水位线-详细说明
- 反编译打包apk后无法安装正版apk提示:Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]
- Ubuntu下的Rabbitvcs安装配置
- 将tgz文件解压到指定目录
- 书法绘画类毕业论文文献都有哪些?