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

InstanceNorm LayerNorm

InstanceNorm && LayerNorm

@author: SUFEHeisenberg

@date: 2023/01/26

先说结论:

  • 将Transformer类比于RNN:一个token就是一层layer,对一整句不如token有意义
  • 原生Bert代码或huggingface中用的都是InstanceNorm instead of LayerNorm,但都是torch.nn.LayerNorm实现的。

1. 对NLP数据的理解

NLP input data的为[batch_size, sequence_len, dim] 表示为[K, N, D]

关键就是这个形如 [K, N, D] 的 tensor 它其实不是一层,而是N 个形如 [K, D] 的层拼接的结果。用 RNN 来想就很明白了,计算完时间步 t 以后才能计算时间步 t+1,比如 h_{t+1}=tanh(Wh_t+b),h_{t+1} 和 h_t 在计算图上的深度都不同,显然第 t 个词的 D 维向量和第 t+1 个词的 D维向量属于两个不同的层。只不过为了方便使用,会把所有的 h_{1:T} 都拼接起来组成一个 tensor 返回。在 xfmr 里,因为各个时间步可以同时计算,所以这一点不够不明显了。

简单来说,由于RNN在每个时间步都共享同一套参数(其实Transformer也是一样,同一层的不同token共享同一套QKV),BatchNorm是跨时间步进行的(换句话说就是跨token进行的,因为一个batch中所有句子在同一位置的token属于同一个时间步),而LayerNorm是只取决于当前时间步(或者说当前这个token)。

从这样的视角来看,或者说从网络的实际计算流程来看,对于一批文本输入[K, N, D],实际上可以看作是由N个[K, d]的输入拼接而来的,其中每个[K, D]代表的是一个batch中所有句子在某一位置(或说某个时间步)的token嵌入组成的。在RNN中,[K, D]按时序依次输入网络,在Transformer中则是通过并行计算,但本质上都是通过同一套参数来计算。 因此,在[K, N, D]上进行LN,就是在SN个[K, D]这样的批数据上进行LN,只不过这N个LN共享同一套 gain(γ\gammaγ)和bias(β\betaβ)。

在此直接照搬知乎大佬的讲解,通过举例已经非常浅显透彻了。

震惊!BERT用LayerNorm的可能不是你认为的那个Layer Norm?

2. 结合公式举个栗子🌰

2.1 生成demo data

import torch
K, N, D = 2, 3, 4
# 生成demo data
embedding = torch.randn(K, N, D)
Out[1]: 
tensor([[[ 2.3833,  0.1780,  1.0667,  0.2227],[ 0.2482, -0.3889,  0.7117,  0.9091],[ 0.4513,  1.6905,  0.5648, -1.2175]],[[ 0.1469, -0.9727,  2.5195, -1.3820],[-0.0406,  0.4197,  1.8440,  1.2459],[ 0.0238,  0.4803, -1.0974, -0.3951]]])

2.2 验证LayerNorm

LayerNorm是K*N*D固定了K,在每一个batch会生成K个mean均值μ1,⋯,μK\mu_1,\cdots,\mu_Kμ1,,μK,每个batch中的得到标准差σ1,⋯,σK\sigma_1,\cdots, \sigma_Kσ1,,σK

所以,对于第k个batch∈RN×D\in\mathbb{R}^{N\times D}RN×D而言(对于bert而言是RN+2,D\mathbb{R}^{N+2,D}RN+2,D, 在此不细究讨论):
Xnd(k)′=Xnd(k)−μkσkX_{nd}^{(k)\prime} = \frac{X^{(k)}_{nd}-\mu_k}{\sigma_k} Xnd(k)=σkXnd(k)μk
μ\muμσ\sigmaσ是每个batch中N*D的均值方差。

# layer_normalization
layer_norm = torch.nn.LayerNorm([N,dim], elementwise_affine = False)
print("layer_norm: ", layer_norm(embedding))
layer_norm:  tensor([[[ 2.0472, -0.4403,  0.5621, -0.3898],[-0.3610, -1.0797,  0.1617,  0.3843],[-0.1320,  1.2658, -0.0039, -2.0143]],[[-0.0760, -1.0675,  2.0254, -1.4301],[-0.2420,  0.1656,  1.4271,  0.8974],[-0.1850,  0.2193, -1.1780, -0.5560]]])

验证第一行元素:

mean = embedding.mean(dim=(1,2))
# tensor([0.5683, 0.2327])
std = embedding.std(dim=(1,2), unbiased=False) #一定要记得unbiased=False
# tensor([0.8866, 1.1291])
# or 用Var的数学期望定义
var = torch.square(embedding-mean).mean(dim=(1,2))
#tensor([0.7860, 1.2748])
(embedding[0][0]-mean[0])/std[0]
# Out[189]: tensor([[ 2.0472, -0.4403,  0.5621, -0.3898]])

验证所有元素

eps: float = 0.00001
mean = torch.mean(embedding[:, :, :], dim=(-2,-1), keepdim=True)
var = torch.square(embedding[:, :, :] - mean).mean(dim=(-2,-1), keepdim=True)print("mean: ", mean.shape)
print("y_custom: ", (embedding[:, :, :] - mean) / torch.sqrt(var + eps))

2.3 验证InstanceNorm

LayerNorm是K*N*D固定了K*N,在每一个token会生成K*N个mean均值μ11,⋯,μkn,⋯,μKN\mu_{11},\cdots,\mu_{kn},\cdots,\mu_{KN}μ11,,μkn,,μKN,每个batch中的得到标准差σ1,⋯,σkn,⋯,σKN\sigma_1,\cdots,\sigma_{}kn,\cdots, \sigma_{KN}σ1,,σkn,,σKN

所以,对于第kn个token∈R1×D\in\mathbb{R}^{1\times D}R1×D而言:
Xd(kn)′=Xd(kn)−μknσknX_{d}^{(kn)\prime} = \frac{X^{(kn)}_{d}-\mu_{kn}}{\sigma_{kn}} Xd(kn)=σknXd(kn)μkn
μ\muμσ\sigmaσ是每个batch中每个seq_len的token中D里面的均值方差。

# instance_normalization,可以看到二者其实都是通过nn.LayerNorm实现的
instance_norm = torch.nn.LayerNorm(dim, elementwise_affine = False)
(embedding)
print("instance_norm: ", instance_norm(embedding))
instance_norm:  tensor([[[ 1.5902, -0.8784,  0.1164, -0.8283],[-0.2438, -1.5193,  0.6840,  1.0791],[ 0.0761,  1.2702,  0.1855, -1.5318]],[[ 0.0454, -0.6927,  1.6098, -0.9626],[-1.2464, -0.6145,  1.3411,  0.5199],[ 0.4668,  1.2533, -1.4650, -0.2550]]])

验证第一行元素:

(embedding[0][0]-embedding[0][0].mean())/embedding[0][0].std(unbiased=False)
# tensor([ 1.5902, -0.8784,  0.1164, -0.8283])

验证所有元素

eps: float = 0.00001
mean = torch.mean(embedding[:, :, :], dim=(-1), keepdim=True)
var = torch.square(embedding[:, :, :] - mean).mean(dim=(-1), keepdim=True)print("mean: ", mean.shape)
print("y_custom: ", (embedding[:, :, :] - mean) / torch.sqrt(var + eps))

Reference

震惊!BERT用LayerNorm的可能不是你认为的那个Layer Norm?

关于BatchNorm与LayerNorm的一点认识

相关文章:

Web实操(6),基础知识学习(24~)

1.[ZJCTF 2019]NiZhuanSiWei1 (1)进入环境后看到一篇php代码,开始我简单的以为是一题常规的php伪协议,多次试错后发现它并没有那么简单,它包含了基础的文件包含,伪协议还有反序列化 (2&#x…...

2024-05-08 js 常见案例

1.表单验证function validateForm() { var name = document.forms["myForm"]["name"].value; if (name == "") { alert("Name must be filled out"); return false; } // 更多的验证... return true; }2.DOM 操作var element…...

Linux进程间通信:system V共享内存

目录 一、什么是共享内存 1.1创建共享内存 1.2释放共享内存 1.2.1shmctl 1.2.2shmat 1.2.3 shmdt 二、共享内存的实现及使用 2.1ShmClient 2.2Shm_Server 2.3Fifo.hpp 2.4Comm.hpp 一、什么是共享内存 标准系统V也叫system V的本地通信方式一般有三种: …...

Qt窗口及QWidget类详解

QtWidgets 模块及窗口基本概念 QWidget 类是所有用户界面对象的基类,QWidget 及其子类是开发桌面应用的核心,这些类都位于 QtWidgets 模块内,注意:QtWidgets 是模块,QWidget 是类(少一个字母 t 和最后的 s)。 部件或窗口部件:Qt 把建立用户界面的元素称为窗口部件(widg…...

团队共同完成——谈谈本小组项目的测试1、你希望不同的人物角色(有些团队有3个人物角色)如何使用你的软

]团队共同完成——谈谈本小组项目的测试 1、你希望不同的人物角色(有些团队有3个人物角色)如何使用你的软件?他们的需求和目标是什么,您的功能是如何协同工作来解决他们的需求的? 2、本小组项目的测试矩阵是什么? 是在什么平台、什么语言、什么类型的机器、什么类型浏览器…...

某度假村培训体系搭建项目成功案例纪实

——建立分层分类的培训体系,引入场景化培训,确保培训落到实处 【客户行业】文旅行业、酒店行业、文旅企业、度假村 【问题类型】培训体系搭建 【客户背景】 某度假村是一家集住宿、娱乐、健身等服务为一体的综合服务场所,度假村内部环境…...

InstanceNorm LayerNorm

InstanceNorm && LayerNorm author: SUFEHeisenberg date: 2023/01/26 先说结论: 将Transformer类比于RNN:一个token就是一层layer,对一整句不如token有意义原生Bert代码或huggingface中用的都是InstanceNorm instead of LayerNorm&#xff…...

数据结构---堆

堆 定义 基本操作 建堆 堆排序 优先队列 一、堆的定义: 堆必须是一个完全二叉树 还得满足堆序性 什么是完全二叉树呢? 完全二叉树只允许最后一行不为满 且最后一行必须从左到右排序 最后一行元素之间不可有间隔,中间不可有空缺 如下几棵树…...

3小时精通opencv(五) 利用TrackBar进行颜色检测

3小时精通opencv(五) 利用TrackBar进行颜色检测 参考视频资源:3h精通Opencv-Python 本章内容介绍如何利用TrackBar调节色域, 手动提取到我们需要的颜色 文章目录3小时精通opencv(五) 利用TrackBar进行颜色检测创建Trackbar色彩检测创建Trackbar 在opencv中使用createTrackbar函…...

学习记录673@项目管理之进度管理案例

本文主要是进度管理之关键链路法的案例。 案例 Perfect 项目的建设方要求必须按合同规定的期限交付系统,承建方项目经理李某决定严格执行项目进度管理,以保证项目按期完成。他决定使用关键路径法来编制项目进度网络图。在对工作分解结构进行认真分析后&…...

【设计模式】结构型模式·组合模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易,如果您觉得写的不错,欢迎给博主来一波点赞、收藏~让博主更有动力吧! 一.概述 又称为部分整体模式,用于把一组相似的对象当作一个单一的对象。组合模式依…...

Vue-Router详解

1、前端路由的发展历程 1.1、认识前端路由 路由其实是网络工程中的一个术语: 在架构一个网络时,非常重要的两个设备就是路由器和交换机。当然,目前在我们生活中路由器也是越来越被大家所熟知,因为我们生活中都会用到路由器&…...

Eclipse中的Build Path

Eclipse中的Build Path简介如果修改了Build Path中的中的JRE版本,记得还需要同步修改Java编译器的版本,如下图红框所示简介 Build Path是Java工程包含的资源属性合集,用来管理和配置此Java工程中【除当前工程自身代码以外的其他资源】的引用…...

Python与Matlab混合编程案例

前言因为项目需要,需要批处理很多Matlab的.m文件,从每个文件中提取结果合并到一个文件中。 很明显,如果手工统计,几百个文件会累死的。 因此立即想到了Python在批处理方面的优势,因此就在网上找了相关资料,…...

stack、queue、priority_queue

容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 其中stack和queue都是容器适配器,其中stack可以封装vector、list以及我们…...

高通平台开发系列讲解(GPS篇)gpsONE 系统架构

文章目录 一、系统架构图二、gpsONE系统组成三、gpsONE交互流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢高通的定位系统模块,名称叫gpsONE。 一、系统架构图 二、gpsONE系统组成 GPS系统架构可以分为六个部分: APP层Framework Client端(LocationManager API…...

zkMove——针对Move合约生态的zkVM

1. 引言 Move为不同于Solidity的,开源的安全的智能合约开发语言,最早由Facebook为Diem链创造开发。不过,Move本身设计为与平台无关的语言,具有通用的库、工具,并使得采用完全不同数据模型和执行模型的链的开发者社区都…...

贪心算法的题目

每一步都做出一个局部最优的选择,最终的结果就是全局最优 只有一部分问题才能用贪心算法(严格来讲,一个问题能不能用贪心算法需要证明的) 2022.8.30 蔚来笔试题: 有a个y,b个o,c个u,用这些字母拼成一个字符串&#xf…...

线程控制--Linux

文章目录线程理解线程的优点与缺点进程的多个线程共享线程控制线程创建线程终止线程等待线程分离总结线程理解 谈及线程,就不得不谈起进程与线程的关系了。学习完前面有关进程的知识,之前我们对进程的定义是:内核数据结构代码和数据。但是今…...

17 | 如何做好面试复盘?将经验提升为能力

前言 前言:面试是最好的查漏补缺机会,做好面试复盘又是十分的重要。 文章目录前言一. 关于复盘1. 什么是复盘(What)2. 复盘的目的(Why)3. 什么时候需要复盘(When)4. 怎么进行复盘&am…...

数据结构-树

1. 二叉树遍历 #include <stdbool.h> #include "stdio.h" #include "stdlib.h"typedef struct TNode *Position; typedef Position BinTree; // 二叉树类型 typedef char ElementType;// 树结点定义 struct TNode {ElementType Data; // 结点数据Bin…...

Python3 循环语句

本章节将为大家介绍 Python 循环语句的使用。 Python 中的循环语句有 for 和 while。 Python 循环语句的控制结构图如下所示&#xff1a; while 循环 Python 中 while 语句的一般形式&#xff1a; while 判断条件(condition)&#xff1a;执行语句(statements)…… 执行流程…...

时序数据处理中的拟合问题

对于深度学习或机器学习模型而言,我们不仅要求它对训练数据集有很好的拟合(训练误差),同时也希望它可以对未知数据集(测试集)有很好的拟合结果(泛化能力),所产生的测试误差被称为泛化误差。度量泛化能力的好坏,最直观的表现就是模型的过拟合(overfitting)和欠拟合(…...

[数据结构基础]排序算法第一弹 -- 直接插入排序和希尔排序

目录 一. 排序的概念及分类 1.1 排序的概念 1.2 常见的排序算法 二. 直接插入排序 2.1 直接插入排序的实现逻辑 2.2 直接插入排序的实现代码 2.3 直接插入排序的时间复杂度分析 三. 希尔排序 3.1 希尔排序的实现逻辑 3.2 希尔排序实现代码 3.3 希尔排序的效率测试 …...

厚积薄发打卡Day115:Debug设计模式<简单工厂、工厂方法、抽象工厂>

厚积薄发打卡Day115&#xff1a;Debug设计模式<简单工厂、工厂方法、抽象工厂> 简单工厂 定义 由一个工厂对象决定创建出哪一种产品类的实例&#xff08;严格意义并不是设计模式&#xff0c;更是一种风格&#xff09; 类型&#xff1a;创建型&#xff0c;但不属于GOF…...

python元组

python元组 文章目录python元组一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.创建元组2.访问元组3.修改元组4.删除元组5.索引及截取6.元组运算符7.内置函数总结一、实验目的 掌握元组的用法 二、实验原理 Python 的元组与列表类似&#xff0c;不同之处在…...

gcc中预定义的宏__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__

今天在看Linux系统编程这本书的代码的时候看到了__GNUC__&#xff0c;不太清楚这个宏所以去查了一下&#xff0c;以此记录。GNU C预定义了一系列的宏&#xff0c;这些宏都是以双下划线开始的&#xff0c;这里只讲一下__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__&#xff0c;完…...

AxMath使用教程(持续更新中)

前言 这两天学了学Latex&#xff0c;主要是为了以后写毕业论文做铺垫&#xff0c;而且Latex在数学公式这一方面&#xff0c;要比Word方便许多&#xff0c;于是我就下载了一款国产的公式编辑器——AxMath。永久会员不贵&#xff0c;只要36元&#xff0c;而且软件很好用&#xf…...

day11 栈和队列 | 20、有效的括号 1047、删除字符串中的所有相邻重复项 150、逆波兰表达式求值

题目 20、有效的括号 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序…...

【前端面试】http面试整理

"一问一答"模型的协议 客户端通过http请求&#xff1b;服务器端根据请求返回客户想要的资源&#xff1b;客户端接收到资源&#xff1b;http是什么 HTTP是超文本传输协议&#xff0c;是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约…...

倒霉倒霉倒霉(传送门 bfs 三维数组 递归 综合运用

题目描述“啊&#xff01;倒霉倒霉倒霉~”龙叔被困在一座大厦里了&#xff0c;可恶的瓦龙把这座大厦点燃了&#xff0c;他借机消灭龙叔。这座大厦有L层&#xff0c;每一层都有R*C个房间。熊熊火焰蔓延十分快&#xff0c;有的房间已经着火了&#xff0c;龙叔没办法通过。这时老爹…...

C++函数定义和调用介绍

C函数定义和调用介绍 函数的意义&#xff1a;利用率高&#xff0c;可读性强&#xff0c;利于移植。 一个C程序中主函数有且只有一个&#xff0c;是程序的入口&#xff0c;而函数&#xff08;或称子函数&#xff09;可以有很多。 每个 C 程序都至少有一个函数&#xff0c;即主…...

手把手带初学者快速入门 JAVA Web SSM 框架

博主也是刚开始学习SSM&#xff0c;为了帮大家节省时间&#xff0c;写下SSM快速入门博客 有什么不对的地方还请 私信 或者 评论区 指出 ​只是一个简单的整合项目&#xff0c;让初学者了解一下SSM的大致结构 项目先把框架写好&#xff0c;之后在填写内容 项目压缩包 完整的蓝奏…...

RocketMQ源码本地搭建调试

1 GitHub源码 git clone https://github.com/apache/rocketmq.git导入IDEA&#xff0c;可在命令行执行mvn compile一下&#xff0c;保证源码能够正确编译。本次我使用的master分支的版本-4.8.0。下面我们开始准备启动Namesrv。 2 启动Namesrv 到namesrv模块找到NamesrvStart…...

Axios 二次封装并使用

index.js import axios from "axios";let token localStorage.getItem("token"); // let token "123213"; class Request {// 自定义变量instance;constructor(config) {// console.log(config)// 创建axios 实例&#xff0c;变量接收this.in…...

【SpringCloud】Nacos集群搭建

集群结构图官方给出的Nacos集群图如下&#xff1a;其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。我们接下来要尝试 Nacos集群搭建&#xff0c;效果图如下所示&#xff1a;三个nacos节点的地址&#xff1a;节点ipportnacos1l…...

【CSDN的2022与2023】普普通通的三年,从懵懂、焦虑到坚定、奋进,破除焦虑努力成为更好的自己

大家好&#xff0c;我是黄小黄&#xff01;一名普通的软件工程在读学生。最近终于闲下来了一丢丢&#xff01;借着休息之余&#xff0c;来写一篇年度总结散散心~与其说是年度总结&#xff0c;不如说是给大学生活与莽莽撞撞的自己一个交代叭&#xff01; 这些都是小标题~碎碎念1…...

k8s单机版使用本地存储local-path-provisioner

在k8s单机环境中&#xff0c;我们经常使用本机路径作为持久化存储。在k8s官方文档中有两种方式使用本机存储&#xff0c;一种是hostPath&#xff0c;另一种是local volume&#xff0c;这两种都不支持动态扩容&#xff0c;并且程序移植改动比较大&#xff0c;而local-path-provi…...

MySQL优化(1)执行计划explain中type属性详解

系列文章目录1.初始化测试数据1.初始化表格&#xff08;user表&#xff09;2.初始化表格&#xff08;product表&#xff09;3.初始化表格&#xff08;user表数据初始化&#xff09;4.初始化表格&#xff08;product表函数&#xff09;5.初始化表格&#xff08;product表数据初始…...

servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别

servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别servlet过滤器1.filter过滤器的含义2.filter过滤器的使用3.测试-过滤字符编码正确响应中文编码3.1 创建servlet用于显示中文字符3.2 自定义过滤器3.3 配置web.xml中的servlet映射以及过滤器请求拦截3.4 运行输出…...

Java链表OJ题

目录1. 删除链表中等于给定值val的所有结点2. 逆置单链表3. 链表的中间结点4. 链表中倒数第k个结点5. 将两个有序链表合并为一个新的有序链表6. 以给定值x为基准将链表分割成两部分7. 判断是否为回文链表8. 两个链表的第一个公共结点9. 判断链表中是否有环10. 链表开始入环的第…...

0、Spring工程构建Spring快速入门Spring配置文件详解注入Sprint相关API

1、Spring工程构建 创建工程项目目录文件夹 IDEA选择项目new一个module 配置案例 aop创建 创建并下载完毕后&#xff0c;点击file选择projert 选择按照的jdk版本 output选择当前目录&#xff0c; 点击右下方apply 选择facets&#xff0c;点击""号选择web 选择当前…...

网络原理之HTTP/HTTPS、TCP、IP四层协议栈

文章目录一、应用层&#xff08;一&#xff09;xml协议&#xff08;二&#xff09;json协议&#xff08;三&#xff09;protobuffer协议&#xff08;四&#xff09;HTTP协议1. 抓包工具&#xff0c;fiddler2. HTTP报文格式3. HTTP请求(Request)&#xff08;1&#xff09;URL基本…...

CS61B 2021spring HW0

HW 0: A Java Crash Course 文章目录HW 0: A Java Crash CourseA Basic ProgramCreative Exercise 1a: Drawing a TriangleCreative Exercise 1b: DrawTriangleExercise 2、3Optional: Exercise 4Java可视化orz表达积累参考资料这个hw是optional&#xff0c;然后主要是给至少学…...

自动驾驶环境感知——视觉传感器技术

文章目录1. 摄像头的成像原理1.1 单目视觉传感器的硬件结构1.2 单目视觉的成像原理 –小孔成像模型1.3 单目视觉的成像原理 – 像素坐标系1.4 单目视觉三维坐标系转换 – 外参1.5 单目视觉的坐标系转换 – 从世界坐标点到像素坐标1.6 单目视觉的特性2. 视觉传感器的标定2.1 视觉…...

分享148个ASP源码,总有一款适合您

ASP源码 分享148个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 148个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1e2PvBmXxZA8C3IelkP8ZtQ?pwdj7lp 提取码&#x…...

Java线程的生命周期的五种状态

前面在《有关Java多线程的几个概念》&#xff08;https://blog.csdn.net/helloworldchina/article/details/128753898&#xff09;讲述了Java线程的生命周期的五种状态。在这里再详述一下线程的5种状态。 在java中&#xff0c;任何对象都要有生命周期&#xff0c;线程也一样&a…...

springboot自定义拦截器的简单使用和一个小例子

springboot自定义拦截器的使用1. 自定义拦截器2. 拦截器登录验证的小demo2.1 配置pom.xml2.2 创建User的bean组件2.3 创建需要的表单页面以及登录成功的页面2.4 编写controller映射关系2.5 自定义拦截器类&#xff0c;实现intercepetor接口2.6注册添加拦截器&#xff0c;自定义…...

APT之木马静态免杀

前言 这篇文章主要是记录手动编写代码进行木马免杀&#xff0c;使用工具也可以免杀&#xff0c;只不过太脚本小子了&#xff0c;而且工具的特征也容易被杀软抓到&#xff0c;指不定哪天就用不了了&#xff0c;所以要学一下手动去免杀木马&#xff0c;也方便以后开发一个只属于…...

设计模式 - 创建型模式_抽象工厂模式

文章目录创建型模式概述Case场景模拟工程模拟早期单机Redis的使用Bad ImplBetter Impl &#xff08;抽象⼯⼚模式重构代码&#xff09;定义适配接⼝实现集群适配器接口代理方式的抽象工厂类单元测试小结创建型模式 创建型模式提供创建对象的机制&#xff0c; 能够提升已有代码…...

9、断点调试

文章目录9、断点调试9.1 为什么需要Debug9.2 Debug的步骤1 添加断点2 启动调试3 单步调试工具介绍9.3 多种Debug情况介绍1 行断点2 方法断点3 字段断点4 条件断点5 异常断点6 线程断点7 强制结束9.4 自定义调试数据视图9.5 常见问题【尚硅谷】idea实战教程-讲师&#xff1a;宋红…...

yolo结构介绍

更新中 yolo结构: 这个是针对最早的v5版本1.0进行讲解,现在2022最新版本是V6.2。有一些细节的差别比如Backbone部分Focus倍替换成6*6的Conv,bottleneckCSP替换为C3,Neck部分SPP被替换成SPPF等 Release v1.0 ultralytics/yolov5 (github.com) # parameters nc: 80 # n…...

大数据技术架构(组件)7——Hive:Filter PushDown Cases And Outer Join Behavior

1.2、Filter PushDown Cases And Outer Join Behavior前提:关闭优化器set hive.auto.convertjoinfalse; set hive.cbo.enablefalse;Inner Join:1、Join On中的谓词: 左表下推、右表下推2、Where谓词:左表下推、右表下推-- 第一种情况: join on 谓词 selectt1.user_id,t2.user_i…...

【MySQL】第十二部分 子查询

【MySQL】第十二部分 子查询 文章目录【MySQL】第十二部分 子查询12. 子查询12.1 单行子查询12.2 多行子查询12.3 非相关子查询和相关子查询12.4 EXISTS 与 NOT EXISTS关键字总结12. 子查询 子查询 说白了就是嵌套查询,在一个查询语句中嵌套另外一个查询语句进行内部查询. 子…...

Day08 C++STL入门基础知识五——vector容器(下) 插入删除-数据存取-交换容器-预留空间【全面深度剖析+例题代码展示】

More haste, less speed. 欲速则不达 文章目录1. 承接上文2. 插入操作2.1 函数原型(总括)2.2 尾插尾删2.2.1 操作2.2.2 代码展示2.2.3 测试结果2.3 迭代器插入2.3.1 操作2.3.2 代码展示2.3.3 测试结果2.4 think小思考2.4.1 小疑问2.4.2 思路2.4.3 代码展示2.4.4 测试结果3. 删除…...

打工人必知必会(二)——劳动合同解除

目录 1、劳动合同的解除种类 2、协商解除劳动合同 3、用人单位解除劳动合同 1&#xff09;过错性解除劳动合同 2&#xff09;非过错性解除劳动合同 4、经济性裁员解除劳动合同 5、违法解除劳动合同 6、 劳动者解除劳动合同 提前30日以书面形式通知用人单位 员工即时解…...

《21天学通C++》(第十九章)STL集合类(set和multiset)

为什么需要set和multiset: 1.自动排序&#xff1a; set和multiset会自动按照元素的值进行排序。 2.快速查找&#xff1a; 由于元素是有序的&#xff0c;set和multiset可以提供对元素的快速查找&#xff0c;通常是基于二叉搜索树实现的&#xff0c;查找操作的时间复杂度为O(log …...

[前后端基础]图片传输与异步

前后端之间传递照片 在前后端之间传递照片&#xff0c;通常可以采用以下几种方式&#xff1a; Base64 编码传输&#xff1a;将图片转换为 Base64 编码的字符串&#xff0c;然后通过接口传递到后端&#xff0c;后端再将 Base64 字符串转换回图片格式。这种方式简单易行&#xff…...

【how2j JQuery部分】课后题答案及相关笔记

练习题 <script src"jquery.min.js"></script><script>$(function(){$(tr:odd).css({"background-color":"#f8f8f8"});}); </script> <style> table{border-collapse:collapse;width:90%;} tr{border-bottom-sty…...

力扣:300. 最长递增子序列(Java,动态规划)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中…...

LeetCode面试298,二叉树最长连续序列(Python)

开始想着dfs&#xff0c;两种情况 1.以root为根 2.不以root为根 但是这样需要两个dfs分别进行&#xff0c;那么时间复杂度就上去了。 class Solution:def longestConsecutive(self, root: Optional[TreeNode]) -> int:def dfs(root):# 以root为根节点&#xff0c;可以延…...

JavaScript中的上下文:从生活细节看编程艺术

理解执行上下文 在JavaScript的世界里&#xff0c;上下文是一个既熟悉又陌生的概念。熟悉的是它的名字&#xff0c;陌生的却是它的深邃含义。 很多人会问&#xff0c;什么是上下文&#xff1f;它就像是我们生活的环境&#xff0c;无处不在&#xff0c;却又容易被忽视。 全局执…...

Redis学习4——Redis应用之限流

引言 Redis作为一个内存数据库其读写速度非常快&#xff0c;并且支持原子操作&#xff0c;这使得它非常适合处理频繁的请求&#xff0c;一般情况下&#xff0c;我们会使用Redis作为缓存数据库&#xff0c;但处理做缓存数据库之外&#xff0c;Redis的应用还十分广泛&#xff0c…...

YOLOv8改进CBAM注意力机制

1,CBAM介绍 CBAM(Convolutional Block Attention Module)是一种用于增强卷积神经网络(CNN)性能的注意力机制模块。它由Sanghyun Woo等人在2018年的论文[1807.06521] CBAM: Convolutional Block Attention Module (arxiv.org)中提出。CBAM的主要目标是通过在CNN中引入通道注…...

【C++】C++11--- 列表初始化|关键字

目录 前言 列表初始化 创建对象时的列表初始化 单参数隐式类型转换 多参数的隐式类型转换 new表达式中使用列表初始化 列表初始化适用于STL 容器 模板类initializer_list 关键字auto 关键字decltype 关键字nullptr 前言 C标准10年磨一剑&#xff0c;第二个真正意义上…...

JS_监听dom变化触发,new MutationObserver

MutationObserver 是一个用于监测 DOM 变化的接口&#xff0c;它提供了一种机制来异步观察在特定元素或文档中发生的 DOM 变化。 MutationObserver 的作用包括&#xff1a; 1.监测 DOM 变化&#xff1a;你可以创建一个 MutationObserver 实例&#xff0c;并指定一个回调函数。…...

反射技术介绍以及底层逻辑使用

反射概述&#xff1a; 1.反射是指对于任何一个Class类&#xff0c;在"运行的时候"都可以直接得到这个类全部成分。 2.在运行时,可以直接得到这个类的构造器对象&#xff1a;Constructor 3.在运行时,可以直接得到这个类的成员变量对象&#xff1a;Field 4.在运行时,可…...

Springboot+vue项目人事管理系统

开发语言&#xff1a;Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架:springbootvue JDK版本&#xff1a;jdk1.8 文末获取源码 系统主要分为管理员和普通用户和员工三部分&#xff0c;主要功能包括个人中心&#xff0c;普通用户管理&…...