批量归一化(BATCH NORM)

目录

什么是批量归一化

为什么要用批量归一化

怎么归一化

批量归一化的内涵


什么是批量归一化

  批量归一化(Batch Normalization)是深度学习中常用的一种技术,旨在加速神经网络的训练并提高收敛速度。它通过对每个特征的数值进行归一化处理,使得数据分布更加稳定,有利于网络的训练。可以避免梯度消失或梯度爆炸问题,并且有助于加速模型的训练过程。

为什么要用批量归一化

  1. 缓解梯度消失和梯度爆炸:在深度神经网络中,梯度消失和梯度爆炸是常见的问题,批量归一化可以帮助控制梯度的范围,从而缓解这些问题。

  2. 加速训练收敛:批量归一化有助于加速神经网络的训练收敛速度,减少训练时间,提高训练效率。

  3. 增加模型的稳定性:批量归一化使得神经网络对参数初始化不那么敏感,增加了训练的稳定性,有利于训练更深、更复杂的网络结构。

  4. 允许更高的学习率:使用批量归一化可以允许更高的学习率,从而更快地找到损失函数的最优解。

  5.  减少对初始权重的敏感性。

怎么归一化

什么样的数据适合归一化

归一化适合用于具有不同量纲或取值范围的特征的数据。一般来说,以下类型的数据适合进行归一化处理:

  1. 批量归一化适用于深度神经网络中的各层输入数据。具体来说,以下情况的数据适合进行批量归一化处理:

  2. 深度神经网络:批量归一化主要应用于深度神经网络中,特别是对于包含多个隐藏层的复杂网络结构,如卷积神经网络(CNN)和循环神经网络(RNN)等。

  3. 输入数据分布不稳定:当神经网络各层的输入数据分布发生变化时,例如训练过程中每个批次的数据分布不一致,这种情况下适合使用批量归一化来稳定网络的训练。

  4. 提高模型的泛化能力:批量归一化有助于提高模型对未见过数据的泛化能力,减少过拟合的风险。

  5. 解决梯度消失和梯度爆炸问题:批量归一化可以缓解梯度消失和梯度爆炸问题,有助于更稳定地训练深度神经网络。

代码举例

下面是一个用pytorch写的一个10分类的卷积神经网络架构:

import torch.nn as nn
import torch.nn.functional as F
import torch

class Net(nn.Module):
    def __init__(self) :
        super(Net, self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.GELU()
        )

        self.max_pooling1 = nn.MaxPool2d(kernel_size=2, stride=2)

        self.conv2_1 = nn.Sequential(
            nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(128),
            nn.GELU()
        )

        self.conv2_2 = nn.Sequential(
            nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(128),
            nn.GELU()
        )

        self.max_pooling2 = nn.MaxPool2d(kernel_size=2, stride=2)

        self.conv3_1 = nn.Sequential(
            nn.Conv2d(128, 256, kernel_size=3, stride=1),
            nn.BatchNorm2d(256),
            nn.GELU()
        )

        self.conv3_2 = nn.Sequential(
            nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(256),
            nn.GELU()
        )
        self.max_pooling3 = nn.MaxPool2d(kernel_size=2, stride=2,padding=1)

        self.conv4_1 = nn.Sequential(
            nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(512),
            nn.GELU()
        )

        self.conv4_2 = nn.Sequential(
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(512),
            nn.GELU()
        )
        self.max_pooling4 = nn.MaxPool2d(kernel_size=2, stride=2)
        
        self.fc = nn.Linear(512 * 2 * 2 ,10)

    def forward(self, x):
        batchsize = x.size(0)
        out = self.conv1(x)
        out = self.max_pooling1(out)
        out = self.conv2_1(out)
        out = self.conv2_2(out)
        out = self.max_pooling2(out)
        out = self.conv3_1(out)
        out = self.conv3_2(out)
        out = self.max_pooling3(out)
        out = self.conv4_1(out)
        out = self.conv4_2(out)
        out = self.max_pooling4(out)
        
        out = out.view(batchsize, -1)
        out = self.fc(out)
        out = F.log_softmax(out, dim=1)
        return out

总结

批量归一化具有:缓解梯度消失和梯度爆炸、加速训练收敛、增加模型的稳定性、允许更高的学习率、减少对初始权重的敏感性。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值