一: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层后产生的效果(
使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题
。
)