文章目录

  • CIFAR10数据集准备、加载
  • 搭建神经网络
  • 损失函数和优化器
  • 训练集
  • 测试集
    • 关于argmax:
  • 使用tensorboard可视化训练过程。
  • 完整代码(训练集+测试集):
    • 程序结果:
  • 验证集
    • 完整代码(验证集):

CIFAR10数据集准备、加载

解释一下里面的参数 root=数据放在哪。 train=是否为训练集 。 download=是否去网上下载。
里面的那个 transform 就是转换数据类型为Tensor类型。

准备一个测试集 一个训练集 自动从网上下载好。 大概160MB左右。图片大小是32*32的RGB格式。

train_data = torchvision.datasets.CIFAR10(root='../data', train=True, transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10(root='../data', train=False, transform=torchvision.transforms.ToTensor(),download=True)

然后我们加载数据集,使用DataLoader。
设置 mini-batch为64.
然后再看一下训练集和测试集的数据集个数。

# DataLoader加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)
print("训练集的长度:{}".format(len(train_data)))
print("测试集的长度:{}".format(len(test_data)))

搭建神经网络

使用网上给的图片搭建神经网络,下图。
使用Sequential组合的方法写每个网络。

# 搭建神经网络
class Model(nn.Module):def __init__(self):super(Model, self).__init__()self.model = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(64 * 4 * 4, 64),nn.Linear(64, 10),)def forward(self, x):x = self.model(x)return x

损失函数和优化器

使用交叉熵做为损失函数,并且放到GPU上一会做训练。

# 损失函数
loss = nn.CrossEntropyLoss().cuda()# 优化器
optimizer  = torch.optim.SGD(model.parameters(),lr=0.01,)

训练集

这里的训练集开头有一个 model.train() 就是训练集循环开头写这个。也可以不写,不过规范要写上。

 model.train() # 也可以不写,规范的话是写,用来表明训练步骤for data in train_dataloader:# 数据分开 一个是图片数据,一个是真实值imgs,targets = dataimgs = imgs.cuda()  # 放到GPU上一会训练用targets = targets.cuda()# 拿到预测值output = model(imgs)# 计算损失值loss_in = loss(output,targets)# 优化开始~ ~ 先梯度清零optimizer.zero_grad()# 反向传播+更新loss_in.backward()optimizer.step()

测试集

也和上面一样。测试集前面加了一句 model.eval() 就是表明这是测试集,也可以不写,规范就写上。
这里我们使用了accurate记录当前正确的个数。然后除以总个数就是正确率了。

 accurate = 0model.eval() # 也可以不写,规范的话就写,用来表明是测试步骤with torch.no_grad():for data in test_dataloader:# 这里的每一次循环 都是一个minibatch  一次for循环里面有64个数据。imgs , targets = dataimgs = imgs.cuda()targets = targets.cuda()output = model(imgs)loss_in = loss(output,targets)sum_loss += loss_inaccurate += (output.argmax(1) == targets).sum()

其中的 sum() 就是 计算其中每一个概率是否和我们的targets,即真实值相等,sum() 将batch里面64个数据的判断结果相加。

关于argmax:

这里的output.argmax(1) 就是求output 在 axis=1方向上的最大值,返回其索引。
可以打印输出看一下output的值,由于这是在for循环里面的output所以output肯定就是我们设置的batch的大小 一共64个。每一个都应该是有10个数据组成的一维数组,这十个数代表十个分类的概率。
我们打印看一下:
找到最大值是1.2819,然后返回他的索引值5。

[-0.98575, 0.32747, 0.52469, 1.0626, 0.09937, 1.2819, 0.7109, -0.34366, -1.4924, -1.4262]

使用tensorboard可视化训练过程。

使用SummaryWriter:

#添加tensorboard可视化数据
writer = SummaryWriter('../logs_tensorboard')

在训练集里添加:

if num_time % 100 == 0:writer.add_scalar('看一下训练集损失值',loss_in.item(),num_time)

在测试集里添加:

writer.add_scalar('看一下测试集损失',sum_loss,i)writer.add_scalar('看一下当前测试集正确率',accurate/len(test_data)*100,i)i +=1

别忘了 writer.close() 关闭tensorboard。

最后使用 torch.save保存训练结果。

完整代码(训练集+测试集):

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter# 准备数据集
train_data = torchvision.datasets.CIFAR10(root='../data', train=True, transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10(root='../data', train=False, transform=torchvision.transforms.ToTensor(),download=True)print("训练集的长度:{}".format(len(train_data)))
print("测试集的长度:{}".format(len(test_data)))# DataLoader加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)# 搭建神经网络
class Model(nn.Module):def __init__(self):super(Model, self).__init__()self.model = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(64 * 4 * 4, 64),nn.Linear(64, 10),)def forward(self, x):x = self.model(x)return x# 创建网络模型
model = Model().cuda()#添加tensorboard可视化数据
writer = SummaryWriter('../logs_tensorboard')# 损失函数
loss = nn.CrossEntropyLoss().cuda()# 优化器
optimizer  = torch.optim.SGD(model.parameters(),lr=0.01,)i = 1 # 用于绘制测试集的tensorboard# 开始循环训练
for epoch in range(30):num_time = 0 # 记录看看每轮有多少次训练print('开始第{}轮训练'.format(epoch+1))model.train() # 也可以不写,规范的话是写,用来表明训练步骤for data in train_dataloader:# 数据分开 一个是图片数据,一个是真实值imgs,targets = dataimgs = imgs.cuda()targets = targets.cuda()# 拿到预测值output = model(imgs)# 计算损失值loss_in = loss(output,targets)# 优化开始~ ~ 先梯度清零optimizer.zero_grad()# 反向传播+更新loss_in.backward()optimizer.step()num_time +=1if num_time % 100 == 0:writer.add_scalar('看一下训练集损失值',loss_in.item(),num_time)sum_loss = 0 # 记录总体损失值# 每轮训练完成跑一下测试数据看看情况accurate = 0model.eval() # 也可以不写,规范的话就写,用来表明是测试步骤with torch.no_grad():for data in test_dataloader:# 这里的每一次循环 都是一个minibatch  一次for循环里面有64个数据。imgs , targets = dataimgs = imgs.cuda()targets = targets.cuda()output = model(imgs)loss_in = loss(output,targets)sum_loss += loss_inprint('这里是output',output)accurate += (output.argmax(1) == targets).sum()print('第{}轮测试集的正确率:{:.2f}%'.format(epoch+1,accurate/len(test_data)*100))writer.add_scalar('看一下测试集损失',sum_loss,i)writer.add_scalar('看一下当前测试集正确率',accurate/len(test_data)*100,i)i +=1torch.save(model,'../model_pytorch/model_{}.pth'.format(epoch+1))print("第{}轮模型训练数据已保存".format(epoch+1))writer.close()

程序结果:

可以看到训练30轮之后的正确率逼近64%。

也可以看到每次训练的模型数据都保存了起来,方便后面验证。

验证集

本次使用图片:
首先PIL方法导入图片。image = Image.open('../data/plane.png')

这里其实可以看一下图片格式数据:

# print(image)  #<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=719x719 at 0x1BB943224C0>

可以看到 是 RGBA的格式 并且图片尺寸是719 * 719的。
我们需要转换成 RGB格式 大小是32 * 32的。

转换成RGB格式:

image = image.convert('RGB')

然后使用Compose组合改变数据类型:

先变成32*32 再变成tensor类型数据。

# 定义 Compose
transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])
# 放入我们要改变的数据
image = transform(image)

放入我们要验证的数据:
这里使用了 torch.no_grad() 表示 后面的过程不需要梯度等优化数据。

with torch.no_grad():image = image.cuda()output = model(image)print(output.argmax(1))

可以看到输出结果。表示验证结果是第0个类型。

我们可以调试看一下CIFAR10的数据集数字对应的图片是什么图片。

显然第0个就是代表飞机。验证成功。

后面我们又换了一个猫的图片,然后验证出来是5号dog,验证出错了。毕竟正确率只有64%。
我训练了30轮,用笔记本的GPU跑的,1650的GPU,那风扇咔咔转,最近梯子用不了了,就不上云了。

完整代码(验证集):

import torchvision
from torch import nn
import torch
from  PIL import Image# 把这个模型拿过来 防止模型加载的时候报错
class Model(nn.Module):def __init__(self):super(Model, self).__init__()self.model = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(64 * 4 * 4, 64),nn.Linear(64, 10),)def forward(self, x):x = self.model(x)return ximage = Image.open('../data/plane.png')
# print(image)  #<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=719x719 at 0x1BB943224C0>
#  这里可以看到输出是ARGB类型,四通道,而我们的训练模式都是三通道的。
#  所以这里使转换成RGB三通道的格式image = image.convert('RGB')# 使用Compose组合改变数据类型,先变成32*32的 然后在变成tensor类型
transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])image = transform(image)
model = torch.load('../model_pytorch/model_30.pth')  # 这里面输出的话就是保存的各种参数。image = torch.reshape(image,(1,3,32,32))
print(image.shape)model.eval()
with torch.no_grad():image = image.cuda()output = model(image)print(output.argmax(1))

这里有个小坑。使用save保存的网络模型,加载的时候必须吧网络模型类定义也写出来,不然会直接报错。

还有一个字典形式保存模型的方法那个就不用再写一遍定义,不过字典这个方法不是很熟。

Pytorch---- CIFAR10实战(训练集+测试集+验证集)完整版,逐行注释-----学习笔记相关推荐

  1. 训练集(train set) 验证集(validation set) 测试集(test set)

    在有监督(supervise)的机器学习中,数据集常被分成2~3个,即:训练集(train set) 验证集(validation set) 测试集(test set). http://blog.si ...

  2. [机器学习] 训练集(train set) 验证集(validation set) 测试集(test set)

    在有监督(supervise)的机器学习中,数据集常被分成2~3个即: 训练集(train set) 验证集(validation set) 测试集(test set) 一般需要将样本分成独立的三部分 ...

  3. 在Caffe的训练过程中打印验证集的预测结果

    起因:Caffe里的GoogLeNet Inception V1只能输出对应于三个loss的accuracy,我想计算precision,recall和F1-measure.但是调用caffe的Pyt ...

  4. Tensorflow下利用Deeplabv3+训练自己的数据(超详细完整版)

    使用deeplabv3+进行语义分割 环境要求:python3.tensorflow-gpu 1.11.0或者以上,ubuntu/win都可以 0.DeepLabv3+代码下载 0.1 将tensor ...

  5. 【AI-1000问】训练为什么要分测试集和验证集?

    往期视频(前往有三AI公众号观看) 为什么要分训练集和测试集呢? 在很多的书以及一些公开数据集中,都会将数据集分为训练集,验证集和测试集,看起来验证集和测试集并没有区别,为什么要分这两个呢? 作者/编 ...

  6. 文本分类训练集 测试集_【AI1000问】训练为什么要分测试集和验证集?

    9 往期视频 点击边框调出视频工具条 为什么要分训练集和测试集呢? 在很多的书以及一些公开数据集中,都会将数据集分为训练集,验证集和测试集,看起来验证集和测试集并没有区别,为什么要分这两个呢? 作者/ ...

  7. 训练集损失值loss、测试集val_loss、验证集loss相关问题总结

    loss是训练集的损失值,val_loss是测试集的损失值 如何判断模型是否可以继续训练?(或者说好坏) 以下是loss与val_loss的变化反映出训练走向的规律总结: train loss 不断下 ...

  8. 深度神经网络训练过程中为什么验证集上波动很大_图神经网络的新基准

    作者 | 李光明 编辑 | 贾 伟 编者注:本文解读论文与我们曾发文章<Bengio 团队力作:GNN 对比基准横空出世,图神经网络的「ImageNet」来了>所解读论文,为同一篇,不同作 ...

  9. CIFAR10数据集训练及测试

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

最新文章

  1. Redis安装与源码调试
  2. axios请求接口http_Vue使用Axios实现http请求以及解决跨域问题
  3. 1.Tomcat配置
  4. BZOJ 2818: Gcd 筛法
  5. webrtc一对一通话
  6. 利用nginx搭建RTMP视频点播、直播、HLS服务器
  7. python:else与循环语句联合用法
  8. php显示mysql数据实例_php 连接mysql数据库并显示数据 实例 转载 aoguren
  9. Reading papers_6(Pattern Recognition And Machine Learning一书,ing...)
  10. Mac的搜狗输入法和QQ输入法加入⌘⌥⌃⇧自定义短语
  11. Oracle数据库时间戳转date类型进行判断操作
  12. MXF 媒体交换文件格式
  13. java mqtt服务器搭建
  14. 串口通信pyserial
  15. 企业微信员工离职后,还能看聊天记录吗?
  16. Cartographer的CSM理解
  17. 42岁大厂高管,给30岁-39岁人提个醒:这6个让你变强的习惯,要尽快养成
  18. 常见的状态码及错误信息提示
  19. 世界上第一台通用计算机是多少年诞生的,世界上第一台通用计算机ENIAC是( )年诞生的。...
  20. java计算机毕业设计高校体育器材及场地管理(附源码、数据库)

热门文章

  1. 趋势交易和均值回归交易——哪个更好?
  2. Unity(转载) 图形渲染与优化
  3. vue在新页面打开docx文件
  4. arm-linux-gcc编译x264
  5. 上云说丨上云迁移——快,准,稳!
  6. 「津津乐道播客」#348 厂长来了:AI是怎样帮你挡掉电诈的?
  7. Android 10 分区存储完全解析
  8. 计算机属性 资源管理器停止,资源管理器已停止工作,教您怎么解决资源管理器已停止工作...
  9. Casein-PEG-Indocyanine green 络蛋白-聚乙二醇-吲哚菁绿 Casein-ICG
  10. 戳穿Windows XP的经典谣言