pytorch_cifar10 学习记录(91%准确率)

article/2025/10/7 21:39:57

目录

一、首次尝试深度学习

1.1训练参数

网络结构:

1.2训练结果

1.3 总结

二、修改网络和学习率,初次使用GPU炼丹(kaggle线上炼丹)

2.1训练参数

三、cifar10数据增强后进行炼丹

3.1 参数设置

3.2训练记录

3.2.1 0-100轮训练

3.2.2 100-150轮训练

3.2.3 150-200轮训练

四、加深网络(kaggle 使用 tensorboard)

五、使用残差网络


一、首次尝试深度学习

1.1训练参数

网络结构:

        注:在每个Convolution层后面加了Relu

学习率:0.001

优化器:SGD

训练:使用CPU(我电脑没有独显。。寄)训练约30h

1.2训练结果

在test集上的准确率为59.33%

之后我把调用摄像头,使用该模型分辨图像,发现识别还是经常出现错误。

 比如下图的“猫猫车”:

1.3 总结

学习率设置的太低了点,再加上我使用CPU训练,导致炼丹堪称龟速。

二、修改网络和学习率,初次使用GPU炼丹(kaggle线上炼丹)

2.1训练参数

网络结构:看了一些帖子,发现有人把最后的全连接层从两个改成了三个,训练结果有了进步。

            Flatten(),  # 7 Flatten层Linear(1024, 256),  # 8 全连接层Linear(256, 64),  # 8 全连接层Linear(64, 10)  # 9 全连接层

所以我也这样改了。

理由是在其他帖子上看到的:

“ 我们知道全连接层,卷积层都是线性运算,所以他们后面都要加激活函数引进非线性。
但是只用一层全连接层+激活函数的话由于全连接层的参数量太大,没办法解决非线性的问题。(其实都是猜测而已,毕竟玄学炼丹)
所以多加几层。”

学习率:改为了动态的,从0.05-0.001之间递减

learning_rate_max = 0.05
learning_rate_min = 0.001
learning_rate = learning_rate_max - (learning_rate_max - learning_rate_min) * (i + 1)/epoch

训练:注册了个kaggle的号,不得不说真的好用,一周免费用GPU30多个小时,体验了一波GPU炼丹,不得不说真的爽。大概用了40min,训练了120轮,最后发现test的准确率最多也就73%,接着训练发现虽然loss在飞快的下降,但是准确率也在下降,下降到69%的时候,我担心是过拟合了,所以就终止了炼丹。

2.2总结

训练时间过长,可能会出现过拟合的情况。

看了一些帖子,他们有人能用把准确率提高到90+,我也第一次看到了数据增强这个词。所以决定使用数据增强后,再进行炼丹。

我对数据增强有个疑问,为什么在数据集的transforms上加改动就行了?怎么创建新照片?新照片的label咋办?为啥数据增强后,数据集长度没变?

最后才明白数据增强没有增强数据集的长度,而是增强了特征。

(4 封私信 / 68 条消息) 请问使用pytorch进行数据增强之后数据量是否会增加? - 知乎 (zhihu.com)https://www.zhihu.com/question/535402700这个帖子完美的回答了我的疑问

三、cifar10数据增强后进行炼丹

3.1 参数设置

train_transforms = transforms.Compose([transforms.ToTensor(),  # 转化为tensor类型# 从[0,1]归一化到[-1,1]transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]),transforms.RandomHorizontalFlip(),  # 随机水平镜像transforms.RandomErasing(scale=(0.04, 0.2), ratio=(0.5, 2)),  # 随机遮挡transforms.RandomCrop(32, padding=4),  # 随机裁剪])test_transforms = transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),])

训练集经过归一化、水平镜像、遮挡、裁剪的步骤后,特征获得增强

3.2训练记录

3.2.1 0-100轮训练

学习率:0.005-0.001递减

最后测试集的正确率是78%

3.2.2 100-150轮训练

学习率:0.005-0.001递减

最后测试集的正确率是80.1%

训练期间,发现训练初期正确率一直在大范围波动(5%左右),所以猜测可能是初期的学习率高的原因

3.2.3 150-200轮训练

学习率:0.002-0.001递减

最后测试集的正确率是81.24%

四、加深网络(kaggle 使用 tensorboard)

之前的网络有三次卷积,我改成了四次。(下面注释的是之前的三层网络)

class Model(Module):def __init__(self):super(Model, self).__init__()self.neuralnet = Sequential(Conv2d(in_channels=3, out_channels=64, kernel_size=(3, 3), padding=1),  BatchNorm2d(64),Conv2d(in_channels=64, out_channels=64, kernel_size=(3, 3), padding=1),  BatchNorm2d(64),ReLU(inplace=True),MaxPool2d(kernel_size=2, ceil_mode=False), Conv2d(in_channels=64, out_channels=128, kernel_size=(3, 3), padding=1), BatchNorm2d(128),Conv2d(in_channels=128, out_channels=128, kernel_size=(3, 3), padding=1),BatchNorm2d(128),ReLU(inplace=True),MaxPool2d(kernel_size=2, ceil_mode=False),  Conv2d(in_channels=128, out_channels=256, kernel_size=(3, 3), padding=1), BatchNorm2d(256),Conv2d(in_channels=256, out_channels=256, kernel_size=(3, 3), padding=1), BatchNorm2d(256),ReLU(inplace=True),MaxPool2d(kernel_size=2, ceil_mode=False),  Conv2d(in_channels=256, out_channels=512, kernel_size=(3, 3), padding=1),  BatchNorm2d(512),Conv2d(in_channels=512, out_channels=512, kernel_size=(3, 3), padding=1),  BatchNorm2d(512),ReLU(inplace=True),MaxPool2d(kernel_size=2, ceil_mode=False), # Conv2d(in_channels=3, out_channels=32, kernel_size=(5, 5), padding=2), # ReLU(inplace=True),# MaxPool2d(kernel_size=2, ceil_mode=True), # Conv2d(in_channels=32, out_channels=32, kernel_size=(5, 5), padding=2),# ReLU(inplace=True),# MaxPool2d(kernel_size=2, ceil_mode=True), # Conv2d(in_channels=32, out_channels=64, kernel_size=(5, 5), padding=2),# ReLU(inplace=True),# MaxPool2d(kernel_size=2, ceil_mode=True),  #Flatten(),  # 7 Flatten层Linear(2048, 256),  # 8 全连接层Linear(256, 64),  # 8 全连接层Linear(64, 10)  # 9 全连接层)def forward(self, input):out = self.neuralnet(input)return out

网络结构如下:

(图来自他人的文章)(41条消息) Pytorch实战:8层神经网络实现Cifar-10图像分类验证集准确率94.71%_雪地(>^ω^<)的博客-CSDN博客_cifar10验证集

之后为了可视化训练过程,我想在kaggle上使用tensorboard,但是发现打不开网站,所以我把Loss和accuracy保存成了numpy类型,以.npy文件保存,下载到本地后再使用tensorboard就可以了。

之后训练了200轮,学习率在0.01-0.001之间线性递减

loss和accuracy如下:

最后的准确率达到了91%左右 

发现曲线似乎没有完全收敛,还有进步空间?再去训练看一看。

但是调用摄像头,使用准确率91%的网络进行训练,却发现实际效果实在是一般

 搜了一下,网上说可能是过拟合,需要加drop层。所以我加在了flatten层后面。设置概率为0.4。

又得从头训练咯。

五、使用残差网络

猜测部署效果不好可能是过拟合的原因,在询问了几个朋友之后,我决定尝试在网络中加入残差模块。

重写网络模型:

# @Time   : 2022/9/4 9:45
# @Author :lgl
# @e-mail :GuanlinLi_BIT@163.com
# @Time   : 2022/8/25 14:43import torch
from torch.nn import Module, Sequential, Conv2d, MaxPool2d, Flatten, Linear, ReLU, BatchNorm2d, Dropout
from torch.utils.data import DataLoaderclass Conv_Block(Module):def __init__(self, inchannel, outchannel, res=True):super(Conv_Block, self).__init__()self.res = res  # 是否带残差连接self.left = Sequential(Conv2d(inchannel, outchannel, kernel_size=(3, 3), padding=1, bias=False),BatchNorm2d(outchannel),ReLU(inplace=True),Conv2d(outchannel, outchannel, kernel_size=(3, 3), padding=1, bias=False),BatchNorm2d(outchannel),)self.shortcut = Sequential(Conv2d(inchannel, outchannel, kernel_size=(1,1), bias=False),BatchNorm2d(outchannel))self.relu = Sequential(ReLU(inplace=True))def forward(self, x):out = self.left(x)if self.res:out += self.shortcut(x)out = self.relu(out)return outclass Res_Model(Module):def __init__(self, res=True):super(Res_Model, self).__init__()self.block1 = Conv_Block(inchannel=3, outchannel=64)self.block2 = Conv_Block(inchannel=64, outchannel=128)self.block3 = Conv_Block(inchannel=128, outchannel=256)self.block4 = Conv_Block(inchannel=256, outchannel=512)# 构建卷积层之后的全连接层以及分类器:self.classifier = Sequential(Flatten(),  # 7 Flatten层Dropout(0.4),Linear(2048, 256),  # 8 全连接层Linear(256, 64),  # 8 全连接层Linear(64, 10))  # 9 全连接层 )   # fc,最终Cifar10输出是10类self.relu = ReLU(inplace=True)self.maxpool = Sequential(MaxPool2d(kernel_size=2))  # 1最大池化层def forward(self, x):out = self.block1(x)out = self.maxpool(out)out = self.block2(out)out = self.maxpool(out)out = self.block3(out)out = self.maxpool(out)out = self.block4(out)out = self.maxpool(out)out = self.classifier(out)return outres_neural_networks = Res_Model()

之后在kaggle上进行训练,最终准确率为91.25%

准确率变化情况:

loss变化情况:

之后把该模型部署到摄像头上,观察一下效果:

 效果还是比较令我满意的。

这个就暂时更新到这里吧,如果以后学到了新东西再来更新。

源代码链接:

(49条消息) cifar10-pytorch-模型源文件、train、test、use等源代码,kaggle上训练好的模型-Python文档类资源-CSDN文库https://download.csdn.net/download/ereqewe/86514528


http://chatgpt.dhexx.cn/article/22UBRpli.shtml

相关文章

精度评定中的准确率(Precision)和召回率(Recall)

在模式识别中&#xff0c;我们经常会使用到一些指标对目标识别或者影像分类的结果进行评价。 假设我们需要将一个样本集分类为苹果和非苹果两类&#xff0c;那么分类结果有四种情况&#xff1a; 第一种情况&#xff1a;True Positive&#xff0c;本来就是苹果被分类成苹果&…

机器学习:什么是召回率、准确率和精确率?

在机器学习中&#xff0c;经常会听到准确率、召回率及精确率三个专业评价指标&#xff0c;刚开始接触时&#xff0c;总是会傻傻的分不清&#xff0c;今天之后&#xff0c;就能准确区分了&#xff01; —准确率&#xff1a;就是在预测的所有样本中预测正确的比率&#xff08;包…

准确率、精度和召回率

原文链接 精度&#xff08;查准率&#xff09;和召回率&#xff08;查全率&#xff09;是衡量机器学习模型性能的重要指标&#xff0c;特别是数据集分布不平衡的案例中。 什么是分布不平衡的数据集&#xff1f; 倘若某人声称创建一个能够识别登上飞机的恐怖分子的模型&#…

深度学习提高模型准确率方法

这里写目录标题 深度学习数据使用更多数据更改图像大小减少颜色通道 算法模型改进增加训练轮次迁移学习添加更多层调整超参数 总结 深度学习 我们已经收集好了一个数据集&#xff0c;建立了一个神经网络&#xff0c;并训练了模型&#xff0c;在测试和验证阶段最后得到的准确率…

准确率、精准率和召回率的理解

我们在在分类任务时&#xff0c;经常会对模型结果进行评估。评估模型好坏的指标有AUC、KS值等等。这些指标是通过预测概率进行计算的。而准确率、精准率和召回率也通过混淆矩阵计算出来的。下图是对混淆矩阵的介绍&#xff1a; 其中&#xff0c; TP&#xff1a;样本为正&#…

准确率召回率

http://blog.sina.com.cn/s/blog_4b59de070100ehl7.html 最近一直在做相关推荐方面的研究与应用工作&#xff0c;召回率与准确率这两个概念偶尔会遇到&#xff0c; 知道意思&#xff0c;但是有时候要很清晰地向同学介绍则有点转不过弯来。 召回率和准确率是数据挖掘中预测、互…

准确度(accuracy)、精确率(precision)、召回率(recall)、F1值 谈谈我的看法

目录 前言 基本概念 准确率 Accuracy 精确度 Precision 召回率 Recall F1 值 sklearn 的评估函数 pyspark 的评估函数 tensorflow 的评估函数 多分类下的评估 前言 准确度、精确率、召回率、F1值作为评估指标&#xff0c;经常用到分类效果的评测上。比较好理解的二分…

准确率,精确率,召回率和F1值

机器学习(ML),自然语言处理(NLP),信息检索(IR)等领域,评估(Evaluation)是一个必要的 工作,而其评价指标往往有如下几点:准确率(Accuracy),精确率(Precision),召回率(Recall)和F1-Measure。 (注&#xff1a; 相对来说&#xff0c;IR 的 ground truth 很多时候是一个 Ordered Lis…

准确率与召回率

在信息检索、分类体系中&#xff0c;有一系列的指标&#xff0c;搞清楚这些指标对于评价检索和分类性能非常重要&#xff0c;因此最近根据网友的博客做了一个汇总。 准确率、召回率、F1 信息检索、分类、识别、翻译等领域两个最基本指标是召回率(Recall Rate)和准确率(Precisio…

【机器学习】召回率、精确率、准确率的区别

1. 作用语言定义 作用&#xff1a;提升****精确率是为了不错报、提升召回率是为了不漏报 分不清准确率和精确率&#xff0c;在这里先正确区分一下精确率和准确率&#xff0c;以及他们的别称这里[HashArt]给出了一个通俗易懂的解释&#xff1a;(https://zhuanlan.zhihu.com/p/9…

准确率、精确率、召回率、F值

准确率&#xff1a;正确的数量除以总数量 准确率&#xff08;accuracy&#xff09;&#xff0c;是一个用来衡量分类器预测结果与真实结果差异的一个指标&#xff0c;越接近于1说明分类结果越准确。举个例子&#xff0c;比如现在有一个猫狗图片分类器对100张图片进行分类&#…

准确率、精确率、召回率和F-score

文章目录 一、TP、FP、FN和TN二、 准确率(accuracy)、精确率&#xff08;precision&#xff09;、召回率&#xff08;Recall&#xff09;、F-score三、各个指标意义和优缺点 一、TP、FP、FN和TN 举例来说&#xff0c;用血压值来检测一个人是否有高血压&#xff0c;测出的血压值…

准确率(Accuracy) | 查准率(Precision) | 查全率(Recall)

目录 样本 识别结果 指标计算 Accuracy&#xff08;准确率&#xff09; Precision&#xff08;精确率、查准率&#xff09; Recall &#xff08;召回率、查全率&#xff09; 为什么要不同的指标&#xff1f; 综合评价 (F-Score) 在机器学习中&#xff0c;对于一个模型…

通俗解释机器学习中的召回率、精确率、准确率

赶时间的同学们看这里&#xff1a;提升精确率是为了不错报、提升召回率是为了不漏报 网络上很多地方分不清准确率和精确率&#xff0c;在这里先正确区分一下精确率和准确率&#xff0c;以及他们的别称 切入正题 很多人分不清召回率和精确率的区别&#xff0c;即使记住了公式…

详解准确率、精确率、召回率、F1值的含义

机器学习问题之中&#xff0c;通常需要建立模型来解决具体问题&#xff0c;但对于模型的好坏&#xff0c;也就是模型的泛化能力&#xff0c;如何进行评估呢&#xff1f; 很简单&#xff0c;我们可以定一些评价指标&#xff0c;来度量模型的优劣。比如准确率、精确率、召回率、…

准确率,召回率

1、准确率与召回率&#xff08;Precision & Recall&#xff09; 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值&#xff0c;用来评价结果的质量。其中精度是检索出相关文档数与检索出的文档总数的比率&#xff0c;衡量的是检索系统的查准率&#xff1b;召…

如何解释准确率、精确率与召回率?

对于二分类问题&#xff0c;机器预测的和实际的还是会有所偏差&#xff0c;所以我们引入以下几个概念来评价分类器的优良。 首先有关TP、TN、FP、FN的概念。TP与TN都是机器&#xff08;预测&#xff09;分类分对了的情况&#xff0c;TP是预测为正类且预测正确&#xff0c;TN是…

准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F值(F-Measure)、AUC、ROC的理解

一、准确率、精确率、召回率和 F 值 (1)若一个实例是正类&#xff0c;但是被预测成为正类&#xff0c;即为真正类(True Postive TP) (2)若一个实例是负类&#xff0c;但是被预测成为负类&#xff0c;即为真负类(True Negative TN) (3)若一个实例是负类&#xff0c;但是被预…

准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measure

yu Code 15 Comments 机器学习(ML),自然语言处理(NLP),信息检索(IR)等领域,评估(Evaluation)是一个必要的 工作,而其评价指标往往有如下几点:准确率(Accuracy),精确率(Precision),召回率(Recall)和F1-Measure。(注: 相对来说,IR 的 ground truth 很多时候是一个 Ordered L…

准确率,精准率,召回率,真正率,假正率,ROC/AUC

目录 前言一.准确率二.精准率三.召回率四.精准率和召回率的关系&#xff0c;F1分数五.F1分数六.灵敏度和特异度七.真正率和假正率八.ROC曲线 前言 最近在看到这些词得时候老是混淆&#xff0c;看了之后还很容易遗忘&#xff0c;于是查了些资料把他们记录下来。 我们在设计深度学…