【深度学习中的批量归一化BN和层归一化LN】BN层(Batch Normalization)和LN层(Layer Normalization)的区别

news2024/11/28 12:46:33

文章目录

  • 1、概述
  • 2、BN层
  • 3、LN层
  • 4、Pytorch的实现
  • 5、BN层和LN层的对比

1、概述

  • 归一化(Normalization) 方法:指的是把不同维度的特征(例如序列特征或者图像的特征图等)转换为相同或相似的尺度范围内的方法,比如把数据特征映射到[0, 1]或[−1, 1]区间内,或者映射为服从均值为0、方差为1的标准正态分布。
  • 那为什么要进行归一化?

样本特征由于来源和度量单位的不同或者经过多个卷积层处理后导致不同来源或者不同卷积层的输入特征尺度存在较大差异,模型的优化方向可能会被尺度较大的特征所主导。而进行归一化可以使得尺度大致处于同一范围内,从而有利于模型的训练和优化。

  • BN层(Batch Normalization):是在不同样本之间进行归一化。
  • LN层(Layer Normalization):是在同一样本内部进行归一化。
  • 以下的图简单展示了二者的区别:
    在这里插入图片描述
    参考链接:https://blog.csdn.net/qq_44397802/article/details/128452207

2、BN层

  • 下图很清晰的解释了BN层:由于是Batch Normalization,那么简单来说,就是针对Batch中的不同样本之间求均值和标准差,再做归一化

1)如下图,针对神经元的输出进行BN,确定Batch size为N,但是不同类型样本的维度可能不一样(下图中维度为1,例如图像经过卷积以后维度为C × \times ×H × \times ×W)
2)不论维度为多少,各个样本之间的维度是相同的,因此针对不同样本之间的对应维度计算出均值和标准差,肯定与每个样本的维度相同(下图中,均值和标准差都为一维,对于图像,均值和标准差的维度为C × \times ×H × \times ×W)
3)针对每个神经元训练一组可学习的参数 γ \gamma γ β \beta β,用于对输出的每个响应值做缩放和平移。
4)注意如果样本为一维,可学习参数的组数与输出的响应值的数量相等,也与神经元的个数相等;如果样本是图像,输入为N × \times ×C1 × \times ×H × \times ×W,卷积核个数为C2,那么输出为N × \times ×C2 × \times ×H × \times ×W,因此可学习参数的组数与输出通道数相等,为C2,也与卷积核个数相等。
5)所以简单来说,可学习参数的组数就与通道数相等。

在这里插入图片描述

3、LN层

  • 一般来说,层归一化所做的就是,对于图像,即输入为N × \times ×C × \times ×H × \times ×W的特征图:在每个样本内部,计算所有像素点的均值和标准差,并针对每个像素点训练一组可学习参数 γ \gamma γ β \beta β,用于进行缩放和平移,以归一化到同一范围内。

  • 如下图所示,针对的是一个样本中的所有通道内的所有像素。也就是说和Batch无关。

  • 因此可学习参数的组数就等于C × \times ×H × \times ×W。
    在这里插入图片描述

  • 计算公式:
    在这里插入图片描述

4、Pytorch的实现

  • BN层的实现:
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, device=None, dtype=None)
''
num_features:输入尺寸为(N,C,H,W),则该值为C
''
  • LN层的实现:
torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True, device=None, dtype=None)
''
1)normalized_shape:归一化的尺寸,输入的尺寸必须符合:[∗×normalized_shape[0]×normalized_shape[1]×…×normalized_shape[1]]
如果为单个整数,则对最后一维进行归一化
2)elementwise_affine:是否具有可学习的参数,默认为True
''
  • 如下为BN和LN层的实现,以及参数量的计算
import torch
from torch import nn

# NLP Example
batch, sentence_length, embedding_dim = 20, 5, 10
embedding = torch.randn(batch, sentence_length, embedding_dim)
layer_norm = nn.LayerNorm(embedding_dim)
print(layer_norm)
param_num = sum([param.numel() for param in layer_norm.parameters()])
print(param_num)
output_embed = layer_norm(embedding)
print(output_embed.shape)
  • 输出为:
LayerNorm((10,), eps=1e-05, elementwise_affine=True)
20
torch.Size([20, 5, 10])
import torch
from torch import nn


# Image Example
N, C, H, W = 20, 5, 10, 10
input0 = torch.randn(N, C, H, W)
# Normalize over the last three dimensions (i.e. the channel and spatial dimensions)
layer_norm = nn.LayerNorm([C, H, W]) # 参数量为C*H*W*2
print(layer_norm)
param_num = sum([param.numel() for param in layer_norm.parameters()])
print(param_num)
output = layer_norm(input0)
print(output.shape)

input1 = torch.randn(N, C, H, W)
batch_norm = nn.BatchNorm2d(C) # 参数量为C*2
print(batch_norm)
param_num1 = sum([param.numel() for param in batch_norm.parameters()])
print(param_num1)
output1 = batch_norm(input1)
print(output1.shape)
  • 输出为:
LayerNorm((5, 10, 10), eps=1e-05, elementwise_affine=True)
1000
torch.Size([20, 5, 10, 10])
BatchNorm2d(5, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
10
torch.Size([20, 5, 10, 10])

5、BN层和LN层的对比

  • 简单对比如下:
    在这里插入图片描述

参考链接:https://blog.csdn.net/hymn1993/article/details/122719043

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/843763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IO学习-有名管道

1,要求实现AB进程对话 A进程先发送一句话给B进程,B进程接收后打印 B进程再回复一句话给A进程,A进程接收后打印 重复1.2步骤,当收到quit后,要结束AB进程 运行结果:

【面试八股文】每日一题:谈谈你对集合的理解

每日一题-Java核心-谈谈你对集合的理解【面试八股文】 谈谈你对集合的理解 Java集合是Java编程语言中用于存储数据的容器。它提供了一系列的类和接口,用于操作和管理数据集合。Java集合框架主要包括以下几个重要的接口和类: List:List是一个有…

掌握 JVM 调优命令

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ JVM 日常调优总结起来就是:首先通过 jps 命令查看当前进程,然后根据 pid 通过 jinfo 命令查看和修改 jvm 参数,通过 jstat 命令查看 cla…

火力全开!百度文心3.5三大维度、20项指标国内问鼎!

近日,清华大学新闻与传播学院沈阳团队发布《大语言模型综合性能评估报告》(下文简称“报告”),报告显示百度文心一言在三大维度20项指标中综合评分国内第一,超越ChatGPT,其中中文语义理解排名第一&#xff…

8.7一日总结

后台管理项目(使用vue3) 1.创建项目 npm init vuelatest 2.进入项目,下载依赖 3.下载需要的项目依赖 下载重置样式表 npm install reset-css 在main.js中阴入 import reset-css 4.清理目录 将项目中不需要的内容删除 5.运行项目 npm run dev 6.将仓库推送…

Kubectl 详解

目录 陈述式资源管理方法:项目的生命周期:创建-->发布-->更新-->回滚-->删除声明式管理方法:陈述式资源管理方法: kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将…

线程池优雅关闭

背景 线程池是日常我们写代码时经常打交道的知识点了,围绕线程池除了core核心线程数和最大max线程数的知识点外,我们一般会忽略然而却绕不开的问题时如何关闭线程池 如何关闭线程池 首先从优雅关闭线程池代码说起: public boolean graful…

在oracle SQL中创建返回表的函数

这是我的职责 create or replace FUNCTION split(i_str IN VARCHAR2,i_delim IN VARCHAR2 DEFAULT : ) RETURN TABLE AS BEGINRETURN SELECT trim(regexp_substr(i_str, [^||i_delim||], 1, LEVEL)) str FROM projetCONNECT BY instr(i_str, i_delim, 1, LEVEL - 1) …

Android安卓实战项目(10)---详细记录饮食与训练计划App【大Demo】可记录每日消耗和数据面板(源码在文末)可用于比赛项目或者作业参考中

Android安卓实战项目(10)—详细记录饮食与训练计划App【大Demo】可记录每日消耗和数据面板(源码在文末🐕🐕🐕)可用于比赛项目或者作业参考中 【bilibili演示】 https://www.bilibili.com/video…

【IDEA + Spark 3.4.1 + sbt 1.9.3 + Spark MLlib 构建鸢尾花决策树分类预测模型】

决策树进行鸢尾花分类的案例 背景说明: 通过IDEA Spark 3.4.1 sbt 1.9.3 Spark MLlib 构建鸢尾花决策树分类预测模型,这是一个分类模型案例,通过该案例,可以快速了解Spark MLlib分类预测模型的使用方法。 依赖 ThisBuild /…

算法通关村第四关——如何基于数组实现栈

1.栈的基础知识 1.1 栈的特征 栈(Stack):具有一定操作约束的线性表,只在一端(栈顶,Top)做插入(Push)、删除(Pop),不可操作的一端称为栈底(Botto…

C高级--day4(wc指令、case...in、while循环、for循环、select..in、break、continue、shell中的函数)

#!/bin/bash function fun() {uidid -u $namegidid -g $nameecho $uid $gid } read name retfun $name echo $ret

【docker】设置 docker 国内镜像报错问题,解决方案

一、报错: [rootlocalhost ~]# systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.二、原因&#xf…

UE5 半透明覆层材质

文章目录 前言介绍示例1示例2示例3 前言 本文采用虚幻5.2.1版本演示,介绍半透明覆层材质(覆层材质)。 介绍 半透明覆层材质是 UE5.1 版本 更新的功能,使用半透明覆层材质,可以轻松的给物体表面附着一层材质。 在UE5…

【Maven】常用命令、插件管理、私服nexus

【Maven】常用命令、插件管理、私服nexus 常用命令 插件管理 私服nexus Nexus3 配置私服 项目pom中的配置 发布时区分正式版、快照版 常用命令 Maven提供了一系列常用命令,用于构建、测试和管理项目。以下是一些常用的Maven命令示例: mvn clean:…

安装zabbix5.0监控

官网安装手册: https://www.zabbix.com/cn/download 一、 安装zabbix a. 安装yum源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpmyum clean allb. 安装Zabbix server,web前端,agent y…

面试热题(翻转k个链表)

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值&a…

《论文阅读13》Efficient Urban-scale Point Clouds Segmentationwith BEV Projection

一、论文 研究领域: 城市级3D语义分割论文:Efficient Urban-scale Point Clouds Segmentationwith BEV Projection论文链接 注: BEV: Birds Eye View BEV投影是指鸟瞰视角(Birds Eye View,简称BEV)的一种从上方观看对象或场景的…

【JavaEE】Spring Boot - 配置文件

【JavaEE】Spring Boot 开发要点总结(2) 文章目录 【JavaEE】Spring Boot 开发要点总结(2)1. 配置文件的两种格式2. .properties 文件2.1 基本语法2.2 注释2.3 配置项2.4 主动读取配置文件的键值2.5 数据库的连接时的需要的信息配…

面试热题(字符串相加)

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 输入:num1 "11"…