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

Batch Normalization学习笔记

文章目录

  • 一、为何引入 Batch Normalization
  • 二、具体步骤
    • 1、训练阶段
    • 2、预测阶段
  • 三、关键代码实现
  • 四、补充
  • 五、参考文献

一、为何引入 Batch Normalization

  现在主流的卷积神经网络几乎都使用了批量归一化(Batch Normalization,BN)1,它是一种逐层归一化方法,可以对神经网络中任意的中间层进行归一化操作。我们可以从不同角度来理解为什么要引入 Batch Normalization:

① 训练时的误差表面(error surface) 可能会十分崎岖,使得做优化时容易陷入局部最优值或鞍点等。通常我们会使用各种算法如Adam等进行优化,那么能不能直接改误差表面的地貌,“把山铲平”,让它变得比较好训练呢?Batch Normalization 就是其中一个“把山铲平”的想法2。另外一个好处是,误差表面变得没那么崎岖后,我们在训练时便可以增大学习率,使得网络更快收敛。

② 对于典型的多层感知机或卷积神经网络,在训练时中间层中的变量可能具有更广的变化范围。也就是说,随着训练时间的推移,每一层的模型参数分布范围变化莫测(比如一个深层网络,反向传播更新参数时,顶层与最底层数据范围差异会比较大,因为最底层相当于通过链式法则乘了一堆偏导数,导致数据范围非常大或小):

在这里插入图片描述

变量分布中的不规则的偏移可能会阻碍网络的收敛,因此为了使各层拥有适当的数据范围,通过 Batch Normalization“强制性”地调整数据分布使其约束到更小的范围(标准正态分布),这样便可以使得训练更加稳定,且对于初始值的设置没那么敏感。调整之后示意图如下:

在这里插入图片描述

③ 深层的网络很复杂,容易过拟合。而 Batch Normalization可以作为一种隐形的正则化方法,减轻过拟合(因此有时候使用BN后,dropout显得没那么必要使用)。由于Batch Normalization是基于一个 mini batch的,因此在训练时,神经网络对一个样本的预测不仅和该样本自身相关,也和同一批次中的其他样本相关,这种选取批次的随机性,使得神经网络不会“过拟合”到某个特定样本,从而提高网络的泛化能力。

总而言之,Batch Normalization 的优点如下3

  • 不那么依赖初始值(对于初始值不用那么神经质)。
  • 可以使学习快速进行(可以增大学习率)。
  • 抑制过拟合(降低Dropout等的必要性)。


二、具体步骤

batch normalization本质是对不同样本的同一特征做标准化。

1、训练阶段

  在训练时,Batch Normalization会逐步对每个mini-batch进行归一化。具体步骤如下:

设一个mini-batch中有 m m m 个输入数据,记为集合 B = { x 1 , x 2 , ⋯ , x m } B=\{x_1,x_2,\cdots,x_m\} B={x1,x2,,xm},对该集合求均值 μ B \mu_B μB 和方差 σ B 2 \sigma_B^2 σB2
μ B ← 1 m ∑ i = 1 m x i \begin{aligned}\mu_B\leftarrow\frac{1}{m}\sum_{i=1}^mx_i\end{aligned} μBm1i=1mxi

σ B 2 ← 1 m ∑ i = 1 m ( x i − μ B ) 2 \begin{aligned}\sigma_B^2\leftarrow\frac{1}{m}\sum_{i=1}^m(x_i-\mu_B)^2\end{aligned} σB2m1i=1m(xiμB)2
接下来利用求得的均值和方差对输入数据进行归一化:
x ^ i ← x i − μ B σ B 2 + ε \hat{x}_i\leftarrow\frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\varepsilon}} x^iσB2+ε xiμB
其中 ε \varepsilon ε 是一个微小值(如 10 e − 7 10e^{-7} 10e7 等),以防止出现除以0的情况。

于是便可以将输入数据转换为均值为0,方差为1的数据 { x ^ 1 , x ^ 2 , ⋯ , x ^ m } \left\{\hat{x}_1,\hat{x}_2,\cdots,\hat{x}_m\right\} {x^1,x^2,,x^m} 了。

  为了使得归一化不对网络的表示能力造成负面影响,再通过一个附加的缩放和平移变换改变新数据的取值区间(虽然归一化加快了训练速度和稳定性,但它改变了数据的原始分布。对于某些任务来说,直接使用归一化的数据可能会限制模型的表达能力,因此引入可以学习的超参数 γ \gamma γ β \beta β ,使得模型可以灵活地调整归一化后的数据分布,恢复其自由度):
y i ← γ x ^ i + β y_i\leftarrow\gamma\hat{x}_i+\beta yiγx^i+β

最后把上述所有处理插入到激活函数的前面即可(整个过程相当于一个BatchNorm层),示意图如下:

在这里插入图片描述


示意图二(其中 W W W 是全连接层, L ^ \widehat{\mathcal{L}} L 是损失函数)4

在这里插入图片描述


2、预测阶段

  在训练过程中,我们无法得知整个数据集来估计平均值和方差,所以只能根据每个小批次(mini-batch)的平均值和方差不断训练模型。 而在预测模式下,一般使用整个预测数据集的均值和方差(因为这时候已经经过完整的训练了,因此可以得知全局信息)。为了节省存储资源,实际中大多采用**移动平均(moving average)**的方式来计算全局的均值和方差。移动平均的计算过程如下式所示:
μ t o t a l = λ ∗ μ t o t a l + ( 1 − λ ) ∗ μ B σ t o t a l 2 = λ ∗ σ t o t a l 2 + ( 1 − λ ) ∗ σ B 2 \begin{aligned}\mu_{total}&=\lambda*\mu_{total}+(1-\lambda)*\mu_{\mathcal{B}}\\\sigma_{total}^2&=\lambda*\sigma_{total}^2+(1-\lambda)*\sigma_{\mathcal{B}}^2\end{aligned} μtotalσtotal2=λμtotal+(1λ)μB=λσtotal2+(1λ)σB2



三、关键代码实现

以动手学深度学习第二版5的代码为例(Pytorch):

import torch
from torch import nn
from d2l import torch as d2ldef batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum):# 通过is_grad_enabled来判断当前模式是训练模式还是预测模式if not torch.is_grad_enabled():# 如果是在预测模式下,直接使用传入的移动平均所得的均值和方差X_hat = (X - moving_mean) / torch.sqrt(moving_var + eps)else:assert len(X.shape) in (2, 4)if len(X.shape) == 2:# 使用全连接层的情况,计算特征维上的均值和方差mean = X.mean(dim=0)var = ((X - mean) ** 2).mean(dim=0)else:# 使用二维卷积层的情况,计算通道维上(axis=1)的均值和方差。# 这里我们需要保持X的形状以便后面可以做广播运算mean = X.mean(dim=(0, 2, 3), keepdim=True)var = ((X - mean) ** 2).mean(dim=(0, 2, 3), keepdim=True)# 训练模式下,用当前的均值和方差做标准化X_hat = (X - mean) / torch.sqrt(var + eps)# 更新移动平均的均值和方差moving_mean = momentum * moving_mean + (1.0 - momentum) * meanmoving_var = momentum * moving_var + (1.0 - momentum) * varY = gamma * X_hat + beta  # 缩放和移位return Y, moving_mean.data, moving_var.data

解释几个可能的疑惑点:

为什么分为全连接层和卷积层两种情况?

  全连接层和卷积层比较典型,它们的批量规范化实现略有不同:当作用在全连接层时,实际上是作用在特征维;当作用在卷积层上时,实际上是作用在通道维(将通道维当成是卷积层的特征维)。

为什么作用在通道维?因为每个通道都有自己的拉伸参数偏移参数,并且都是标量。例如下图6所示:

在这里插入图片描述

上图各颜色通道中的像素值通常具有不同的分布和范围,这种不一致性可能会导致训练出错或网络不收敛等问题。因此需要通过Normalize操作,将每个通道的像素值标准化为均值为0、标准差为1的分布,使得所有通道的像素值范围和分布一致。(因此假如扩展到n维张量,你也只需对通道维求均值即可)



为什么全连接层设置 dim=0,而卷积层设置 dim=(0,2,3)

  全连接层是二维的,即(batch_size, feature) ,计算全连接层时,计算的是特征维的均值和方差,而每个行代表一个样本,每列代表一个特征。

dim=0dim=1 的含义

  • dim=0 表示沿着 “行” 的方向进行操作(也就是跨样本的操作),即对每个特征维的所有样本值进行聚合计算,比如求均值、方差等。
  • dim=1 表示沿着 “列” 的方向进行操作(也就是跨特征的操作),即对每个样本的所有特征值聚合计算。

下图重量/甜度/颜色评分为苹果的特征维,我们来计算特征维的均值:

苹果编号重量(克)甜度(°Bx)颜色评分(1 - 10)
苹果 1200127
苹果 2180106
苹果 3220148

dim=0代表行,dim=1代表列,既然我们要求特征维的均值,那么需要让 dim=0 ,也就是沿着行的方向“拍扁”。上图沿着行方向“拍扁”后得到的特征维的均值如下:

计算结果
重量:(200 + 180 + 220) / 3 = 200
甜度:(12 + 10 + 14) / 3 = 12
颜色评分: (7 + 6 + 8) / 3 = 7

那么卷积层 (batch_size, channels, height, width)设dim=(0,2,3)也很好理解了,我们需要得到通道维的均值,那么就得把其它几个维都“拍扁”。



为什么全连接层无需设置keepdim=True 而卷积层需设置keepdim=True

  由于pytorch的广播机制,只会从左边补1,换个说法即只会补齐最外层的维度,因此前者无需设置而后者需设置keepdim=True来保证广播机制的正常启动。

有点抽象,举例子说明:

# 构造一个形状为 (2, 3, 4, 5, 6) 的五维张量
A = torch.randn(2, 3, 4, 5, 6)# 打印张量 A 的形状
print("张量 A 的形状:", A.shape)# 构造一个形状为 (3, 4, 5, 6) 的四维张量
B = torch.randn(3, 4, 5, 6)
print("张量 B 的形状:", B.shape)try:# 尝试执行 A + BA + Bprint("可以成功输出")
except Exception as e:# 如果发生异常,打印失败信息print("失败输出:", e)

输出结果为:

张量 A 的形状: torch.Size([2, 3, 4, 5, 6])
张量 B 的形状: torch.Size([3, 4, 5, 6])
可以成功输出

因为广播机制会让B的维度补齐成(1,3,4,5,6),也就是最左边补“1”,于是就可以执行 A+B操作了。

而如下情况,即仅仅稍微改变一下B的形状:

# 构造一个形状为 (2, 3, 4, 5, 6) 的五维张量
A = torch.randn(2, 3, 4, 5, 6)# 打印张量 A 的形状
print("张量 A 的形状:", A.shape)# 构造一个形状为 (2, 3, 4, 5) 的四维张量
B = torch.randn(2, 3, 4, 5)
print("张量 B 的形状:", B.shape)try:# 尝试执行 A + BA + Bprint("可以成功输出")
except Exception as e:# 如果发生异常,打印失败信息print("失败输出:", e)

输出结果为:

张量 A 的形状: torch.Size([2, 3, 4, 5, 6])
张量 B 的形状: torch.Size([2, 3, 4, 5])
失败输出: The size of tensor a (6) must match the size of tensor b (5) at non-singleton dimension 4

因为广播机制只会往最左边补“1”,而这里B补“1”后形状变成(1,2,3,4,5),依旧和张量A的形状不一致,所以不能做相加操作。

回到 Batch-Normalization 的代码:

 if len(X.shape) == 2:# 使用全连接层的情况,计算特征维上的均值和方差mean = X.mean(dim=0)var = ((X - mean) ** 2).mean(dim=0)else:# 使用二维卷积层的情况,计算通道维上(axis=1)的均值和方差。# 这里我们需要保持X的形状以便后面可以做广播运算mean = X.mean(dim=(0, 2, 3), keepdim=True)var = ((X - mean) ** 2).mean(dim=(0, 2, 3), keepdim=True)

我们知道, dim等于哪个维,就是将那个维进行“拍扁”。

对于全连接层(batch_size, feature),设置 dim=0时,相当于将第 0 维“拍扁”,拍扁了相当于那个维直接“消失”了,此时meanvar的形状为(feature)。于是直接可以通过广播机制,在最左边补“1”,变成(1, feature),便可以和变量 X 一起计算了【X的形状(batch_size, feature)】。

而卷积层 (batch_size, channels, height, width)dim=(0,2,3)时,相当于将第 0,2,3 维“拍扁”,此时meanvar的形状为(channels),而 X 的形状是 (batch_size, channels, height, width),你得将meanvar的形状扩展到和 X 一致才可以进行计算,而广播机制只能往最左边补“1”,因此(channels)无法扩展成和X一致的形状,顶多扩展成(1, channels),所以无法和 X 进行计算,程序报错。

因此需要对卷积层使用 keepdim=True这个参数,这样meanvar的形状就可以扩展成 (1, channels, 1, 1),与X一致,才能进行接下来的计算。



if not torch.is_grad_enabled() 为什么可以判断是训练还是预测模式?

  反向传播时会涉及梯度的计算,而只有训练时才会进行反向传播,因此可以通过是否进行梯度的计算来判断训练模式还是预测模式。



四、补充

  原论文中提出Batch-Normalization的优点是减少了内部协变量转移(internal covariate shift,简单来说就是变量值的分布在训练过程中会发生变化,但是这种解释在后续论文被证实比较不严谨,发现它并没有减少内部协变量的转移 [Santurkar et al.,2018]。



五、参考文献


  1. Ioffe S. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015. ↩︎

  2. 王琦, 杨毅远, 江季, 深度学习详解, 北京:人民邮电出版社, 2024 ↩︎

  3. (日)斋藤康毅著, 陆宇杰译, 深度学习入门基于Python的理论与实现, 北京:人民邮电出版社, 2018.07 ↩︎

  4. Santurkar S, Tsipras D, Ilyas A, et al. How does batch normalization help optimization?[J]. Advances in neural information processing systems, 2018, 31. ↩︎

  5. 阿斯顿·张(Aston Zhang), 李沐(Mu Li), [美] 扎卡里·C. 立顿(Zachary C. Lipton), 等. 动手学深度学习(PyTorch版)[M]. 第二版. 人民邮电出版社, 2023-2. ↩︎

  6. 【Batch Normalization】 https://www.bilibili.com/video/BV11s4y1c7pg/?share_source=copy_web&vd_source=199a3f4e3a9db6061e1523e94505165a ↩︎

相关文章:

Batch Normalization学习笔记

文章目录 一、为何引入 Batch Normalization二、具体步骤1、训练阶段2、预测阶段 三、关键代码实现四、补充五、参考文献 一、为何引入 Batch Normalization 现在主流的卷积神经网络几乎都使用了批量归一化(Batch Normalization,BN)1&#xf…...

PIC单片机HEX文件格式分析

在调试PIC单片机在bootloader程序时,需要将hex文件转换为bin文件,在转换之前先了解一下hex文件中数据是如何定义的。 直接打开一个LED灯闪烁的程序生成的hex文件,芯片型号为PIC18F46K80 可以看到每条数据都是由6部分组成的,下面分…...

【unity游戏开发之InputSystem——07】InputSystem+UGUI配合使用(基于unity6开发介绍)

文章目录 一、InputSystem+UGUI配合使用1、官方文档参考2、切换到新的输入模块二、UGUI中的新输入系统输入模块参数相关1、Send Pointer Hover To Parent2、Move Repeat Delay3、Move Repeat Rate4、XR Tracking Origin5、Deselect On Background CLick6、Pointer Behavior7、S…...

RocketMQ 的 Topic 和消息队列MessageQueue信息,是怎么分布到Broker的?怎么负载均衡到Broker的?

目录 1. Topic 和 MessageQueue 的基本概念 1.1 Topic 1.2 MessageQueue 2. Topic 和 MessageQueue 的分布 2.1 Topic 的创建 2.2 MessageQueue 分配到 Broker 2.3 分布规则 3. 负载均衡机制 3.1 Producer 的负载均衡 3.2 Consumer 的负载均衡 3.3 Broker 的负载均衡…...

Qt简单迷宫游戏

目录 你将学到你将准备你将改变你将设计你将编程开始界面游玩界面胜利界面其它bug修复 你可扩展下一篇博客要说的东西 你将学到 Qt中QKeySequence对象的基本创建Qt中QShortcut对象的基本应用Qt中QSoundEffect对象的基本应用 你将准备 在开始制作Qt简单迷宫游戏之前&#xff…...

Webrtc (1) - Windows 编译

最近项目上遇到webrtc wgc 的几个test case无法通过,与webrtc人员沟通后决定要自行修复一下(因为他们不想管…) 参考文档 https://webrtc.org/support/contributinghttps://chromium.googlesource.com/chromium/src//main/docs/#checking-out-and-building 以上两…...

深圳大学-智能网络与计算-实验一:RFID原理与读写操作

实验目的与要求 掌握超高频RFID标签的寻卡操作。掌握超高频RFID标签的读写操作。掌握超高频RFID标签多张卡读取时的防冲突机制。 方法,步骤 软硬件的连接与设置超高频RFID寻卡操作超高频RFID防冲突机制超高频RFID读写卡操作 实验过程及内容 一.软硬…...

文献引用指南ChatGPT提示词分享

文献引用指南 在学术写作中,准确引用是至关重要的环节。它不仅能够为您的研究提供坚实的学术基础,还能确保您尊重并认可他人的学术成果,从而有效避免抄袭的问题。而ChatGPT在这一方面同样能够为您提供有力的支持。借助ChatGPT,您…...

什么是计算机应用基础知识

计算机应用基础知识是指学习和掌握计算机的基本理论、硬件、软件、网络和应用技能的基础内容。它是为使用计算机进行日常工作、学习和解决实际问题打下的基础。计算机应用基础知识涉及多个领域,主要包括以下几个方面: 一、计算机硬件基础 计算机硬件组成:了解计算机的基本组…...

SpringBoot集成Flink-CDC,实现对数据库数据的监听

一、什么是 CDC ? CDC 是Change Data Capture(变更数据获取)的简称。 核心思想是,监测并捕获数据库的变动(包括数据或数据表的插入、 更新以及删除等),将这些变更按发生的顺序完整记录下来&…...

微信小程序云开发服务端存储API 从云存储空间删除文件

deleteFile 从云存储空间删除文件 const cloud require(wx-server-sdk)exports.main async (event, context) > {const fileIDs [xxx, xxx]const result await cloud.deleteFile({fileList: fileIDs,})return result.fileList }写的资式如有不对,请各位大神多…...

[操作系统] 深入进程地址空间

程序地址空间回顾 在C语言学习的时,对程序的函数、变量、代码等数据的存储有一个大致的轮廓。在语言层面上存储的地方叫做程序地址空间,不同类型的数据有着不同的存储地址。 下图为程序地址空间的存储分布和和特性: 使用以下代码来验证一下…...

gitlab处理空文件夹的提交或空文件夹提交失败

问题描述 厂家发给了我一个压缩包文件,压缩包解压之后本地编译没问题;推送到gitlab之后,再编译就报错了; 问题原因 经过分析之后发现,压缩包解压之后存在很多空文件夹;但是gitlab推送的时候,…...

C++ —— 智能指针 unique_ptr (上)

C —— 智能指针 unique_ptr (上) 普通指针的不足普通指针的释放智能指针智能指针 unique_ptr智能指针初始化错误用法get()方法返回裸指针智能指针不支持指针的运算(、-、、- -) 普通指针的不足 new和new [] 的内存需要用delete和…...

ruoyi-vue-pro集成magic-api(图文代码)

目录 前言1. 配置依赖2. 集成登录3. 成功展示前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 原先写过简单的集成:了解 magic-api的基本用法 附实战代码 magic-api相关文档推荐阅读:接口鉴权 相关的Java代码推荐阅读: java框架 零基础从入门到精…...

【线上问题定位处理】及【性能优化】系列文章

目录 性能优化 性能优化 九大服务架构性能优化方式 如何进行GC调优 如何排查线上系统出现的Full GC MySQL - 性能优化 MySQL - 分库分表 大数据查询的处理方案 MySQL优化手段有哪些 服务CPU100%问题如何快速定位? 服务内存OOM问题如何快速定位? JVM调优6大步骤 线…...

如何解压rar格式文件?8种方法(Win/Mac/手机/网页端)

RAR 文件是一种常见的压缩文件格式,由尤金・罗谢尔(Eugene Roshal)开发,因其扩展名 “rar” 而得名。它通过特定算法将一个或多个文件、文件夹进行压缩,大幅减小存储空间,方便数据传输与备份。然而&#xf…...

GORM 支持的数据库解析

GORM 是一个流行的 Go 语言 ORM(对象关系映射)库,它简化了 Go 与数据库之间的交互。作为一款功能强大的库,GORM 支持多种主流关系型数据库,满足不同开发场景下的需求。本文将探讨 GORM 支持的主要数据库及其特点&#…...

分布式光纤应变监测是一种高精度、分布式的监测技术

一、土木工程领域 桥梁结构健康监测 主跨应变监测:在大跨度桥梁的主跨部分,如悬索桥的主缆、斜拉桥的斜拉索和主梁,分布式光纤应变传感器可以沿着这些关键结构部件进行铺设。通过实时监测应变情况,能够精确捕捉到车辆荷载、风荷…...

如何在oracle关闭情况下如何修改spfile的参数

如何在oracle关闭情况下如何修改spfile的参数 一、问题背景二、处理方案 一、问题背景 在ORACLE数据库启动状态下通过下列代码修改了最大连接数 alter system set processes2000 scopespfile sid*;关闭了数据库再重新启动提示如下报错: ORA-00838: Specified valu…...

[ Spring ] Spring Cloud Gateway 2025 Comprehensive Overview

文章目录 Spring Gateway ArchitectureProject Level DependencyService CenterService ProviderGateway ServiceLaunch All Service Spring Gateway Architecture Service Center : register and find service providerService Provider : programs that provide actual serv…...

软考信安27~Windows操作系统安全相关

1、Windows账户与组管理 1.1、用户账户查看 whoami #查看当前登录的用户名称 whoami /all #查看当前系统的用户名和组信息,以及SID whoami /user #查看当前用户的SID net user #查看系统中包含哪些用户 wmic useraccount get name,sid #查看…...

2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型

2025年数学建模美赛 A题分析(1)Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析(2)楼梯磨损分析模型 2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型 2025年数学建模美赛 A题分…...

Spring整合Mybatis、junit纯注解

如何创建一个Spring项目 错误问题 不知道什么原因,大概是依赖版本不兼容、java版本不对的问题,折磨了好久就是搞不成。 主要原因看pom.xml配置 pom.xml配置 java版本 由于是跟着22年黑马视频做的,java版本换成了jdk-11,用21以…...

HAM-TTS大模型:基于token的零样本文字转语音分层声学建模

HAM-TTS大模型:基于token的零样本文字转语音分层声学建模 ​​ 吉利自研语音大模型HAM-TTS的全称是:Hierarchical Acoustic Modeling for Token-Based Zero-Shot Text-to-Speech,直译是基于token的零样本文字转语音分层声学建模,是星睿AI大模型体系下的重要一员。顾名思义…...

SpringBoot开发(三)SpringBoot介绍、项目创建、运行

1. SpringBoot 1.1. SpringBoot介绍 Spring Boot给世界程序员带来了春天,越来越多的企业选择使用spring boot来开发他们的软件,因此学习spring boot是科技发展的必然趋势。本门课程将从web最基础的知识点开始讲起,逐步带你攻破spring boot的…...

SQL Server 建立每日自动log备份的维护计划

SQLServer数据库可以使用维护计划完成数据库的自动备份,下面以在SQL Server 2012为例说明具体配置方法。 1.启动SQL Server Management Studio,在【对象资源管理器】窗格中选择数据库实例,然后依次选择【管理】→【维护计划】选项&#xff0…...

git Bash通过SSH key 登录github的详细步骤

1 问题 通过在windows 终端中的通过git登录github 不再是通过密码登录了,需要本地生成一个密钥,配置到gihub中才能使用 2 步骤 (1)首先配置用户名和邮箱 git config --global user.name "用户名"git config --global…...

软件越跑越慢的原因分析

如果是qt软件,可以用Qt Creator Profiler 作性能监控如果是通过web请求,可以用JMeter监控。 软件运行过程中逐渐变慢的现象,通常是因为系统资源(如 CPU、内存、磁盘 I/O 等)逐渐被消耗或软件中存在性能瓶颈。这个问题…...

C++AVL树(二)详解

文章目录 AVL树旋转单旋右单旋左单旋 双旋左右双旋右左双旋 平衡因子的更新左右双旋右左双旋 判断是不是AVL树时间复杂度分析全部的代码 AVL树 旋转 单旋 单旋是纯粹的一边高 单旋平衡因子是同号 右单旋 a,b,c自身不能发生旋转 并且也不能不向上继续更新(不能停…...

【GoLang】利用validator包实现服务端参数校验时自定义错误信息

在C/S架构下,服务端在校验请求参数时,若出现参数错误,要响应给客户端一个错误消息,通常我们会统一响应“参数错误”。 但是,如果只是一味的提示参数错误,我并不知道具体是哪个参数错了呀!能不能…...

AIP-128 声明友好接口

编号128原文链接AIP-128: Declarative-friendly interfaces状态批准创建日期2020-10-06更新日期2020-10-06 许多服务需要与常见的DevOps工具交互,特别是创建和管理可网络寻址资源(如虚拟机、负载均衡器、数据库实例等)的工具。这些工具采用“…...

【Jave全栈】Java与JavaScript比较

文章目录 前言一、Java1、 历史与背景2、语言特点3、应用场景4、生态系统 二、JavaScript1、历史与背景2、语言特点3、应用场景4、 生态系统 三、相同点四、不同点1、语言类型2、用途3、语法和结构4、性能5、生态系统6、开发模式 前言 Java和JavaScript是两种不同的编程语言&a…...

钉钉群机器人设置——python版本

钉钉群机器人设置——python版本 应用场景钉钉界面操作程序开发效果展示 应用场景 由于工作需要,很多项目执行程序后出现报错信息无法第一时间收到,因此实时预警对于监控程序还是有必要。(仅个人观点) 参考文档及博客&#xff1a…...

报错:{‘csrf_token‘: [‘The CSRF token is missing.‘]}

flask实现一个简单的注册界面报错 register.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form action"" method"post&…...

STM32新建不同工程的方式

新建工程的方式 1. 安装开发工具 MDK5 / keil52. CMSIS 标准3. 新建工程3.1 寄存器版工程3.2 标准库版工程3.3 HAL/LL库版工程3.4 HAL库、LL库、标准库和寄存器对比3.5 库开发和寄存器的关系 4. STM32CubeMX工具的作用 1. 安装开发工具 MDK5 / keil5 MDK5 由两个部分组成&#…...

Java数据库操作指南:快速上手JDBC【学术会议-2025年数字化教育与信息技术(DEIT 2025】

大会官网&#xff1a;www.ic-deit.org 前言 在现代企业应用中&#xff0c;数据库是数据存储和管理的重要组成部分。Java作为一种广泛使用的编程语言&#xff0c;提供了多种方式与数据库进行交互。本文将介绍 JDBC&#xff08;Java Database Connectivity&#xff09;&#x…...

基于Springboot + vue实现的在线装修管理系统

“前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff1a;人工智能学习网站” &#x1f496;学习知识需费心&#xff0c; &#x1f4d5;整理归纳更费神。 &#x1f389;源码免费人人喜…...

计算机网络之应用层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 05 应用层 在网上看到其他人做了相关笔记&#xff0c;就不再多余写了&#xff0c;直接参考着学习吧。 王道考研 计算机网络笔记 第六章&#xff1a;应用层_王道考研 应用层 笔记-CSDN博客 DNS&#x…...

SpringMVC框架

第1章 SpringMVC入门 1.1 SpringMVC简介 Spring MVC 全称:Spring Web MVC是 Spring 框架的一部分&#xff0c;专注于实现 Web 应用程序的模型-视图-控制器&#xff08;Model-View-Controller, MVC&#xff09;设计模式。它为构建灵活且松耦合的 Web 应用提供了强大的功能&…...

将 OneLake 数据索引到 Elasticsearch - 第 1 部分

作者&#xff1a;来自 Elastic Gustavo Llermaly 学习配置 OneLake&#xff0c;使用 Python 消费数据并在 Elasticsearch 中索引文档&#xff0c;然后运行语义搜索。 OneLake 是一款工具&#xff0c;可让你连接到不同的 Microsoft 数据源&#xff0c;例如 Power BI、Data Activ…...

flutter跨端UI框架简介

flutter跨端UI框架简介 简介 Flutter是由Google开发的开源应用开发框架&#xff0c;主要用于构建高性能、跨平台的移动、Web和桌面应用程序。Flutter使用Dart语言&#xff0c;提供了一套丰富的Widgets&#xff0c;使开发者能够快速创建美观的用户界面。其最大特点是热重载功能…...

Centos 修改历史读录( HISTSIZE)

history命令 -c #清空命令历史 -r #读历史文件附加到历史列表 -w #保存历史列表到指定的历史文件 命令历史相关环境变量 HISTSIZE #命令历史记录的条数 HISTFILE #指定历史文件&#xff0c;默认为~/.bash_history HISTFILESIZE #命令历史文件记录历史的条数 以上变量可以 exp…...

利用ML.NET精准提取人名

在当今信息爆炸的时代&#xff0c;文本处理任务层出不穷&#xff0c;其中人名提取作为基础且重要的工作&#xff0c;广泛应用于信息检索、社交网络分析、客户关系管理等领域。随着人工智能不断进步&#xff0c;ML.NET作为微软推出的开源机器学习框架&#xff0c;为开发者提供了…...

关于deepin上运行Qt开发的程序

国产化替代是将来各单位的主流趋势&#xff0c;探索自行开发应用程序在国产操作系统上正常运行是将来的主要工作之一。本文浅尝gui程序在统信社区版——deepin上遇到的小问题。 使用Qt在deepin上做了一个类似gif的帧动画弹窗&#xff0c;在编译运行时&#xff0c;程序可以正常…...

3.3 Go函数可变参数

可变参数&#xff08;variadic parameters&#xff09;是一种允许函数接受任意数量参数的机制。它在函数定义中使用 ...type 来声明参数类型&#xff0c;所有传递的参数会被收集为一个切片&#xff0c;函数内部可以像操作普通切片一样处理这些参数。 package mainimport "…...

Queries Acceleration -Tuning- Tuning Execution 学习笔记

1 Adjustment of RuntimeFilter Wait Time 1.1 Case: Too Short RuntimeFilter Wait Time 1.1.1 没有看懂,好像是等待时间过小也会导致性能下降 1.1.2 set runtime_filter_wait_time_ms = 3000; 2 Data Skew Handling 2.1 Case 1: Bucket Data Skew Leading to Suboptimal …...

VS C++ 配置OPENCV环境

VS C 配置OPENCV环境 1.下载opencv2.安装环境3.opencv环境4.VS配置opencv环境5.EXE执行文件路径的环境lib和dll需要根据是debug还是release环境来区分使用哪个 6.Windows环境 1.下载opencv 链接: link 2.安装环境 双击运行即可 3.opencv环境 include文件路径:opencv\build\…...

Midscene.js:重新定义UI自动化的新时代工具

前言 Midscene.js 是一个创新的、面向开发者的 UI 自动化解决方案&#xff0c;并通过人工智能技术简化自动化脚本的编写与维护。 它提供了三种核心方法——交互&#xff08;.ai, .aiAction&#xff09;、提取&#xff08;.aiQuery&#xff09;和断言&#xff08;.aiAssert&am…...

记录让cursor帮我给ruoyi-vue后台管理项目整合mybatis-plus

自己整合过程中会出现 work.web.exception.GlobalExceptionHandler :100 | 请求地址/admin/device/install/detail/1,发生未知异常. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.fire.mapper.DeviceInstallMapper.selectById at o…...