深度学习中transforms.Normalize和batch normalization详解

  • Post author:
  • Post category:其他


一: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层后产生的效果(

使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题



版权声明:本文为Deviker原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。