Pytorch_杂项

presentation: 成长过程中的读书笔记,更多的是一些不成系统的小点,杂而多,慢慢整理出来放上来。

一、阅读笔记

1、

pytorch: Facebook

tensorflow: Google

MXnet: Amazon

2、

计算差异性:经常有正负,所以需要加一个平方,不使用绝对值原因:数学上绝对值会破坏函数的可微性。

3、

迁移学习:将已有的网络和训练好的权重一起迁移过来,然后训练过程中只修改最后的全连接层部分的参数,实现最后我们的分类目的。在相似数据集上的效果才是良好的。

4、

git熟练操作和理解——提高work效率

5、

RNN:常用的RNN有LSTM

6、

LSTM:常用于自然语言处理。

word embedding:自然语言处理中使用word embedding做词语预测(相当于建立词向量);词性判断。

7、

GAN:为创建无监督学习模型提供了强有力的算法框架

KL divergence: 统计学中横梁两种概率分布的相似程度,其越小,表示两种概率分布越接近。

8、

Pytorch中使用tensorboard可视化。

9、

Deep Dream:

Reverse Neural Network: 反向神经网络,选出一些神经元,看它能够模拟出最可能的图片是什么,将这些信息反向传回网络,每个神经元将会显示出它想增强的模式或者特征。

backward理解:

10、

模型中间层特征的输出使用。

11、

MXNet

gluon:https://github.com/mli/cvpr17

https://github.com/zackchase/mxnet-the-straight-dope

12、

tensorflow: https://github.com/chiphuyen/stanford-tensorflow-tutorials

13、

如何将原材料放入单炉:Pytorch dataloader; Pytorch ImageFolder

14、

寻找最优学习率:

梯度下降法:目前dl使用的一阶收敛算法,其他的自适应的优化算法,本质上都是对梯度下降法的各种变形。初始学习率对深层网络的收敛起着决定性的作用。

梯度下降公式:

在这里插入图片描述

这里 a 就是学习率,如果学习率太小,会导致网络loss下降非常慢,如果学习率太大,那么参数更新的幅度就非常大,就会导致网络收敛到局部最优点,或者loss直接开始增加。

15、

FCN : 全卷积神经网络,比如U-Net等

全卷积网络先使用卷积神经网络抽取图像特征,然后通过1×11×1卷积层将通道数变换为类别个数,最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。

16、

pytorch模型的部署;

17、

ReID: 行人重识别(Person Re-identification);

能够利用计算机视觉的算法来进行跨摄像头的追踪,也就是找到不同摄像头下的同一个人,这也是图像检索的一个子问题,同时因为摄像头的距离比较远,所以人的图像都比较模糊,没有办法通过人脸来定位,同时 ReID 更希望解决跨摄像头的问题,所以周围的环境以及摄像头的变化都会增加 ReID 的难度。

https://github.com/JDAI-CV/fast-reid

18、

self-supervised learning:无监督学习的一种,主要是希望能够学习到一种通用的特征表达用于下游任务。主要的方式就是通过自己监督自己,比如把一段话里面的几个单词去掉,用他的上下文去预测缺失的单词,或者将图片的一些部分去掉,依赖其周围的信息去预测缺失的 patch。

self-supervised learning主要两大类:

a、Generative Methods:

AutoEncoder为代表, 直接在pixel level上计算loss;

GAN, 通过判别网络来算 loss;

problems: 基于 pixel 进行重建计算开销非常大; 要求模型逐像素重建过于苛刻,而用 GAN 的方式构建一个判别器又会让任务复杂和难以优化。

b、Contrastive Methods

这类方法并不要求模型能够重建原始输入,而是希望模型能够在特征空间上对不同的输入进行分辨。

特点: 1. 在 feature space 上构建距离度量;2. 通过特征不变性,可以得到多种预测结果;3. 使用 Siamese Network;4. 不需要 pixel-level 重建。 正因为这类方法不用在 pixel-level 上进行重建,所以优化变得更加容易。当然这类方法也不是没有缺点,因为数据中并没有标签,所以主要的问题就是怎么去构造正样本和负样本。

论文:https://arxiv.org/abs/1807.03748

19、

FastReID:https://github.com/JDAI-CV/fast-reid

模型压缩:剪枝、量化、蒸馏等。

蒸馏:是一种比较流行的范式,可以保证模型不需要进行结构修改的情况下,得到较大的性能提升。

自动超参搜索:https://docs.ray.io/en/master/tune/index.html

20、评估:accuracy,precision,recall,f1

例子:

假如某个班级有男生80人,女生20人,共计100人.目标是找出所有女生.
现在某人挑选出50个人,其中20人是女生,另外还错误的把30个男生也当作女生挑选出来了.
作为评估者的你需要来评估(evaluation)下他的工作

准确率(accuracy):

对于给定的测试数据集,分类器正确分类的样本数与总样本数之比

也就是损失函数是0-1损失时测试数据集上的准确率。

TP,FN,FP,TN:

我们需要从一个班级中的人中寻找所有女生,如果把这个任务当成一个分类器的话,那么女生就是我们需要的,而男生不是,所以我们称女生为"正类",而男生为"负类".

以我们称女生为"正类",而男生为"负类".

相关(Relevant),正类无关(NonRelevant),负类
被检索到(Retrieved)true positives(TP 正类判定为正类,例子中就是正确的判定"这位是女生")false positives(FP 负类判定为正类,“存伪”,例子中就是分明是男生却判断为女生,当下伪娘横行,这个错常有人犯)
未被检索到(Not Retrieved)false negatives(FN 正类判定为负类,“去真”,例子中就是,分明是女生,这哥们却判断为男生–梁山伯同学犯的错就是这个)true negatives(TN 负类判定为负类,也就是一个男生被判断为男生,像我这样的纯爷们一准儿就会在此处)

通过这张表,我们可以很容易得到这几个值:

TP=20
FP=30
FN=0
TN=50

精确率(precision):"正确被检索的item(TP)"占所有"实际被检索到的(TP+FP)"的比例

公式:TP/(TP+FP)

召回率(recall):"正确被检索的item(TP)"占所有"应该检索到的item(TP+FN)

公式:TP/(TP+FN)

F1 值是precision和recall调和平均值:
在这里插入图片描述

21、释放显存

torch.cuda.empty_cache()

每次验证完加上这句

用nvidia-smi查不到对应的进程pid.
这时释放显存的方法:

sudo fuser /dev/nvidia*

该命令会显示所有占用nvidia设备的进程pid,将这些pid逐个kill掉:

kill -9 pid

22、epoch,batch,iteration

epoch:

当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次epoch。(也就是说,所有训练样本在神经网络中 进行了一次正向传播一次反向传播
再通俗一点,一个Epoch就是将所有训练样本训练一次的过程。

然而,当一个Epoch的样本(也就是所有的训练样本)数量可能太过庞大(对于计算机而言),就需要把它分成多个小块,也就是就是分成多个Batch来进行训练。

Batch(批 / 一批样本):
将整个训练样本分成若干个Batch

Batch_Size(批大小):
每批样本的大小。

Iteration(一次迭代):
训练一个Batch就是一次Iteration(这个概念跟程序语言中的迭代器相似)

在这里插入图片描述

why epoch>1?:

在神经网络中传递完整的数据集一次是不够的,而且我们需要将完整的数据集在同样的神经网络中传递多次。但请记住,我们使用的是有限的数据集,并且我们使用一个迭代过程即梯度下降来优化学习过程。如下图所示。因此仅仅更新一次或者说使用一个epoch是不够的。
在这里插入图片描述

随着epoch数量增加,神经网络中的权重的更新次数也在增加,曲线从欠拟合变得过拟合。

那么,问题来了,几个epoch才是合适的呢?

不幸的是,这个问题并没有正确的答案。**对于不同的数据集,答案是不一样的。**但是数据的多样性会影响合适的epoch的数量。比如,只有黑色的猫的数据集,以及有各种颜色的猫的数据集。

换算关系:
在这里插入图片描述

实际上,梯度下降的几种方式的根本区别就在于上面公式中的 Batch Size不同。

在这里插入图片描述

*注:上表中 Mini-Batch 的 Batch 个数为 N / B + 1 是针对未整除的情况。整除则是 N / B。

在这里插入图片描述

23、train, val, test

train是训练集,val是训练过程中的测试集,是为了让你在边训练边看到训练的结果,及时判断学习状态。test就是训练模型结束后,用于评价模型结果的测试集。

只有train就可以训练,val不是必须的,比例也可以设置很小。

test对于model训练也不是必须的,但是一般都要预留一些用来检测,通常推荐比例是8:1:1

valvalidation的简称。
training datasetvalidation dataset都是在训练的时候起作用。
而因为validation的数据集和training没有交集,所以这部分数据对最终训练出的模型没有贡献。
validation的主要作用是来验证是否过拟合、以及用来调节训练参数等。

比如训练0-10000次迭代过程中,trainvalidationloss都是不断降低,
但是从10000-20000过程中train loss不断降低,validationloss不降反升。
那么就证明继续训练下去,模型只是对training dataset这部分拟合的特别好,但是泛化能力很差。
所以与其选取20000次的结果,不如选择10000次的结果。
这个过程的名字叫做Early Stopvalidation数据在此过程中必不可少。

但是为什么现在很多人都不用validation了呢?

我的理解是现在模型中防止过拟合的机制已经比较完善了,Dropout\BN等做的很好了。
而且很多时候大家都用原来的模型进行fine tune(微调),也比从头开始更难过拟合。
所以大家一般都定一个训练迭代次数,直接取最后的模型来测试。

24、Batch size
Batch Size定义:一次训练所选取的样本数。

Batch Size的大小影响模型的优化程度和速度。同时其直接影响到GPU内存的使用情况,假如你GPU内存不大,该数值最好设置小一点。

Batch Size设置合适时的优点:
通过并行化提高内存的利用率。就是尽量让你的GPU满载运行,提高训练速度。
单个epoch的迭代次数减少了,参数的调整也慢了,假如要达到相同的识别精度,需要更多的epoch。
适当Batch Size使得梯度下降方向更加准确。

Batch Size从小到大的变化对网络影响:
没有Batch Size,梯度准确,只适用于小样本数据库
Batch Size=1,梯度变来变去,非常不准确,网络很难收敛。
Batch Size增大,梯度变准确,
Batch Size增大,梯度已经非常准确,再增加Batch Size也没有用

注意:Batch Size增大了,要到达相同的准确度,必须要增大epoch。

25、num_workers
a、每每轮到dataloader加载数据时:

for epoch in range(start_epoch, end_epoch):    
    for i, data in enumerate(trainloader):

dataloader一次性创建num_worker个worker,(也可以说dataloader一次性创建num_worker个工作进程,worker也是普通的工作进程),

并用batch_sampler将指定batch分配给指定worker,worker将它负责的batch加载进RAM。

然后,dataloader从RAM中找本轮迭代要用的batch,如果找到了,就使用。如果没找到,就要num_worker个worker继续加载batch到内存,直到dataloader在RAM中找到目标batch。一般情况下都是能找到的,因为batch_sampler指定batch时当然优先指定本轮要用的batch。

b、

num_worker设置得大,好处是寻batch速度快,因为下一轮迭代的batch很可能在上一轮/上上一轮…迭代时已经加载好了。坏处是内存开销大,也加重了CPU负担(worker加载数据到RAM的进程是CPU复制的嘛)。num_workers的经验设置值是自己电脑/服务器的CPU核心数,如果CPU很强、RAM也很充足,就可以设置得更大些。

c、

如果num_worker设为0,意味着每一轮迭代时,dataloader不再有自主加载数据到RAM这一步骤(因为没有worker了),而是在RAM中找batch,找不到时再加载相应的batch。缺点当然是速度更慢。

26、backbone
(为了实现从图像中检测目标的位置和类别,我们会先从图像中提取出些必要的特征信息,比如HOG特征,然后利用这些特征去实现定位和分类)在深度学习这一块,backbone部分的网络就是负责从图像中提取特征;

ResNet系列的工作问世后,图像分类任务几乎达到了一个顶峰。虽然后续这个领域还在陆陆续续地出现些新工作,但大多数都只是换汤不换药,涨涨点罢了。

深度学习技术之所以能够这么出色地完成图像分类任务,基本上体现出了其在图像特征提取这一块的出色表现;

随着迁移学习概念的兴起和普及,通过在检测任务中的数据集上对分类网络进行微调似乎是一个很不错的想法,所谓的“ImageNet pretrained model”概念就诞生了。简单地来说,就是目标检测和图像分类这两个任务具有一定的相似性,因为可以将分类的网络,比如VGG、ResNet等,用来做特征提取器。这一部分,我们就称其为backbone。

27、Detection head
分类网络迁移过来,用作特征提取器(通过在OD数据集上进行微调,并且与后续的网络的共同训练,使得它提取出来的特征更适合OD任务),后续的网络负责从这些特征中,检测目标的位置和类别。那么,我们就将分类网络所在的环节称之为“Backbone”,后续连接的网络层称之为“Detection head”。

28、Pytorch中的 model.train() 和 model.eval() 模式

model.train() :启用 BatchNormalization 和 Dropout

model.eval() :不启用 BatchNormalization 和 Dropout

训练完train_datasets之后,model要来测试样本了。在model(test_datasets)之前,需要加上model.eval(). 否则的话,有输入数据,即使不训练,它也会改变权值。这是model中含有batch normalization层所带来的的性质。
在做one classification的时候,训练集和测试集的样本分布是不一样的,尤其需要注意这一点。

使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval,eval()时,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大!!!!!!

Batch Normalization

BN的作用主要是对网络中间的每层进行归一化处理,并且使用变换重构**(Batch Normalization Transform)**保证每层提取的特征分布不会被破坏。

训练时是针对每个mini-batch的,但是测试是针对单张图片的,即不存在batch的概念。由于网络训练完成后参数是固定的,因此每个batch的均值和方差是不变的,因此直接结算所有batch的均值和方差。

Dropout

Dropout能够克服Overfitting,在每个训练批次中,通过忽略一半的特征检测器,可以明显的减少过拟合现象。

详细见文章:《Dropout: A Simple Way to Prevent Neural Networks from Overtting》

eval()就是保证BN和dropout不发生变化,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层影响结果!!

29、神经网络的数据表示-张量

神经网络使用的数据存储在多维Numpy数组中,也叫张量(tensor)。

张量是一个数据容器,张量的维度(dimension)通常叫做轴(axis)

30、深度学习中不平衡样本的处理
https://zhuanlan.zhihu.com/p/82448116

通过对训练集合数据的处理,让正样本的数量和负样本的数量比例趋于平衡(例如1:3)。常见的方式有数据重采样和数据增强。

### 数据重采样

数据重采样,是指在训练之前或者训练时候,对样本多的类别采样频率减少,对样本少的类别采样频率增大,从而使在训练的时候各类类别样本数目比较平衡。

#### 多数样本下采样

#### 少数样本上采样

### 数据增强

正样本不够,可以采取一些处理方式,增加正样本,这是一种简单易行的方式

#### 图像处理增加少类样本

对少数样本的图片添加噪音(例如高斯噪音),进行直方图均衡化操作,进行裁剪,小角度旋转,翻转等等,这些都可以在不改变样本种类的前提下增加少类样本的数量

#### SMOTE

SMOTE[Chawla et a., 2002]是通过对少数样本进行插值合成新的样本。比如对于每个少数类样本a,从a最邻近的样本中选取样本b,然后在[a,b]区间中随机选择一点作为新样本

#### Fancy PCA

31、置信度
置信度也称为可靠度,或bai置信水平、置信系数,du即在抽样对总体参数作出估计zhi时,由于dao样本的随机性,其结论总是不确定的。因此,采用一种概率的陈述方法,也就是数理统计中的区间估计法,即估计值与总体参数在一定允许的误差范围以内,其相应的概率有多大,这个相应的概率称作置信度。

置信区间表示具体值范围,置信水平是个概率值。例如:估计某件事件完成会在10~12日之间,但这个估计准确性大约只有80%:表示置信区间(10,12),置信水平80%。要想提高置信水平,就要放宽置信空间。

置信水平是指总体参数值落在样本统计值某一区内的概率;而置信区间是指在某一置信水平下,样本统计值与总体参数值间误差范围。置信区间越大,置信水平越高。

32、非极大值抑制

用于目标检测中提取分数最高的窗口的。

例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。
NMS在计算机视觉领域有着非常重要的应用,如视频目标跟踪、数据挖掘、3D重建、目标识别以及纹理分析等。

https://www.cnblogs.com/makefile/p/nms.html

https://blog.csdn.net/zouxiaolv/article/details/107400193

33、 监督学习、无监督学习与半监督学习

监督学习:训练集的每一个数据已经有特征和标签,即有输入数据和输出数据,通过学习训练集中输入数据和输出数据的关系,生成合适的函数将输入映射到输出。比如分类、回归。

无监督学习:训练集的每一个数据都只有特征,即只有输入数据,算法需要学习训练集中的特征关系,进行建模,试图使类内差距最小、类间差距最大。比如聚类。

半监督学习:训练集中一部分数据有特征和标签,另一部分只有特征,综合两类数据来生成合适的函数。

区别:

(1)监督学习需要有训练集和测试集,在训练集中寻找规律,在测试集中检验;而无监督学习只有一堆数据,需要从中寻找某种规律,没有训练集没有检验的过程。

(2)监督学习就是识别事物,按照标记好的特征和标签学习。无监督学习没有标签,如果经过学习发现数据集呈现某种聚集性,则可按照数据集现实的聚集性分类,但并不以某些样本最终和预先标记的标签相符合作为检验,没有检验的过程。

(3)无监督学习是在寻找数据的规律性,这种规律性最终不一定表现为分类数据集,也就是说不一定要“分类”。

监督学习

数据特点:特征+标签

模型: 主要为分类和回归算法 K近邻(KNN),决策树(DT),朴素贝叶斯(NB),逻辑回归(LR),线性回归(LR),支持向量机(SVM),集成算法(bagging算法和Boosting算法),神经网络

监督学习又可以分为有参数的监督学习和无参数的监督学习

半监督学习(具体可参考周志华西瓜书):

数据特点:特征+部分特征有标签

模型: 半监督分类,半监督回归,半监督聚类,半监督降维

我觉得迁移学习其实也可以算是半监督学习,还有个模型概念:domain adaptation也符合半监督的数据特点!

无监督学习

数据特点:只有特征

模型: 降维算法(PCA,Kernel-PCA,流形学习LLE等),聚类算法(kmeans,DBscan,高斯混合聚类,Agens等),自编码,对抗生成网络(GAN),关联规则,word2vec,EM算法

34、查看显卡状态

fuser -v /dev/nvidia* 查看是否有僵尸进程
lspci | grep -i vga #查看显卡状态
#查看指定显卡的详细信息命令:
lspci -v -s 03:00.0(显卡代号)
#Linux查看Nvidia显卡信息及使用情况:
nvidia-smi
nvidia-smi -l 1   #每秒刷新一次
watch -n 10 nvidia-smi #监视显存:我们设置为每 10s 显示一次显存的情况

35、backbone

大多时候指提取特征的网络,作用就是提取图片中的信息,供后面的网络使用。

​ 这些网络已经证明了在分类等问题上的特征提取能力是很强的,在用这些网络作为backbone的时候,直接加载官方已经训练好的模型参数,后面接着我们自己的网络。让网络的这两个部分同时进行训练,因为加载的backbone模型已经具有提取特征的能力了,在我们的训练过程中,会对他进行微调,使得其更适合我们自己的任务。

36、head
是获取网络输入内容的网络,利用之前提取的特征,head利用这些特征,做出预测。

37、neck
是放在backbone和head之间的,是为了更好的利用backbone提取的特征。

38、bottleneck 瓶颈:

​ 通常指的是网网络输入的数据维度和输出的维度不同,输出的维度比输入的小了许多,就像脖子一样,变细了。经常设置的参数 bottle_num=256,指的是网络输出的数据的维度是256 ,可是输入进来的可能是1024维度的

39、embedding
深度学习方法都是利用使用线性和非线性转换对复杂的数据进行自动特征抽取,并将特征表示为“向量”(vector),这一过程一般也称为“嵌入”(embedding)

40、目标函数,代价函数,损失函数

41、L1、L2、F范数

待更新:深度学习杂项,np.transpose; reshape, view; autoencoder; gan; pca; linux常用命令总结;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值