项目使用的是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数据集训练与测试相关推荐

  1. 深度学习入门 FashionMNIST数据集训练和测试(30层神经网路)

    使用pytorch框架.模型包含13层卷积层.2层池化层.15层全连接层.为什么叠这么多层?就是玩. FashionMNIST数据集包含训练集6w张图片,测试集1w张图片,每张图片是单通道.大小28× ...

  2. caffe学习(五):cifar-10数据集训练及测试(Ubuntu)

    简介 网站链接:CIFAR-10 CIFAR-10数据集包括由10个类别的事物,每个事物各有6000张彩色图像,每张图片的大小是32*32. 整个数据集被分成了5个训练集和1个测试集,各有10000张 ...

  3. yolo-v2 自己的数据集训练以及测试流程(仅供内部使用!)

    warning 该流程仅供内部使用,外部人士使用可能会报很多很多错误! 步骤 先清除backup文件夹中老的权重文件: 将标定好图片以及annotation .txt文件拷贝到obj文件夹,一一对应, ...

  4. CIFAR10数据集训练及测试

    一.数据集介绍 该数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图.这里面有50000张用于训练,构成了5个训练批,每一批10000张图:另外10000用于测试,单 ...

  5. 【数据挖掘】分类任务简介 ( 分类概念 | 分类和预测 | 分类过程 | 训练集 | 测试集 | 数据预处理 | 有监督学习 )

    文章目录 I . 分类概念 II . 分类 ( 离散值 ) 和 预测 ( 连续值 ) III . 分类过程 IV . 分类过程中使用的数据集 ( 训练集 | 测试集 | 新数据 ) V . 数据预处理 ...

  6. MINIST数据集测试不同参数对网络的影响

    目录 一.介绍 1.实验环境 2.网络结构 二.网络效果 1.初始状态 2.有BN层 3.激活函数 tanh sigmoid relu 4. 正则化 L2正则化 Dropout 5.优化器 6. 学习 ...

  7. FCN制作自己的数据集、训练和测试 caffe

    原文:http://blog.csdn.net/zoro_lov3/article/details/74550735 FCN制作自己的数据集.训练和测试全流程 花了两三周的时间,在导师的催促下,把FC ...

  8. 【caffe】mnist数据集lenet训练与测试

    在上一篇中,费了九牛二虎之力总算是把Caffe编译通过了,现在我们可以借助mnist数据集,测试下Caffe的训练和检测效果. 准备工作:在自己的工作目录下,新建一个文件夹,命名为mnist_test ...

  9. NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练、测试(某个单词的相关词汇)

    NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练.测试(某个单词的相关词汇) 目录 输出结果 设计思路 核心代码 输出结果 寻找训练文本中与morning最相关的10个词汇: ...

  10. TF之pix2pix:基于TF利用Facades数据集训练pix2pix模型、测试并进行生成过程全记录

    TF之pix2pix:基于TF利用Facades数据集训练pix2pix模型.测试并进行生成过程全记录 目录 TB监控 1.SCALARS 2.IMAGES 3.GRAPHS 4.DISTRIBUTI ...

最新文章

  1. 【tool】网站测试分类
  2. 《数据库SQL实战》查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
  3. 深度 | 一篇文章带你进入无监督学习:从基本概念到四种实现模型(附论文)
  4. 算法面试:精选微软等公司经典的算法面试100题 第26-35题
  5. restful get不传参数404_flask-restful编写上传图片api
  6. windows 批处理把所有java源码导入一个txt文件中
  7. Opencv3 Robert算子 Sobel算子 拉普拉斯算子 自定义卷积核——实现渐进模糊
  8. 犀牛书学习笔记(3):函数
  9. 在Kali中使用Ettercap进行ARP欺骗
  10. html怎么把图片左移_html元素向左移代码 html
  11. 计算机通信子网的作用,通信子网
  12. AI算法模型线上部署方法总结
  13. 化学实验室改造方案怎么做?
  14. stm32f407能跑linux吗_stm32能跑linux吗
  15. python 画图效果
  16. Flink水位线-详细说明
  17. 反编译打包apk后无法安装正版apk提示:Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]
  18. Ubuntu下的Rabbitvcs安装配置
  19. 将tgz文件解压到指定目录
  20. 书法绘画类毕业论文文献都有哪些?

热门文章

  1. 机器学习与神经网络绪论
  2. Ubuntu安装mysql-8.0.20-linux-glibc2.12-i686.tar.xz 步骤
  3. 创建最基本的GD32F4xx的工程
  4. C语言图形编程--俄罗斯方块制作(一)详解
  5. 【Java】 IDEA使用教程
  6. app软件怎么开发 盘点3种app制作方式
  7. 御用导航提示提醒页面_PowerBI 个性化定制你的报告导航
  8. DXP导出PCB为PDF格式的设置
  9. 快速在越狱iphone手机下定位app安装包并且导出的方法
  10. iOS 测试app提示不受信任的开发者