常用组件详解(五):torch.nn.BatchNorm2d()


  在卷积神经网络的卷积层之后通常会添加torch.nn.BatchNorm2d()进行数据的归一化处理,将数据规范到均值为0,方差为一的分布上,使得数据在进行Relu时不会因为数据过大而导致网络性能的不稳定。

一、基本原理

  深度学习输入数据的格式为 ( B , C , H , W ) (B,C,H,W) (B,C,H,W),假设当前输入的图像数据格式为 ( 5 , 3 , h , w ) (5,3,h,w) (5,3,h,w),则五张RGB图像中R通道对应的索引为:
在这里插入图片描述
【Step1】torch.nn.BatchNorm2d()会计算R通道下像素的均值
在这里插入图片描述
【Step2】torch.nn.BatchNorm2d()会计算R通道下像素的方差
在这里插入图片描述
【Step3】torch.nn.BatchNorm2d()对该通道下的所有像素值归一化处理
在这里插入图片描述
【Step3】torch.nn.BatchNorm2d()还会按照给出的缩放和平移变量 γ γ γ β β β进行处理:
在这里插入图片描述

综上,计算公式为:
在这里插入图片描述
其中, ϵ ϵ ϵ是一个设置的常量,默认为 1 0 − 5 10^{-5} 105,其作用是防止除0。

二、函数说明

  函数声明为:

torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, device=None, dtype=None) 
  • num_features:输入图像数据的通道数。
  • eps:分母加上的常量,避免除0。
  • momentum:一个用于运行过程中均值和方差的一个估计参数,默认值为0.1。
  • affine:当设为true时,给定可以学习的系数矩阵 γ γ γ β β β
import torch

data = torch.ones(size=(2, 2, 3, 4))
data[0][0][0][0] = 25
print("data = ", data)

print("\n")

print("=========================使用封装的BatchNorm2d()计算================================")
BN = torch.nn.BatchNorm2d(num_features=2, eps=0, momentum=0)
BN_data = BN(data)
print("BN_data = ", BN_data)

print("\n")

print("=========================自行计算================================")
x = torch.cat((data[0][0], data[1][0]), dim=1)      # 1.将同一通道进行拼接(即把同一通道当作一个整体)
x_mean = torch.Tensor.mean(x)                       # 2.计算同一通道所有制的均值(即拼接后的均值)
x_var = torch.Tensor.var(x, False)                  # 3.计算同一通道所有制的方差(即拼接后的方差)

# 4.使用第一个数按照公式来求BatchNorm后的值
bn_first = ((data[0][0][0][0] - x_mean) / ( torch.pow(x_var, 0.5))) * BN.weight[0] + BN.bias[0]
print("bn_first = ", bn_first)
  • 原始数据:

在这里插入图片描述

  • 使用torch.nn.BatchNorm2d

在这里插入图片描述

  • 手动计算归一化结果

在这里插入图片描述

torch.nn.BatchNorm2d的weight和bias分别是用于归一化的权重和偏置项。在Batch Normalization中,weight用于缩放归一化的结果,而bias用于平移归一化的结果。权重和偏置项可以通过设置affine参数为True来启用,默认情况下为True。具体来说,weight用于调整归一化后的特征图的尺度,而bias用于调整特征图的偏移。通过调整权重和偏置项,我们可以对归一化结果进行进一步的灵活调整,以适应不同的网络结构和任务需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Pytorchtorch.nn.conv2dtorch.nn.functional.conv2d的区别](https://blog.csdn.net/XU_MAN_/article/details/122557443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [pytorch方法测试详解——归一化(BatchNorm2d)](https://download.csdn.net/download/weixin_38670208/13759704)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [torch nn.BatchNorm2d实现原理](https://blog.csdn.net/weixin_37989267/article/details/125083567)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值