同学你好!本文章于2021年末编写,获得广泛的好评!

故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现,

Pytorch深度学习·理论篇(2023版)目录地址为:

CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲解与分析,通过将深度学习知识与Pytorch的高效结合,帮助各位新入门的读者理解深度学习各个模板之间的关系,这些均是在Pytorch上实现的,可以有效的结合当前各位研究生的研究方向,设计人工智能的各个领域,是经过一年时间打磨的精品专栏!https://v9999.blog.csdn.net/article/details/127587345欢迎大家订阅(2023版)理论篇

以下为2021版原文~~~~

1 样本均衡

当训练样本不均衡时,可以采用过采样、欠采样、数据增强等手段来避免过拟合。

1.1 使用权重采样类

Sampler类中有一个派生的权重采样类WeightedRandomSampler,能够在加载数据时,按照指定的概率进行随机顺序采样。

WeightedRandomSampler(samples_weight, samples_num)

1、weights:对应的是“样本”的权重而不是“类别的权重”。 也就是说:有一千个样本,weight的数值就有一千个,因此有 len(weight)= 样本数。
2、num_sampes:提取的样本数目,待选取的样本数目一般小于全部的样本数
3、replacement:用于指定是否可以重复选取某一个样本,默认为True,即允许在个epoch中重复选取某一个样本。如果设为False,则当某一类的样本被全部选完,但其样本数自仍未达到num_samples时,sampler将不会再从该类中选取本,此时可能导致weights参数失效。

1.2 WeightedRandomSampler图文解释

如下图,weight是一些tensor,代表每个位置的样本对应的权重,WeightedRandomSampler(weights, 6, True) ,表示按照weight给出的权重,生成六个索引,而且是重复取样。

从输出可以看出,位置 [1] = 10 由于权重较大,被采样的次数较多,位置[0]由于权重为0所以没有被采样到,其余位置权重低所以都仅仅被采样一次。

1.2.1 获得某个数据集的权重手动计算方法

weight = [ ] 里面每一项代表该样本种类占总样本的倒数。

例如: 数据集 animal = [ cat, cat, dog, dog, dog],cat有两个,dog有三个。

解:
        第一步:先计算每种动物的占比,
                cat_count = 2/5 = 0.4
                dog_count = 3/5 = 0.6

第二步:再计算count的倒数,也就是占比的倒数,这个数值就是weight
                cat_weight = 1/count = 1/0.4 = 2.5
                dog_weight = 1/count = 1/0.6 = 1.67

第三步:生成权重
                weight 列表就可以写作:weight = [2.5, 2.5, 1.67, 1.67, 1.67]

1.3 WeightedRandomSampler代码实战

1.3.1 把1000条数据,概率相等的采样,采200条数据:

from torch.utils.data import WeightedRandomSamplerweights=[1]*1000bbb=list(WeightedRandomSampler(weights, 200, replacement=True))print(bbb)

1.3.2 dataset类上的实现

weights =aaa=[1]*20000
sampler=WeightedRandomSampler(weights,num_samples=200,replacement=True)_image_size = 32
_mean = [0.485, 0.456, 0.406]
_std = [0.229, 0.224, 0.225]
trans = transforms.Compose([transforms.RandomCrop(_image_size),# transforms.RandomHorizontalFlip(),# transforms.ColorJitter(.3, .3, .3),transforms.ToTensor(),# transforms.Normalize(_mean, _std),
])if __name__ == '__main__':train_ds = DogsCatsDataset(r"D:\data\ocr\wanqu\archive", "train", transform=trans)train_dl = DataLoader(train_ds, batch_size=2,num_workers=1,sampler=sampler)# train_dl = DataLoader(train_ds, batch_size=20,num_workers=1,shuffle=True)for i, (data, target) in enumerate(train_dl):# print(i,target)if len(np.where(target.numpy() == 1)[0])>0:print('find 1')

1.3.3  Tip

在Dataloader类中,使用了采样器Sampler类就不能使用shume参数。

1.4 权重采样的影响

通过采样的方式进行样本均衡,只是一种辅助手段,它也会引入一些新的问题。在条件允许的情况下,还是推荐将所收集的样本尽量趋于均衡。

1.4.1 过采样

重复正比例数据,实际上没有为模型引入更多数据,过分强调正比例数据,会放大正比例噪声对模型的影响。

1.4.2 欠采样

丢弃大量数据,和过采样一样会存在过拟合的问题。

1.5 通过权重损失控制样本均衡

在多标签非互斥的分类任务(一个对象可以被预测出多种分类)中,还可以使用   BCEWithLogitsLoss函数,在计算损失时为每个类别分配不同的权重。

这种方式可以使模型对每个类别的预测能力达到均衡。例如,多分类的个数是6,则可以使用类似的代码指定每个分类的权重:

pos_weight = torch.ones( [6] )#为每个分类指定权重为1
criterion = torch.nn.BCEwithLogitsioss( posweight = pos_weight)

2 分类模型常用的损失函数

2.1 BCELoss

用于单标签二分类或者多标签二分类,即一个样本可以有多个分类,彼此不互斥。输出和目标的维度是(batch,C),batch是样本数量,C是类别数量。每个C值代表属于一类标签的概率。

2.2 BCEWthLogtsLoss

用于单标签二分类或者多标签二分类,它相当于Sigmoid+BCELoss,即对网络输出的结果先做一次Sigmoid将其值域变为[0,1],再对其与标签之间做BCELoss。

当网络最后一层使用nn.Sigmoid时,就用BCELoss。

当网络最后一层不使用nn.Sigmoid时,就用BCEWithLogitsLoss。

2.3 CrossEntropyLoss

用于多类别分类,输出和目标的维度是(batch,C),batch是样本数量,C是类别数量。每一个C之间是互斥的,相互关联的。

对于每一个batch的C个值,一起求每个C的softmax,所以每个batch的所有C个值之和是1,哪个值大,代表其属于哪一类。

若用于二分类,那输出和目标的维度是(batch,2)。

【Pytorch神经网络理论篇】 34 样本均衡+分类模型常见损失函数相关推荐

  1. 【Pytorch神经网络理论篇】 31 图片分类模型:ResNet模型+DenseNet模型+EffcientNet模型

    1 ResNet模型 在深度学习领域中,模型越深意味着拟合能力越强,出现过拟合问题是正常的,训练误差越来越大却是不正常的. 1.1 训练误差越来越大的原因 在反向传播中,每一层的梯度都是在上一层的基础 ...

  2. 【Pytorch神经网络理论篇】 30 图片分类模型:Inception模型

    1 Inception系列模型 Incepton系列模型包括V1.V2.V3.V4等版本,主要解决深层网络的三个问题: 训练数据集有限,参数太多,容易过拟合: 网络越大,计算复杂度越大,难以应用: 网 ...

  3. 【Pytorch神经网络理论篇】 29 图卷积模型的缺陷+弥补方案

    图卷积模型在每个全连接网络层的结果中加入了样本间的特征计算.其述质是依赖深度学特征与缺陷. 1.1 全连接网络的特征与缺陷 多层全连接神经网络被称为万能的拟合神经网络.先在单个网络层中用多个神经元节点 ...

  4. 【Pytorch神经网络理论篇】 20 神经网络中的注意力机制

    注意力机制可以使神经网络忽略不重要的特征向量,而重点计算有用的特征向量.在抛去无用特征对拟合结果于扰的同时,又提升了运算速度. 1 注意力机制 所谓Attention机制,便是聚焦于局部信息的机制,比 ...

  5. 【Pytorch神经网络理论篇】 22 自编码神经网络:概述+变分+条件变分自编码神经网络

    1 无监督学习模型的概述 在监督训练中,模型能根据预测结果与标签差值来计算损失,并向损失最小的方向进行收敛. 在无监督训练中,无法通过样本标签为模型权重指定收敛方向,这就要求模型必须有自我监督的功能. ...

  6. 【Pytorch神经网络理论篇】 21 信息熵与互信息:联合熵+条件熵+交叉熵+相对熵/KL散度/信息散度+JS散度

    1 信息熵 熵 (Entropy),信息熵:常被用来作为一个系统的信息含量的量化指标,从而可以进一步用来作为系统方程优化的目标或者参数选择的判据. 1.1 信息熵的性质 单调性,发生概率越高的事件,其 ...

  7. 【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU

    ①激活函数:主要通过加入非线性因素,你不线性模型表达能力不足的缺陷,因为神经网络中的数学基础是处处可微分的函数,故要求激活函数也应该保证数据的输入与输出是可微分. ②激活函数可以分为饱和激活函数与不饱 ...

  8. 【Pytorch神经网络理论篇】 06 神经元+神经网络模型+全连接网络模型

    1 神经元 1.1 概述 1.1.1 神经网络 神经网络:一种人工模仿动物中枢系统的数学模型,用于对函数进行近似估计 1.1.2 神经元 神经网络的基本单位是神经元. 神经元是一种处理单元,是对人脑组 ...

  9. 【Pytorch神经网络理论篇】 32 PNASNet模型:深层可分离卷积+组卷积+空洞卷积

    1 PNASNet模型简介 PNASNet模型是Google公司的AutoML架构自动搜索所产生的模型,它使用渐进式网络架构搜索技术,并通过迭代自学习的方式,来寻找最优网络结构.即用机器来设计机器学习 ...

最新文章

  1. Glide 这样用,更省内存
  2. 大数据安全“脆弱性”凸显 防护成重要课题
  3. UITableView中selectRowAtIndexPath: animated:scrollPosition滚动到指定Row
  4. xhtml中的五个块元素
  5. python摄像头人脸识别代码_python 实现摄像头人脸识别
  6. 为什么构造函数不能是虚函数
  7. 【HDU - 1326】Box of Bricks(模拟水题)
  8. html标签始终在右下角,html+javascript实现图片始终在页面右下角
  9. 【MySQL】ERROR 1055 (42000) ROUP BY clause this is incompatible with sql_mode=only_full_group_by
  10. cmd jar 无效_为什么我的JAR文件以CMD执行,而不是双击执行?
  11. 编译原理:flex与bison--从0到1完成一个编译器(sample语言)①
  12. 【蓝牙串口无线烧写程序】适用于STM32F405RG的Bootloader
  13. 最受玩家喜爱的十大游戏IP类型,你最喜欢哪个?
  14. 解决:steps/make_fbank.sh: line 132: run.pl: command not found
  15. XP系统硬盘安装Ubuntu14.04-超详细
  16. 2014年爆火的脸萌,真的消失了吗?
  17. 8.HPA自动扩缩容
  18. android中设置默认语言、默认时区
  19. 发送邮件工具类 - EmaiHelper
  20. 虚拟主机如何连接MYSQL数据库呢?

热门文章

  1. web -【在线聊天】
  2. 【ChatGPT】ChatGPT使用指南——句词分类
  3. 需要network lightweight filter disk 上的文件netft.sys
  4. [和平之月系列] 《都 Ancient City Ⅱ》 钢琴
  5. AOP术语、SpringAOP
  6. cs224n学习笔记
  7. 库尔巴克·莱布勒------KL散度
  8. 智能制造的生产运营管理
  9. 客户关系管理CRM系统源码PHP开源软件源码
  10. 【课程汇总】OpenHarmony 成长计划知识赋能第三期系列课程(附链接)