2023.4.8看程序(还没看完)
1. [Python 列表 append()函数使用详解](http://t.csdn.cn/C7qBp)
2. [【pytorch】torch.nn.GroupNorm的使用](http://t.csdn.cn/TzyPi)
3. [torch.nn.GroupNorm](http://t.csdn.cn/67cIV)
4. [深度学习Normalization层大总结](http://t.csdn.cn/PwmC7)
5. [关于nn.ReLU函数](http://t.csdn.cn/3Cc4H)
6. [PyTorch学习笔记(1)nn.Sequential、nn.Conv2d、nn.BatchNorm2d、nn.ReLU和nn.MaxPool2d](http://t.csdn.cn/tA2eF)
7. [nn.Sequential()](http://t.csdn.cn/Ss5hM)
8. [pytorch中的model.eval()和BN层](http://t.csdn.cn/XlTK6)
9. [pytorch bn 如何冻结 以及train 和val下区别](http://t.csdn.cn/0YXe0)
10. [Pytorch-模型参数:named\_parameters()、parameters()、state\_dict()区别](http://t.csdn.cn/zdowT)
11. [pytorch:关于module.train函数和module.eval函数区别分析](http://t.csdn.cn/EmxMr)
12. [内置函数 - getattr()函数](http://t.csdn.cn/HLys0)
13. [【Python系列】eval 函数](http://t.csdn.cn/cE2ML)
14. [pytorch:深入理解 reshape(), view(), transpose(), permute() 函数](http://t.csdn.cn/lI9fV)
15. [torch.stack()的官方解释,详解以及例子](http://t.csdn.cn/xiXC6)
16. [pytorch中的torch.max()和torch.min()](http://t.csdn.cn/oGOEk)
17. [Python2 long() 函数](http://t.csdn.cn/bTING)
18. [Pytorch中torch.unsqueeze()和torch.squeeze()函数解析](http://t.csdn.cn/huqkR)
19. [Pytorch中tensor维度和torch.max()函数中dim参数的理解](http://t.csdn.cn/FzfGu)
20. [torch.topk() 函数详解](http://t.csdn.cn/hkcbg)

4-深度学习Normalization大总结
Group Normalization(GN)是针对Batch Normalization(BN)在batch size较小时错误率较高而提出的改进算法。
Normalization的主要作用如下:
a. 缓解梯度消失,可以增大 learning rate, 使训练更快收敛。
b. 简化调参,网络更稳定。在调参时,学习率调得过大容易出现震荡于不收敛,而 BN 抑制了参数微小变化随网络加深而被放大的问题,因此对于参数变化的适应能力更强。
c. 更不容易过拟合, 因此可以替代 dropout,或者少用 dropout,可以减少 L2 正则化的权重,同时可以减少 argument 的操作,可以不用太操心 initialization 的操作。
Normalization的位置:
通常在神经网络中按照如下的位置进行排列:
Conv -> Norm层 -> 激活函数层
当然也有人尝试如下的放置方法
Conv -> 激活函数层 -> Norm 层
后来在Rethinking the Usage of Batch Normalization and Dropout in the Training ofDeep Neural Network中证明:我们不应该把Norm 层放在ReLU之前,因为ReLU的非负响应会使权值层更新的方式不太理想。
Normalization的几种方式:
1、batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
2、layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
3、instanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
4、GroupNorm将channel分组,然后再做归一化;
5、SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。下图将三种方法进行了形象的说明。从C方向看过去是指一个个通道,从N看过去是一张张图片。每6个竖着排列的小正方体组成的长方体代表一张图片的一个feature map。蓝色的方块是一起进行Normalization的部分。由此就可以很清楚的看出,Batch Normalization是指6张图片中的每一张图片的同一个通道一起进行Normalization操作。layerNorm是一张图片中的通道之间进行Normalization操作,而Instance Normalization是指单张图片的单个通道单独进行Noramlization操作。
6-PyTorch学习笔记(1)nn.Sequential、nn.Conv2d、nn.BatchNorm2d、nn.ReLU和nn.MaxPool2d
1.为什么引入非线性激励函数?
如果不适用激励函数,那么在这种情况下每一层的输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(perceptron)了。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了,不再是输入的线性组合,可以逼近任意函数,最早的想法是用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入
2.为什么引入Relu?
采用sigmoid等函数,算激活函数时候(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相当大,而采用Relu激活函数,整个过程的计算量节省很多。 对于深层网络,sigmoid函数反向传播时,很容易就出现梯度消失的情况(在sigmoid函数接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。 Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。 其实,relu函数的作用就是增加了神经网络各层之间的非线性关系,否则,如果没有激活函数,层与层之间是简单的线性关系,每层都相当于矩阵相乘,这样怎么能够完成我们需要神经网络完成的复杂任务, 
enumerate()函数
enumerate 是 Python 中的一个内置函数,它的作用是将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
使用方法如下:
在上面的代码中,`items` 是可遍历的数据对象,`i` 是下标,`item` 是对应的数据。
你也可以指定开始的下标,如下所示:
在这个例子中,下标从 1 开始。
总的来说,`enumerate` 函数的作用是将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标,使得我们能够在遍历数据的同时获取数据的下标。
8-pytorch中的model.eval()和BN层
如果网络模型model中含有BN层,则在预测时应当将模式切换为评估模式,即model.eval()。
评估模拟下BN层的均值和方差应该是整个训练集的均值和方差,即 moving mean/variance。
训练模式下BN层的均值和方差为mini-batch的均值和方差,因此应当特别注意。
11-pytorch:关于module.train函数和module.eval函数区别分析
model.train() :启用 BatchNormalization 和 Dropout
model.eval() :不启用 BatchNormalization 和 Dropout