一:transforms.Normalize
   
代码展示:
data_transforms = transforms.Compose([
        transforms.Resize((h, w), interpolation=3),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])讲解:transforms 来自 torchvision,torchvision.transforms 是常用的图像预处理方法
功能:逐channel(每一张图片有rgb三个通道,每一个通道就是一个channel)的对图像进行标准化(均值变为0,标准差变为1),可以加快模型的收敛
为什么会加快收敛呢?
1.数据标准化消除了特征之间的尺度差异:在机器学习中,不同的特征可能具有不同的取值范围和尺度。如果某些特征的值域较大,而另一些特征的值域较小,模型可能会更加关注值域较大的特征,从而忽略了其他特征。通过标准化数据,将不同特征的值缩放到相似的尺度,有助于模型更平衡地学习各个特征的权重,避免了不同尺度之间的偏差。
2.标准化可以加快梯度下降算法的收敛速度:梯度下降是常用的优化算法,用于训练神经网络模型。在训练过程中,梯度下降算法通过计算损失函数对模型参数的梯度,并根据梯度的方向来更新参数。如果输入数据没有经过标准化,不同特征的尺度差异会导致参数更新的步长不一致,从而导致梯度下降算法在参数空间中搜索的路径非常不均匀。通过标准化数据,可以使得不同特征的尺度相似,从而使梯度下降算法能够更快地朝着最优解的方向前进。
    
    output = (input – mean) / std
    
    mean:各通道的均值
    
    std:各通道的标准差
    
    inplace:是否原地操作
   
    二:batch normalization
   
    代码展示:这是一个网络前向计算的函数,其中
    
     x = self.model.bn1(x)
    
    就是使用到了batch normalization
   
    def forward(self, x):
        x = self.model.conv1(x)
        x = self.model.bn1(x)
        x = self.model.relu(x)
        x = self.model.maxpool(x)
        x = self.model.layer1(x)
        x = self.model.layer2(x)
        x = self.model.layer3(x)
        x = self.model.layer4(x)
        x = self.model.avgpool(x)
        x = torch.squeeze(x)
        x = self.classifier(x) #use our classifier.
        return x
    讲解:batch normalization 是神经网络中的一个结构,简称bn层,它作用是
    
     通过规范化的手段,将越来越偏的分布拉回到标准化的分布,使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题
    
    。
   
    计算方式分为四部:
    
    1.求每一个训练批次数据的均值
    
    2.求每一个训练批次数据的方差
    
    3.使用求得的均值和方差对该批次的训练数据做归一化,获得(0,1)正态分布。其中ε是为了避免除数为0时所使用的微小正数。
    
    4.尺度变换和偏移:将xi乘以γ调整数值大小,再加上β增加偏移后得到yi,这里的γ是尺度因子,β是平移因子。这一步是BN的精髓,由于归一化后的xi基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数:γ,β。 γ和β是在训练时网络自己学习得到的。
   
    公式:
     
   
    如图:数据经过bn层后产生的效果(
    
     使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题
    
    。
   
)
     
   
 
