静态网站举例,建筑工程资质,大转盘网站程序,南昌制作手机网站同学你好#xff01;本文章于2021年末编写#xff0c;获得广泛的好评#xff01;
故在2022年末对本系列进行填充与更新#xff0c;欢迎大家订阅最新的专栏#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现#xff0c;
Pytorch深度学习理论篇(2023版)目录地址…同学你好本文章于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的数值就有一千个因此有 lenweight 样本数。 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]*1000bbblist(WeightedRandomSampler(weights, 200, replacementTrue))print(bbb)
1.3.2 dataset类上的实现
weights aaa[1]*20000
samplerWeightedRandomSampler(weights,num_samples200,replacementTrue)_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(rD:\data\ocr\wanqu\archive, train, transformtrans)train_dl DataLoader(train_ds, batch_size2,num_workers1,samplersampler)# train_dl DataLoader(train_ds, batch_size20,num_workers1,shuffleTrue)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
用于单标签二分类或者多标签二分类它相当于SigmoidBCELoss即对网络输出的结果先做一次Sigmoid将其值域变为[01]再对其与标签之间做BCELoss。
当网络最后一层使用nn.Sigmoid时就用BCELoss。
当网络最后一层不使用nn.Sigmoid时就用BCEWithLogitsLoss。
2.3 CrossEntropyLoss
用于多类别分类输出和目标的维度是(batchC)batch是样本数量C是类别数量。每一个C之间是互斥的相互关联的。
对于每一个batch的C个值一起求每个C的softmax所以每个batch的所有C个值之和是1哪个值大代表其属于哪一类。
若用于二分类那输出和目标的维度是(batch2)。