1.6 例子:CIFAR-10分类
CIFAR-10分类,步骤如下:
1)使用torchvision加载并预处理CIFAR-10数据集
2)定义网络
3)定义损失函数和优化器
4)训练网络并更新网络参数
5)测试网络
CIFAR-10数据加载及预处理
CIFAR-10是一个常用的彩色图片数据集,它有10个类别airplane、automobile、bird、cat、deer、dog、frog、horse、ship和truck。每张图片都是3*32*32,也就是3通道彩色图片,分辨率为32*32。
import torch as t
import torchvision as tv
import torchvision.transforms as transforms
from torchvision.transforms import ToPILImage
show = ToPILImage()#可以把Tensor转成Image,方便可视化#第一次运行程序torchvision会自动下载CIFAR-10数据集
#大约100MB,需要花费一定的时间,
#如果已经下载有CIFAR-10,可通过root参数指定#定义对于数据的预处理
transform=transforms.Compose([transforms.ToTensor(),#转为Tensortransforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))#归一化
])#训练集
trainset = tv.datasets.CIFAR10(root='/B/CIFAR-10data/',train=True,download=True,transform=transform
)trainloader=t.utils.data.DataLoader(trainset,batch_size=4,shuffle=True,num_workers=2
)#测试集
testset = tv.datasets.CIFAR10 ('/B/CIFAR-10data/',train=False,download=True,transform=transform
)testloader = t.utils.data.DataLoader (testset,batch_size=4,shuffle=False,num_workers=2
)
classes=('airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')#定义网络
import torch.nn as nn
import torch.nn.functional as F
import timestart = time.time () # 计时# 定义网络结构
class Net (nn.Module):def __init__(self):super (Net, self).__init__ ()self.conv1 = nn.Conv2d (3, 6, 5)self.conv2 = nn.Conv2d (6, 16, 5)self.fc1 = nn.Linear (16 * 5 * 5, 120)self.fc2 = nn.Linear (120, 84)self.fc3 = nn.Linear (84, 10)def forward(self, x):x = F.max_pool2d (F.relu (self.conv1 (x)), 2)x = F.max_pool2d (F.relu (self.conv2 (x)), 2)x = x.view (x.size ()[0], -1)x = F.relu (self.fc1 (x))x = F.relu (self.fc2 (x))x = self.fc3 (x)return xnet = Net ()
print (net)#定义优化和损失
# 定义优化和损失
loss_func = nn.CrossEntropyLoss () # 交叉熵损失函数
optimizer = t.optim.SGD (net.parameters (), lr=0.001, momentum=0.9)# 训练网络
for epoch in range (2):running_loss = 0for i, data in enumerate (trainloader, 0):inputs, labels = dataoutputs = net (inputs)loss = loss_func (outputs, labels)optimizer.zero_grad ()loss.backward ()optimizer.step ()running_loss += loss.item ()if i % 2000 == 1999:print ('epoch:', epoch + 1, '|i:', i + 1, '|loss:%.3f' % (running_loss / 2000))running_loss = 0.0
end = time.time ()
time_using = end - start
print ('finish training')
print ('time:', time_using)#测试结果correct = 0 #定义的预测正确的图片数
total = 0#总共图片个数
with t.no_grad():for data in testloader:images,labels = dataoutputs = net(images)_,predict = t.max(outputs,1)total += labels.size(0)correct += (predict == labels).sum()
print('测试集中的准确率为:%d%%'%(100*correct/total))
Dataloader是一个可迭代的对象,它将dataset返回的每一条数据样本拼接成一个batch,并提供多线程加速优化和数据打乱等操作。当程序对dataset的所有数据遍历完一遍之后,对Dataloader也完成了一次迭代。
此处训练了仅仅2个epoch(遍历完一遍数据集称为一个epoch),可观察网络是否有效。将测试图片输入网络,计算它的label,然后与实际label进行比较。
输出:
Files already downloaded and verified
Files already downloaded and verified
Net(
(conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
(fc1): Linear(in_features=400, out_features=120, bias=True)
(fc2): Linear(in_features=120, out_features=84, bias=True)
(fc3): Linear(in_features=84, out_features=10, bias=True)
)
epoch: 1 |i: 2000 |loss:2.156
epoch: 1 |i: 4000 |loss:1.826
epoch: 1 |i: 6000 |loss:1.693
epoch: 1 |i: 8000 |loss:1.574
epoch: 1 |i: 10000 |loss:1.527
epoch: 1 |i: 12000 |loss:1.476
epoch: 2 |i: 2000 |loss:1.391
epoch: 2 |i: 4000 |loss:1.360
epoch: 2 |i: 6000 |loss:1.349
epoch: 2 |i: 8000 |loss:1.326
epoch: 2 |i: 10000 |loss:1.300
epoch: 2 |i: 12000 |loss:1.291
finish training
time: 217.39351534843445
测试集中的准确率为:54%
我们已经可以看出效果,准确率为54%,但这只是一部分图片,我们再来看看在整个测试机上的效果。
训练的准确率远远比随机猜测的(准确率为10%)好,证明网络确实学到了东西。
在GPU上训练
就像之前把Tensor从CPU转到GPU一样,模型也可以从CPU转到GPU。
if t.cuda.is_available():net.cuda()images=images.cuda()labels=labels.cuda()output=net(Variable(images))loss=criterion(output,Variable(labels))
1.6 例子:CIFAR-10分类相关推荐
- 【神经网络】(4) 卷积神经网络(CNN),自定义网络,案例:彩色图像10分类
各位同学大家好,今天和大家分享一下TensorFlow2.0中如何使用函数方法自定义卷积神经网络. 1. 导入数据 获取系统自带的10分类图像数据,50k张用于训练,10k张用于测试. # 10分类卷 ...
- 实验:3*3卷积核10分类9*9图片卷积核数量最优值
(0,1,2,3,4,5,6,7,8,9)--con(3*3)*n-49*n*30*10 将mnist的图片用间隔取点的办法处理成9*9,用3*3的卷积核,卷积核的数量从1个到57个,收敛标准是1e- ...
- DL之LiRDNNCNN:利用LiR、DNN、CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测
DL之LiR&DNN&CNN:利用LiR.DNN.CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测 目录 输出结果 设计思路 核心代码 输出结果 数据集:Da ...
- 【Python成长之路】机器学习:10+分类算法汇总学习
一直都说python是人工智能.机器学习等算法的良配,很多python大神除了常规的大数据爬虫.网站开发等代码能力外,人工智能/机器学习也都是手到擒来.因此我也"跳坑"来看看 . ...
- HALCON 20.11:深度学习笔记(10)---分类
HALCON 20.11:深度学习笔记(10)---分类 HALCON 20.11.0.0中,实现了深度学习方法. 本章解释了如何在训练和推理阶段使用基于深度学习的分类. 基于深度学习的分类是一种对一 ...
- 【神经网络】(8) 卷积神经网络(Mobilenet_v1),案例:cifar图像10分类
各位同学大家好,今天和大家分享一下TensorFlow2.0中如何搭载Mobilenet_v1神经网络. 1. 模型简介 MobileNet系列是轻量级网络的一个系列,是针对移动端以及嵌入式视觉的应用 ...
- 二级分类 php 两张表,PHP_php smarty 二级分类代码和模版循环例子,二级分类的数据表结构如下: - phpStudy...
php smarty 二级分类代码和模版循环例子 二级分类的数据表结构如下: PHP代码如下 复制代码 代码如下: /** @ 文章分类 含二级分类 @ param int $rootnum -- 一 ...
- 基于SVM的思想做CIFAR 10图像分类
#SVM 回顾一下之前的SVM,找到一个间隔最大的函数,使得正负样本离该函数是最远的,是否最远不是看哪个点离函数最远,而是找到一个离函数最近的点看他是不是和该分割函数离的最近的. 使用large ma ...
- 深度学习入门——利用卷积神经网络训练CIFAR—10数据集
CIFAR-10数据集简介 CIFAR-10是由Hinton的学生Alex Krizhevsky和Ilya Sutskever整理的一个用于普适物体的小型数据集.它一共包含10个类别的RGB彩色图片: ...
- 为CIFAR图片分类模型添加BN
一 实例描述 演示BN函数的使用方法. 二 代码 import cifar10_input import tensorflow as tf import numpy as np from tensor ...
最新文章
- 2018.12.13待填之坑
- python数据可视化的特点_Python数据可视化 pyecharts实现各种统计图表过程详解
- 使用jquery图表插件jqplot之折线图
- 数据结构——平衡二叉树
- 面试官跟我扯了半小时 CountDownLatch 后,给我发 Offer?| 原力计划
- 计算机网络的概述发展填空题,计算机网络安全概述填空题.doc
- set集合判断集合中是否有无元素_JAVA 集合
- st7789 旋转_玩转 ESP32 + Arduino(二十八) TFT_eSPI库驱动ST7789
- [项目管理] 项目管理之配置管理
- java多线程(超级详细)
- 目标决定人生——没有目标就失去一切!
- 常用应用层协议及HTTP协议
- 匠心铸梦 敏涵控股集团打造民族领军品牌
- 统计文本文件中的英文单词数量
- UVA 几道dp题总结
- 3.23 docker---内存控制,cgroup,cpu控制,磁盘控制,docker-compose,docker-swam集群,K8s控制docker
- INSTALL_FAILED_NO_MATCHING_ABIS 安装包安装失败,返回代码res=-113的解决办法 B站弹幕
- 每天节省一点点,你的生活竟可以这般变化!
- 穿越时间的蛀洞——书评《Java企业设计模式》
- bootstrap分页css样式,修改bootstrap-table中的分页样式