当前位置: 首页 > news >正文

Batch Norm vs Layer Norm:为什么 Transformer 更适合用 Layer Norm?

Batch Norm vs Layer Norm:为什么 Transformer 更适合用 Layer Norm?


1. Batch Norm 和 Layer Norm 的定义与作用

1.1 Batch Normalization (BN)
Batch Norm 是一种归一化方法,主要用于加速深层神经网络的训练。它在每个小批量(batch)中对输入的特征值进行归一化,保证特征的均值接近 0,方差接近 1,从而减小梯度消失和梯度爆炸的问题。

公式:对于第 ( i i i) 个特征:一般是一列
x ^ i = x i − μ B σ B 2 + ϵ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} x^i=σB2+ϵ xiμB
其中:

  • ( x i x_i xi) 是第 ( i i i) 个特征值
  • ( μ B , σ B 2 \mu_B, \sigma_B^2 μB,σB2) 分别为该特征在当前 batch 的均值和方差
  • ( ϵ \epsilon ϵ) 是平滑项,防止分母为 0

经过归一化后,BN 会通过两个可学习参数恢复原来的表达能力:
y i = γ x ^ i + β y_i = \gamma \hat{x}_i + \beta yi=γx^i+β


1.2 Layer Normalization (LN)
Layer Norm 是一种对 单一输入样本的特征维度 进行归一化的方法,不依赖 batch 维度。与 Batch Norm 不同,LN 计算的是当前样本在特征维度上的均值和方差。

公式:对于样本 ( x x x) 中第 ( i i i) 个特征:一般是一行
x ^ i = x i − μ L σ L 2 + ϵ \hat{x}_i = \frac{x_i - \mu_L}{\sqrt{\sigma_L^2 + \epsilon}} x^i=σL2+ϵ xiμL
其中:

  • ( μ L , σ L 2 \mu_L, \sigma_L^2 μL,σL2) 是当前样本所有特征的均值和方差

同样,LN 会使用可学习参数 ( γ , β \gamma, \beta γ,β) 恢复特征表达能力:
y i = γ x ^ i + β y_i = \gamma \hat{x}_i + \beta yi=γx^i+β


2. Batch Norm 和 Layer Norm 的主要区别

对比维度Batch Norm (BN)Layer Norm (LN)
归一化范围Batch 中的每个特征单个样本的所有特征
依赖 Batch 大小依赖小批量数据的均值和方差,Batch 越小效果越差不依赖 Batch 大小,适合单样本或小 Batch
适用场景CNN 等图像任务,Batch 通常较大NLP 和 Transformer 等场景,输入序列和特征维度较多
稳定性小 Batch 或在线学习时效果较差,可能导致波动在小 Batch 和序列任务中表现稳定

3. 为什么 Transformer 中使用 Layer Norm?

Transformer 采用 Layer Norm 的原因可以从以下几个方面解释:

3.1 序列建模任务的特点
  • Transformer 主要用于序列任务(如 NLP),输入通常为高维特征序列,长度可变。
  • Layer Norm 在特征维度上归一化,适应任意长度的序列,而 Batch Norm 依赖批量大小,对序列任务不够灵活。
3.2 小批量训练的限制
  • 在 NLP 任务中,由于长文本的存在,Batch Size 通常较小。Batch Norm 在小 Batch 下效果较差,易受样本均值和方差的噪声影响。
  • Layer Norm 不依赖 Batch 维度,因此在小 Batch 训练中更稳定。
3.3 平稳性和梯度流动
  • Transformer 使用自注意力机制,每层的输入依赖于上一层的输出。Layer Norm 在特征维度归一化,使梯度更新更加稳定。
  • Batch Norm 会因为动态 Batch 均值和方差的变化导致梯度波动。
3.4 并行计算效率
  • Layer Norm 的计算只涉及当前样本,适合 Transformer 的并行计算框架。
  • Batch Norm 需要在小批量数据之间计算统计量,限制了并行效率。

4. 示例:数值模拟 Batch Norm 和 Layer Norm 的效果

我们通过代码模拟两种归一化方法的行为,观察它们在不同输入场景下的效果。

import torch
import torch.nn as nn# 定义数据
torch.manual_seed(42)
input_data = torch.randn(4, 5)  # 4 个样本,每个样本 5 个特征
print("Input Data:\n", input_data)
#让input data = 
# tensor([[ 1.9269,  1.4873,  0.9007, -2.1055, -0.7581],
#        [ 1.0783,  0.8008,  1.6806,  0.3559, -0.6866],
#        [-0.4934,  0.2415, -0.2316,  0.0418, -0.2516],
#        [ 0.8599, -0.3097, -0.3957,  0.8034, -0.6216]])# Batch Norm
batch_norm = nn.BatchNorm1d(5)  # 对每个特征归一化
output_bn = batch_norm(input_data)
print("\nBatch Norm Output:\n", output_bn)# Layer Norm
layer_norm = nn.LayerNorm(5)  # 对每个样本的特征维度归一化
output_ln = layer_norm(input_data)
print("\nLayer Norm Output:\n", output_ln)

Input:

Input Data:tensor([[ 1.9269,  1.4873,  0.9007, -2.1055, -0.7581],[ 1.0783,  0.8008,  1.6806,  0.3559, -0.6866],[-0.4934,  0.2415, -0.2316,  0.0418, -0.2516],[ 0.8599, -0.3097, -0.3957,  0.8034, -0.6216]])
输出对比
  • Batch Norm 的归一化结果依赖于每列特征的 Batch 均值和方差。
  • Layer Norm 的归一化结果仅依赖于每个样本的特征维度。

计算过程与解释

以下是给定代码中 Batch Norm 和 Layer Norm 的手动计算过程。我们分别以 Batch Norm 第 1 列Layer Norm 第 1 行 为例,详细说明其工作原理。


1. Batch Norm 的计算过程

Batch Norm 操作

  • Batch Norm 是对每个特征(列)在整个 batch 中计算均值和方差,然后对每个特征进行归一化处理,公式如下:
    BN ( x i , j ) = x i , j − μ j σ j 2 + ϵ ⋅ γ + β \text{BN}(x_{i,j}) = \frac{x_{i,j} - \mu_j}{\sqrt{\sigma_j^2 + \epsilon}} \cdot \gamma + \beta BN(xi,j)=σj2+ϵ xi,jμjγ+β
    其中:
    • ( x i , j x_{i,j} xi,j ) 是第 ( i i i) 个样本第 ( j j j) 个特征值。
    • ( μ j \mu_j μj ) 是第 ( j j j) 列的均值,( σ j 2 \sigma_j^2 σj2) 是第 ( j j j) 列的方差。
    • ( γ \gamma γ) 和 ( β \beta β) 是可学习参数(初始化为 1 和 0)。

以第 1 列为例(特征索引为 0)
输入数据第 1 列为:
Input 第 1 列 = [ 1.9269 , 1.0783 , − 0.4934 , 0.8599 ] \text{Input}_{\text{第 1 列}} = [1.9269, 1.0783, -0.4934, 0.8599] Input 1 =[1.9269,1.0783,0.4934,0.8599]

  1. 计算均值
    μ 0 = 1.9269 + 1.0783 − 0.4934 + 0.8599 4 = 0.84293 \mu_0 = \frac{1.9269 + 1.0783 - 0.4934 + 0.8599}{4} = 0.84293 μ0=41.9269+1.07830.4934+0.8599=0.84293

  2. 计算方差
    σ 0 2 = ( 1.9269 − μ 0 ) 2 + ( 1.0783 − μ 0 ) 2 + ( − 0.4934 − μ 0 ) 2 + ( 0.8599 − μ 0 ) 2 4 = 0.71583 \sigma_0^2 = \frac{(1.9269 - \mu_0)^2 + (1.0783 - \mu_0)^2 + (-0.4934 - \mu_0)^2 + (0.8599 - \mu_0)^2}{4} = 0.71583 σ02=4(1.9269μ0)2+(1.0783μ0)2+(0.4934μ0)2+(0.8599μ0)2=0.71583

  3. 归一化操作(假设 ( γ = 1 , β = 0 \gamma = 1, \beta = 0 γ=1,β=0)):
    每个元素按以下公式计算:
    BN ( x i , 0 ) = x i , 0 − μ 0 σ 0 2 + ϵ \text{BN}(x_{i,0}) = \frac{x_{i,0} - \mu_0}{\sqrt{\sigma_0^2 + \epsilon}} BN(xi,0)=σ02+ϵ xi,0μ0
    取 ( ϵ = 1 0 − 5 \epsilon = 10^{-5} ϵ=105),结果如下:
    BN ( 1.9269 ) = 1.9269 − 0.84293 0.71583 + 1 0 − 5 ≈ 1.2794 \text{BN}(1.9269) = \frac{1.9269 - 0.84293}{\sqrt{0.71583 + 10^{-5}}} \approx 1.2794 BN(1.9269)=0.71583+105 1.92690.842931.2794
    BN ( 1.0783 ) = 1.0783 − 0.84293 0.71583 + 1 0 − 5 ≈ 0.2774 \text{BN}(1.0783) = \frac{1.0783 - 0.84293}{\sqrt{0.71583 + 10^{-5}}} \approx 0.2774 BN(1.0783)=0.71583+105 1.07830.842930.2774
    BN ( − 0.4934 ) = − 0.4934 − 0.84293 0.71583 + 1 0 − 5 ≈ − 1.5784 \text{BN}(-0.4934) = \frac{-0.4934 - 0.84293}{\sqrt{0.71583 + 10^{-5}}} \approx -1.5784 BN(0.4934)=0.71583+105 0.49340.842931.5784
    BN ( 0.8599 ) = 0.8599 − 0.84293 0.71583 + 1 0 − 5 ≈ 0.0216 \text{BN}(0.8599) = \frac{0.8599 - 0.84293}{\sqrt{0.71583 + 10^{-5}}} \approx 0.0216 BN(0.8599)=0.71583+105 0.85990.842930.0216

第 1 列的输出为
BN 第 1 列输出 = [ 1.2794 , 0.2774 , − 1.5784 , 0.0216 ] \text{BN 第 1 列输出} = [1.2794, 0.2774, -1.5784, 0.0216] BN  1 列输出=[1.2794,0.2774,1.5784,0.0216]


2. Layer Norm 的计算过程

Layer Norm 操作

  • Layer Norm 是对每个样本的所有特征(行)计算均值和方差,然后对整行归一化处理,公式如下:
    LN ( x i , j ) = x i , j − μ i σ i 2 + ϵ ⋅ γ + β \text{LN}(x_{i,j}) = \frac{x_{i,j} - \mu_i}{\sqrt{\sigma_i^2 + \epsilon}} \cdot \gamma + \beta LN(xi,j)=σi2+ϵ xi,jμiγ+β
    其中:
    • ( x i , j x_{i,j} xi,j ) 是第 ( i i i) 个样本第 ( j j j) 个特征值。
    • ( μ i \mu_i μi ) 是第 ( i i i) 行的均值,( σ i 2 \sigma_i^2 σi2) 是第 ( i i i) 行的方差。
    • ( γ \gamma γ) 和 ( β \beta β) 是可学习参数(初始化为 1 和 0)。

以第 1 行为例(样本索引为 0)
输入数据第 1 行为:
Input 第 1 行 = [ 1.9269 , 1.4873 , 0.9007 , − 2.1055 , − 0.7581 ] \text{Input}_{\text{第 1 行}} = [1.9269, 1.4873, 0.9007, -2.1055, -0.7581] Input 1 =[1.9269,1.4873,0.9007,2.1055,0.7581]

  1. 计算均值
    μ 0 = 1.9269 + 1.4873 + 0.9007 − 2.1055 − 0.7581 5 = 0.29026 \mu_0 = \frac{1.9269 + 1.4873 + 0.9007 - 2.1055 - 0.7581}{5} = 0.29026 μ0=51.9269+1.4873+0.90072.10550.7581=0.29026

  2. 计算方差
    σ 0 2 = ( 1.9269 − μ 0 ) 2 + ( 1.4873 − μ 0 ) 2 + ( 0.9007 − μ 0 ) 2 + ( − 2.1055 − μ 0 ) 2 + ( − 0.7581 − μ 0 ) 2 5 = 2.01125 \sigma_0^2 = \frac{(1.9269 - \mu_0)^2 + (1.4873 - \mu_0)^2 + (0.9007 - \mu_0)^2 + (-2.1055 - \mu_0)^2 + (-0.7581 - \mu_0)^2}{5} = 2.01125 σ02=5(1.9269μ0)2+(1.4873μ0)2+(0.9007μ0)2+(2.1055μ0)2+(0.7581μ0)2=2.01125

  3. 归一化操作(假设 ( γ = 1 , β = 0 \gamma = 1, \beta = 0 γ=1,β=0)):
    每个元素按以下公式计算:
    LN ( x 0 , j ) = x 0 , j − μ 0 σ 0 2 + ϵ \text{LN}(x_{0,j}) = \frac{x_{0,j} - \mu_0}{\sqrt{\sigma_0^2 + \epsilon}} LN(x0,j)=σ02+ϵ x0,jμ0
    取 ( ϵ = 1 0 − 5 \epsilon = 10^{-5} ϵ=105),结果如下:
    LN ( 1.9269 ) = 1.9269 − 0.29026 2.01125 + 1 0 − 5 ≈ 1.1526 \text{LN}(1.9269) = \frac{1.9269 - 0.29026}{\sqrt{2.01125 + 10^{-5}}} \approx 1.1526 LN(1.9269)=2.01125+105 1.92690.290261.1526
    LN ( 1.4873 ) = 1.4873 − 0.29026 2.01125 + 1 0 − 5 ≈ 0.8415 \text{LN}(1.4873) = \frac{1.4873 - 0.29026}{\sqrt{2.01125 + 10^{-5}}} \approx 0.8415 LN(1.4873)=2.01125+105 1.48730.290260.8415
    LN ( 0.9007 ) = 0.9007 − 0.29026 2.01125 + 1 0 − 5 ≈ 0.4318 \text{LN}(0.9007) = \frac{0.9007 - 0.29026}{\sqrt{2.01125 + 10^{-5}}} \approx 0.4318 LN(0.9007)=2.01125+105 0.90070.290260.4318
    LN ( − 2.1055 ) = − 2.1055 − 0.29026 2.01125 + 1 0 − 5 ≈ − 1.6822 \text{LN}(-2.1055) = \frac{-2.1055 - 0.29026}{\sqrt{2.01125 + 10^{-5}}} \approx -1.6822 LN(2.1055)=2.01125+105 2.10550.290261.6822
    LN ( − 0.7581 ) = − 0.7581 − 0.29026 2.01125 + 1 0 − 5 ≈ − 0.7437 \text{LN}(-0.7581) = \frac{-0.7581 - 0.29026}{\sqrt{2.01125 + 10^{-5}}} \approx -0.7437 LN(0.7581)=2.01125+105 0.75810.290260.7437

第 1 行的输出为
LN 第 1 行输出 = [ 1.1526 , 0.8415 , 0.4318 , − 1.6822 , − 0.7437 ] \text{LN 第 1 行输出} = [1.1526, 0.8415, 0.4318, -1.6822, -0.7437] LN  1 行输出=[1.1526,0.8415,0.4318,1.6822,0.7437]


更详细的例子可以参考笔者的另一篇博客:以[Today is great] [ How are you]两句话为例:学习Batch Norm和Layer Norm

总结
  • Batch Norm 是对每列(特征维度)进行归一化操作,关注每个特征的分布。适合于计算机视觉任务中输入数据的特征相似性较强的情况。
  • Layer Norm 是对每行(样本维度)进行归一化操作,关注样本自身的特征平衡。适合于 NLP 和序列建模中每个输入样本维度分布差异较大的场景。

5. Transformer 中 Layer Norm 的代码实现

在 Transformer 中,Layer Norm 通常应用于每个子层(子层归一化,SubLayer Norm),确保模型在深层架构中保持数值稳定。

import torch
import torch.nn as nnclass TransformerLayer(nn.Module):def __init__(self, d_model):super(TransformerLayer, self).__init__()self.self_attention = nn.MultiheadAttention(d_model, num_heads=8)self.feed_forward = nn.Sequential(nn.Linear(d_model, d_model * 4),nn.ReLU(),nn.Linear(d_model * 4, d_model))self.norm1 = nn.LayerNorm(d_model)self.norm2 = nn.LayerNorm(d_model)self.dropout = nn.Dropout(0.1)def forward(self, x):# Self-Attention + Residual Connection + Layer Normattn_output, _ = self.self_attention(x, x, x)x = self.norm1(x + self.dropout(attn_output))# Feed-Forward + Residual Connection + Layer Normff_output = self.feed_forward(x)x = self.norm2(x + self.dropout(ff_output))return x# 测试 Transformer Layer
x = torch.randn(10, 16, 512)  # 序列长度 10,Batch Size 16,特征维度 512
layer = TransformerLayer(d_model=512)
output = layer(x)
print("Transformer Output Shape:", output.shape)

6. Layer Norm 在 NLP 任务中的应用

在 NLP 中,Layer Norm 被广泛应用于 Transformer 模型,如 BERT、GPT 等。
典型的应用:

  • BERT:在每个 Encoder 子层中使用 Layer Norm。
  • GPT:在 Decoder 中结合残差连接使用 Layer Norm。

以下是 Layer Norm 在 NLP 任务中提升稳定性的原因:

  1. 输入多样性:句子长度和特征分布差异大,Layer Norm 可适应这些变化。
  2. 小批量训练:NLP 任务常用小 Batch,Layer Norm 保持稳定。
  3. 多头注意力机制:Layer Norm 确保特征维度的均衡分布,提升注意力权重的稳定性。

7. 总结

维度Batch NormLayer Norm
归一化范围Batch 内每列特征每个样本的所有特征
适用场景图像任务(CNN 等)NLP 和序列建模(Transformer 等)
对 Batch 大小的依赖依赖 Batch 大小,Batch 越大越稳定无需依赖 Batch 大小
数值稳定性小 Batch 下梯度可能波动较大无论 Batch 大小如何均稳定

Layer Norm 的灵活性和稳定性,使其成为 Transformer 和 NLP 任务的首选归一化方法,在深层序列模型中尤为重要。

后记

2024年12月14日17点01分于上海,在GPT4o大模型辅助下完成。

相关文章:

Batch Norm vs Layer Norm:为什么 Transformer 更适合用 Layer Norm?

Batch Norm vs Layer Norm:为什么 Transformer 更适合用 Layer Norm? 1. Batch Norm 和 Layer Norm 的定义与作用 1.1 Batch Normalization (BN) Batch Norm 是一种归一化方法,主要用于加速深层神经网络的训练。它在每个小批量(b…...

jQuery Mobile页面事件

jQuery Mobile页面事件 jQuery Mobile是一个基于jQuery的移动设备友好的Web应用框架,它提供了一套丰富的页面事件,这些事件在移动应用的交互设计中扮演着重要的角色。本文将详细介绍jQuery Mobile中的页面事件,包括它们的触发时机、用途以及如何使用它们来增强移动应用的交…...

接口测试Day01-HTTP请求

概念 接口:系统之间(外部系统与内部系统,内部系统与内部系统)数据交通的通道。 接口测试:校验 接口回发的 响应数据 与 预期结果 是否一致。 接口测试,可以绕过前端界面。直接对 服务器进行测试&#xff01…...

使用枚举实现单例模式,不会反序列化破坏攻击,不会被反射破坏攻击。(附带枚举单例的简单实现)

原因分析 1.反序列化方法 ① jdk8中的Enum源码中对反序列化方法进行重写,抛出异常。 java.lang.Enum#readObject方法截图如下 ②java.io.ObjectInputStream#readObject 方法中的 readEnum 方法处理了枚举类型的反序列化,从而确保了枚举的单例特性。 …...

又细又长的马尾:tail

英语里边有一个单词 tail,意为“尾巴”,这应当是众所周知的事情了。 不过,tail 这条尾巴,并不简单,因为它还是一个词根,也就是说 tail 其实是自由词素。 事实上,tail 最初来自 马尾 这样一个概…...

记录:VB6 直接获取 PictureBox 的图像数据到数组 GetDIBits

记得十几年前写几个游戏辅助工具的时候用过这个功能,这几天想直接把图片控件的数据转换为 PNG 文件不想用存出 BMP 文件交换,直接取得图像数据操作即可,但是忘记了当初是怎么做的了,找到个 2007 年的例子好像不太对,运…...

uboot移植网络驱动过程,无法ping通mx6ull和ubuntu问题解决方案

开发板:mx6ull-ALPHA_V2.4 ubuntu版本:20.04 1.现在虚拟机设置中添加网路适配器用于开启桥接模式 2.在编辑中打开“虚拟网络编辑器” 我的电脑本身只有VMnet1和VMnet8,需要底下“添加网络”,增加这个VMnet0 ,并且进行…...

Ubuntu 安装软件被锁:Could not get lock问题解决

今天刚使用虚拟机安装完Ubuntu系统,想要安装所需要的软件是出现了以下错误信息: 错误信息: E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) E: Unable to lock the administration directory (/…...

S2CRNet 图像测评笔记 图像融合

空间分离曲线渲染网络用于高效高分辨率图像协调 开源地址: https://github.com/stefanLeong/S2CRNet 效果图: 左边是输入,最右边是效果:效果不是很理想,色差问题还在 本地代码: S2CRNet-demos-main...

Lambda表达式

C Lambda表达式 文章目录 C Lambda表达式基本用法捕获列表返回值mutable Lambda 表达式是一种匿名函数,可以在代码中直接定义并使用。它主要用于简化那些只需要简单操作的函数定义。在 C 中,lambda 表达式的语法结构通常包括以下几个部分: 捕…...

高通 Android12 添加APN信息

1、产品有国外客户,需要添加国外的定制APN信息。 2、路径: SC200E_AP/QCM2290_Android12.0_R02_r004/QSSI.12/vendor/qcom/proprietary/commonsys/telephony-apps/etc/apns-conf.xml在上述路径中将APN信息添加即可。 3、路径 SC200E_AP\QCM2290_Andr…...

探秘 IIC 与 SPI:软件模拟与硬件接口的抉择之谜

一、IIC 软件模拟:受限中的灵活应变 在嵌入式系统的通信世界里,IIC 常采用软件模拟的方式开展工作,这背后有着诸多考量。首先,硬件资源的限制是一个重要因素。不少微控制器并没有内置功能完备的 IIC 硬件模块,甚至压根…...

【ts语法学习】主要数据类型与变量声明时的类型注解

一、ts中的主要数据类型 1.布尔类型 (boolean) 2.数值类型 (number) 3.字符串类型 (string) 4.数组类型 (Array) 5.对象类型 (object) 6.null 和 undefined 7.元组类型 (Tuple) 8.枚举类型 (enum) 9.任意类型 (any) 10.never 11.unknown 12.void TypeScript(简称 …...

论文概览 |《Sustainable Cities and Society》2024.12 Vol.116

本次给大家整理的是《Sustainable Cities and Society》杂志2024年12月第116期的论文的题目和摘要,一共包括52篇SCI论文! 论文1 Enhancing road traffic flow in sustainable cities through transformer models: Advancements and challenges 通过变压…...

Vue3之响应式系统详解

Vue3中的响应式系统是其核心功能之一,它使得数据变化能够自动触发视图更新,从而简化了开发过程,提高了开发效率。本文将详细阐述Vue3中的响应式系统,包括其核心概念、工作原理、实现方式、应用场景以及优势。同时,本文…...

只出现一次的数字(字节面试题 最优解)

题目来源 136. 只出现一次的数字 - 力扣(LeetCode) 题目描述 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问…...

VMware Workstation的有线连接消失了

进入/var/lib目录下 cd /var/lib 查看是否存在NetworkManager 文件 ls 将其删除,然后虚拟机reboot一下。 sudo rm -r NetworkManager reboot 解决了,可以联网...

leetcode-146.LRU缓存(易理解)

为了实现一个满足 LRU(最近最少使用)缓存约束的数据结构,我们需要在 (O(1)) 时间复杂度内完成 get 和 put 操作。这通常可以通过结合使用哈希表和双向链表来实现: 哈希表:用于在 (O(1)) 时间复杂度内实现对缓存中元素…...

ArcGIS地理空间平台manager存在任意文件读取漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

ARCGIS国土超级工具集1.2更新说明

ARCGIS国土超级工具集V1.2版本,功能已增加至47 个。在V1.1的基础上修复了若干使用时发现的BUG,新增了"矢量分割工具"菜单,同时增加及更新了了若干功能,新工具使用说明如下: 一、勘测定界工具栏更新界址点成果…...

「iOS」通过CoreLocation Framework深入了解MVC架构

「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构 文章目录 「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构前言CoreLocation了解根据需求建模设计属性方法设计协议传值Block传值KVONotification通知方式 总结参考文章 前言 在这个学期的前…...

spring实例化对象的几种方式(使用XML配置文件)

前言 Spring框架作为一个轻量级的控制反转(IoC)容器,为开发者提供了多种对象实例化的策略。通过这些策略,开发者可以更加灵活地控制对象的生命周期和依赖关系。无论是通过XML配置、注解配置还是Java配置,Spring都能…...

pyhton 批量往PDF文件指定位置里面填写数据

pyhton 批量往PDF文件指定位置里面填写数据 import PyPDF2 from PyPDF2 import PdfReader, PdfWriterdef modify_pdf(input_pdf_path, output_pdf_path, page_number, x, y, text):reader PdfReader(input_pdf_path)writer PdfWriter()for page in reader.pages:writer.add_p…...

深度学习——激活函数、损失函数、优化器

深度学习——激活函数、损失函数、优化器 1、激活函数1.1、一些常见的激活函数1.1.1、sigmoid1.1.2、softmax1.1.3、tanh1.1.4、ReLU1.1.5、Leaky ReLU1.1.6、PReLU1.1.7、GeLU1.1.8、ELU 1.2、激活函数的特点1.2.1、非线性1.2.2、几乎处处可微1.2.3、计算简单1.2.4、非饱和性1…...

上拉模式下引脚电平与代码读取值的关系

在单片机系统中,引脚的输入模式设置对上拉模式下引脚电平及代码读取值有着关键影响。 当引脚被配置为上拉模式且无外部信号输入时,内部上拉电阻使引脚保持高电平。此时,代码读取该引脚的值为 1。例如在一个简单的电路中,仅设置了…...

UNIX简史

从1991年Linux出现至今,由于众多IT巨头以及技术社区的推动,Linux已经成为非常成熟、可用于各种关键领域的操作系统,适当了解其发展历史,对于理顺其技术流派、从而更好地学习和使用Linux具有重要意义。由于其基于UNIX系统二十多年的…...

python学opencv|读取图像(十三)BGR图像和HSV图像互相转换深入

【1】引言 前序学习过程中,我们偶然发现:如果原始图像是png格式,将其从BGR转向HSV,再从HSV转回BGR后,图像的效果要好于JPG格式。 文章链接为: python学opencv|读取图像(十二)BGR图…...

ElasticSearch 搜索、排序、分页功能

一、DSL 查询文档 ElasticSearch 的查询依然是基于 json 风格的 DSL 来实现的。 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl.html 1.1 DSL 查询分类 常见的查询类型包括: 查询所有:查询出所有数…...

MAC虚拟机上安装WDA环境

MAC虚拟机上安装WDA环境 一、MAC虚拟机切换root权限二、macOS上安装xcode若你的macOS系统可以在appstore下载安装若你安装的macOS系统版本太低,无法在appstore上安装xcode 三、macOS上安装WebDriverAgent四、使用xcode配置WDA安装到手机上高版本系统支持 一、MAC虚拟…...

KDD 2025预讲会:10位一作的论文分享与话题思辨|12月18日全天直播

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 圆桌思辨:一作们的KDD 2025投稿经验分享与热点探讨 1. KDD 2025 与往年相比有哪些新变化?两次投稿周期的新规则有哪些影响? 2. 第一篇KDD的工作是如何成功被接收的&#xff1…...

Input system手游的控制

手游离不开触屏控制 新的inputsystem 实现过程 安装input system在projectsetting中的player的othersettings中active input handing设置both打开window的analysis的input debugger。在options中设置为simulate touch input from mouse or pen。 增强触摸控制的相关知识 启…...

在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c

在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c 1. Installing the extension (在 Visual Studio Code 中安装插件)1.1. Extensions for Visual Studio Code1.2. C/C1.2.1. Pre-requisites 1.3. Makefile Tools 2. Configuring your project (配置项目)2.1.…...

KMP 算法

这里写目录标题 KMP数组计算方式**问题描述****初始准备****逐步推导过程****Step 1: i 1,子串为 ab****Step 2: i 2,子串为 aba****Step 3: i 3,子串为 abab****Step 4: i 4,子串为 ababa****Step 5: i 5,子串为…...

计算机网络中的三大交换技术详解与实现

目录 计算机网络中的三大交换技术详解与实现1. 计算机网络中的交换技术概述1.1 交换技术的意义1.2 三大交换技术简介 2. 电路交换技术2.1 理论介绍2.2 Python实现及代码详解2.3 案例分析 3. 分组交换技术3.1 理论介绍3.2 Python实现及代码详解3.3 案例分析 4. 报文交换技术4.1 …...

echarts图表自定义配置(二)——代码封装

下图是初版,火山图的代码。可以看出,里面的变量,逻辑,函数存在冗余,基本上都是改了参数,同样的get和set,去刷新图表;对于往后继续开发十几二十个图表,会很麻烦。因此需要…...

Serdes技术与Xilinx GT概览

目录 一、前言 二、Serdes技术 2.1 芯片间信号传输 2.2 Serdes技术 三、 Xilinx GT 3.1 7系列器件GT 3.2 Ultrascale GT 3.3 Ultrascale GT 四、参考资料 一、前言 对于芯片间高速信号传输技术,不得不提serdes以及在Xilinx在此基础上的高速收发器GT系列&…...

WEB开发: Node.js路由之由浅入深(三)自动配置路由 - 全栈工程师入门

前面我们一起学习了Node.js路由的两个进阶, (1)WEB开发: Node.js路由之由浅入深(一) - 全栈工程师入门 (2)WEB开发: Node.js路由之由浅入深(二)…...

6-9 捕获 0 异常(1)

中断号的 处理是这样的。 1、 cpu 根据中断号 去中断向量表 去找 第几个 表。、 2、 而 中断向量表 的内容是 GDT 的选择子。 3、 由于使用是的 平坦模型,所以只需要 将具体的函数给到 中断向量表的 offset 字段就可以了。 接下来 就是 在 代码中定义 中断门的属…...

社区团购创新模式与新兴技术融合的深度探索:基于开源、AI 智能名片、2+1 链动模式与 S2B2C 商城小程序

摘要:本文聚焦于社区团购这一新兴零售业态,深入剖析其“线上预售,线下自提,以销定采,落地集配”的 16 字箴言所蕴含的商业逻辑。详细探讨在物流与信息流层面社区团购的独特优势,并在此基础上研究开源理念、…...

day45 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

198.打家劫舍 相邻的房子不可以打劫&#xff0c;所以递推式需要考虑&#xff1b; 初始化也需要考虑&#xff0c;可以从两个方向入手 方向1&#xff1a;从后往前看&#xff0c;dp[i] dp[i-1] class Solution { public:int rob(vector<int>& nums) {if (nums.size(…...

SQL server学习02-使用T-SQL创建数据库

目录 一&#xff0c; 使用T-SQL创建数据库 1&#xff0c;数据库的存储结构 2&#xff0c;创建数据库的语法结构 1&#xff09;使用T-SQL创建学生成绩管理数据库 二&#xff0c;使用T-SQL修改数据库 1&#xff0c;修改数据库的语法结构 1&#xff09;修改学生成绩管理数…...

绘图方式集合

1. 流程图 1.1 PlantUML 代码绘制流程图 1.1.1 简介 1.1.2 网站 你可以使用以下网站来将 PlantUML 代码转换成可视化的流程图&#xff1a; PlantUML 官方网站 网站地址&#xff1a;https://plantuml.com/plantuml此网站提供了一个在线工具&#xff0c;可以直接输入 PlantUM…...

sqoop导入hdfs,hive

sqoop将mysql中的表导入到hdfs中 sqoop import \ > --connect jdbc:mysql://192.168.52.150/test \ > --username root \ > --password 123456 \ > --table emp \ > --delete-target-dir \ > --target-dir /sqoop_works/emp_1将数据导入hive中&#xff0c;首…...

C语言动态内存管理【进阶--5--】

文章目录 [toc] 动态内存管理一、作用即意义二、动态内存函数的介绍Ⅰ、malloc()函数、free()函数Ⅱ、calloc()函数Ⅲ、realloc()函数 三、常见的动态内存错误Ⅰ、对NULL指针的解引用操作Ⅱ、对动态开辟空间的越界访问Ⅲ、对非动态开辟的内存使用free释放Ⅳ、使用free释放动态开…...

Hadoop其四,片与块,MapReduce原理,Shuffle过程,Combiner

目录 一、关于片和块 二、MapReduce的原理 MapTask执行阶段 ReduceTask的执行流程&#xff1a; 三、Shuffle 过程 map端&#xff1a; reduce端&#xff1a; 环形缓冲区&#xff1a; 四、Combiner 【可有可无】 五、需要记忆的内容 一、关于片和块 假如我现在500M这样…...

引领未来的变革:15种前沿RAG技术及其应用探索

在现代人工智能领域&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术逐渐成为推动各种应用的重要力量。这些技术通过结合信息检索与文本生成&#xff0c;能够更有效地处理和利用信息。本文将详细介绍15种前沿RAG技术及其具体应用实例&#xff0c;以帮助您更好地理解这…...

gradle在IDEA 中无法使用的启动守护线程的问题

最近打开一个比较早的项目&#xff0c;Gradle 配置没有问题&#xff0c;IDEA 打开Java项目却不能初始化守护线程&#xff0c;UI 上只能看到失败&#xff0c;看不到具体原因。 首先尝试了升级最新的gradle 版本8.11, 实际上这个版本在本地命令行都不能正常工作&#xff0c;没有…...

C++小白实习日记——Pollnet,Efvi,UDP,数据类型转换(上)

上周主要是熟悉了一下公司内部一些自定义结构体对应的数据类型&#xff0c;要求&#xff1a;读取文件&#xff0c;将文件中数据转化为定义的结构体中的数据类型&#xff0c;按照时间进行排序&#xff0c;用UDP发送数据&#xff1b;在另一台服务器上接收数据&#xff0c;按照定义…...

git安装教程(Git-2.38.1-64-bit)

目录 一、git下载 二、git安装 1.更改安装路径 2.安装组件 3.选择开始菜单文件夹 4.选择Git默认编辑器 5.决定初始化新项目&#xff08;仓库&#xff09;的主干名字 6.修改Git的环境变量 7.选择SSH执行文件 9.选择HTTPS后端传输 10.配置行尾符号转换 11.配置终端模…...

C# OpenCvSharp DNN 实现百度网盘AI大赛-表格检测第2名方案第三部分-表格方向识别

目录 说明 效果 模型 项目 ​编辑 代码 参考 下载 其他 说明 百度网盘AI大赛-表格检测的第2名方案。 该算法包含表格边界框检测、表格分割和表格方向识别三个部分&#xff0c;首先&#xff0c;ppyoloe-plus-x 对边界框进行预测&#xff0c;并对置信度较高的表格边界…...