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

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: Sampler类中有一个派生的权重采样类WeightedRandomSampler,能够在加载数据时,按照指定的概率进行随机顺序采样。

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


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


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


CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录


本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲解与分析,通过将深度学习知识与Pytorch的高效结合,帮助各位新入门的读者理解深度学习各个模板之间的关系,这些均是在Pytorch上实现的,可以有效的结合当前各位研究生的研究方向,设计人工智能的各个领域,是经过一年时间打磨的精品专栏!

https://v9999.blog.csdn.net/article/details/127587345


欢迎大家订阅(2023版)理论篇

以下为2021版原文~~~~

815902569f6a467a99304f9ac1482386.png



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给出的权重,生成六个索引,而且是重复取样。


a6c4e04c2bfe492da6d4a7cdd7ca1ddc.png


从输出可以看出,位置 [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 WeightedRandomSampler
weights=[1]*1000
bbb=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)。

目录
相关文章
|
7天前
|
机器学习/深度学习 编解码 自动驾驶
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
31 3
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
|
7天前
|
机器学习/深度学习 移动开发 测试技术
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV2,含模型详解和完整配置步骤
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV2,含模型详解和完整配置步骤
27 1
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV2,含模型详解和完整配置步骤
|
7天前
|
机器学习/深度学习 编解码 TensorFlow
RT-DETR改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构
RT-DETR改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构
23 0
RT-DETR改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构
|
7天前
|
机器学习/深度学习 计算机视觉 异构计算
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2023 FasterNet 高效快速的部分卷积块
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2023 FasterNet 高效快速的部分卷积块
18 0
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2023 FasterNet 高效快速的部分卷积块
|
7天前
|
机器学习/深度学习 计算机视觉 iOS开发
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构
31 0
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构
|
7天前
|
机器学习/深度学习 计算机视觉 网络架构
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
93 63
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
|
7天前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
89 62
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
|
7天前
|
机器学习/深度学习 自动驾驶 计算机视觉
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构
86 61
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构
|
11天前
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型
49 18
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型
|
7天前
|
机器学习/深度学习 算法 文件存储
RT-DETR改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
RT-DETR改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
19 4
RT-DETR改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型

热门文章

最新文章