视觉Transformer(ViT)解析:它们比CNN更好吗?
深入理解计算机视觉任务中突破性架构的工作原理
1. 引言
自从自注意力机制(Self-Attention Mechanism)被引入以来,Transformer模型一直是自然语言处理(NLP)任务的首选。基于自注意力的模型具有高度并行化的特性,并且所需的参数数量大大减少,使其计算效率更高、不易过拟合,并且更容易针对特定领域的任务进行微调 [1]。
此外,与早期的 NLP 处理模型(如 RNN、LSTM、GRU 等)相比,Transformer 的主要优势在于,它能够在处理任意长度的输入序列时保持上下文信息。这是因为自注意力机制可以在不同的时间点关注输入序列的不同部分,并且理解这些部分之间的相互作用 [2]。
正是由于这些特性,Transformer 使得训练具有超大规模参数(超过 1000 亿参数)的语言模型成为可能,从而催生了当前最先进的 NLP 模型,例如GPT(生成式预训练 Transformer)和BERT(双向编码表示 Transformer) [1]。
然而,在**计算机视觉(Computer Vision)**领域,卷积神经网络(CNNs)仍然在大多数(如果不是全部的话)视觉任务中占据主导地位。尽管近年来涌现了越来越多的研究尝试将自注意力机制引入计算机视觉任务,但极少有方法能够在可扩展性方面超越 CNN [3]。
将 Transformer 架构应用于图像处理的主要挑战在于:
Transformer 的自注意力机制的时间复杂度与输入序列的长度呈二次增长(即 O(n²)),如 表 I 所示,并将在 2.1 小节 进一步讨论。
对于 NLP 任务来说,这通常不是问题,因为输入的令牌(token)数量相对较少。例如,一个 1000 词的段落可能只有 1000 个输入 token,即使采用子词单元(sub-word units),令牌数目也不会增加太多。
但在计算机视觉中,图像的 token 数量通常比 NLP 输入序列大得多。例如,一个300 × 300 × 3 的小型图像可能拥有多达 270,000 个 token,如果直接应用自注意力机制,则需要计算一个**包含 72.9 亿个参数(270,000²)**的注意力矩阵,这对计算资源的要求极为苛刻。
表 I:不同层类型的时间复杂度 [2]
因此,大多数研究尝试在计算机视觉任务中使用自注意力架构时,都采用了局部自注意力、结合 CNN 的混合模型,或仅替换 CNN 的部分组件,而不是采用纯 Transformer 结构 [3]。
然而,Alexey Dosovitskiy 等人在他们的研究论文 《An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale》 中提出,完全可以在图像分类任务中全局应用自注意力,并且仅使用基本的 Transformer 编码器架构,不仅可以降低训练所需的计算资源,还可以超越最先进的卷积神经网络(如 ResNet)。
2. Transformer 模型
Transformer 由 Vaswani 等人 于 2017 年 在论文 《Attention is All You Need》 中提出,是一种彻底改变 NLP 和机器学习任务的神经网络架构。其高层架构如 图 1 所示。
图 1. Transformer 结构,左侧为编码器(Encoder),右侧为解码器(Decoder)[2]
自推出以来,Transformer 成为了许多最先进 NLP 模型(如 BERT、GPT 等)的基础。根本上,它们被设计用于处理序列数据,如文本,而不需要使用循环(RNN)或卷积(CNN)层 [2]。
Transformer 之所以能高效处理序列数据,主要依靠自注意力机制(Self-Attention Mechanism)。
2.1 自注意力机制(Self-Attention Mechanism)
自注意力机制的核心功能是:
衡量序列中每个元素与其他元素之间的相关性,并动态调整其重要性权重 [2]。
举个例子,假设我们需要翻译以下句子:
“The animal didn’t cross the street because it was too tired.”
(这只动物没有过马路,因为它太累了。)
这里,“it” 指代的是“the animal” 还是“the street”?
对于人类来说,这个问题很容易回答。但对于计算机来说,识别“it”所指的正确对象是一个复杂的问题。
然而,自注意力机制 使得 Transformer 能够计算句子中每个词相对于其他词的权重,从而正确地将“it” 关联到“animal”,如 图 2 所示 [4]。
图 2. Transformer 第 5 层编码器的自注意力结果,输入单词为 “it”。注意力机制正确地将其关联到 “The Animal” [4]
2.1 自注意力机制(Self-Attention Mechanism)
Transformer 通过并行计算的方式处理输入序列,而不是像 RNN 那样逐步处理。具体来说,它会将输入序列中的每个元素(如单词或图像块)转换为向量表示,并通过自注意力机制计算它们之间的关系。
在 Transformer 编码器中,每个输入元素都会被映射到三个向量:
-
查询(Query, Q)
-
键(Key, K)
-
值(Value, V)
这些向量通过训练可学习的矩阵W_Q、W_K 和 W_V 计算得到:
[ Q = X W_Q, \quad K = X W_K, \quad V = X W_V ]
其中,X 是输入序列的嵌入矩阵,每一行表示一个元素(如单词或图像块)的向量表示。
然后,我们计算查询(Q)与键(K)之间的点积,并除以 K 维度的平方根,以防止梯度消失或梯度爆炸:
[ \text{Attention Score} = \frac{Q K^T}{\sqrt{d_k}} ]
接着,对注意力得分进行 Softmax 归一化,得到注意力权重:
[ \text{Attention Weights} = \text{Softmax} \left(\frac{Q K^T}{\sqrt{d_k}}\right) ]
最后,我们将注意力权重与 V(值矩阵) 相乘,以得到最终的注意力输出 Z:
[ Z = \text{Attention Weights} \times V ]
这个过程的核心思想是:
-
关注输入序列中哪些部分对当前元素最重要
-
根据这些重要性权重调整最终的表示
在 NLP 任务中,这种机制可以帮助 Transformer 识别单词之间的依赖关系,例如 “it” 在句子中指代 “animal” 而不是 “street” [4]。
2.2 多头自注意力(Multi-Headed Self-Attention)
Vaswani 等人在论文 [2] 中进一步提出了多头自注意力(Multi-Headed Self-Attention),如 图 4 所示。
图 4. 多头自注意力机制示意图 [4]
与单个注意力头(Single-Head Attention)相比,多头自注意力有两个主要优势:
-
增强模型的关注能力
-
单个注意力头可能会过度关注某些特定的关系,而忽略其他重要信息。
-
多个注意力头可以并行关注输入序列中的不同部分,从而提高模型的整体理解能力。
-
-
提供多个特征空间的表示
-
由于每个注意力头的权重矩阵(W_Q, W_K, W_V)是独立初始化的,因此不同的注意力头可以捕捉不同的关系。
-
例如,一个头可以关注句法关系,另一个头可以关注语义信息。
-
在实际操作中,每个注意力头会分别计算自己的注意力输出 (Z_i),然后拼接(Concat) 这些输出,并通过一个可学习的权重矩阵 (W_O) 进行变换,以得到最终的多头注意力输出:
[ \text{Multi-Head Attention} = \text{Concat}(Z_1, Z_2, ..., Z_h) W_O ]
其中,(h) 是注意力头的数量。
多头自注意力的这一特性使得 Transformer 在 NLP 任务中表现优越,也为其在计算机视觉任务中的应用奠定了基础。
3. 视觉 Transformer(Vision Transformer, ViT)
视觉 Transformer(ViT) 的核心创新是:
将图像处理为令牌序列,而不是像 CNN 那样按像素网格处理 [3]。
在传统的 CNN 结构中,输入图像会被滑动窗口(Sliding Window) 方式分割成重叠的小块,然后通过多个卷积层和池化层进行处理。
而在 ViT 中,图像被分割为不重叠的块(Patches),然后将这些块作为输入 token 送入 Transformer 编码器,如 图 5 所示。
图 5. 视觉 Transformer(ViT)架构(左)和 Transformer 编码器单元(右)[3]
ViT 的工作流程
-
图像分块(Patch Embedding)
-
输入图像 (X \in \mathbb{R}^{H \times W \times C}) 被划分为多个固定大小的块(Patch),如 (16 \times 16) 像素块。
-
这些块被展平(Flatten)并映射到一个低维向量空间,类似于 NLP 任务中的 词嵌入(Word Embedding)。
-
-
添加位置信息(Positional Embedding)
-
由于 Transformer 不具备 CNN 的平移不变性(Translation Invariance),它无法直接感知图像块的空间位置。
-
为了解决这个问题,ViT 在每个块的向量表示中添加一个可学习的位置编码(Positional Embedding),以保留空间信息。
-
-
Transformer 编码器处理
-
多头自注意力层(Multi-Head Self-Attention)
-
前馈神经网络(Feed-Forward Network, FFN)
-
这些块作为 token 送入多个标准 Transformer 编码器,每个编码器包括:
-
-
分类任务
-
ViT 在输入序列中额外添加一个 CLS(分类)token,类似于 BERT 中的 [CLS] token。
-
Transformer 处理所有 token 后,CLS token 的输出向量被送入MLP 分类器进行最终分类。
-
ViT 的优势
-
更长的全局依赖(Long-Range Dependencies)
-
CNN 依赖于局部感受野(Receptive Field),在低层只能关注局部特征,而 ViT 通过自注意力机制可以直接关注全局信息。
-
-
更好的可扩展性(Scalability)
-
ViT 可以随着数据量的增加不断提高性能,而 CNN 在数据量较小时更具优势,但容易达到性能瓶颈 [3]。
-
下一部分,我们将讨论 ViT 在实际数据集上的实验结果,以及它与 CNN 的对比。
4. 实验结果(The Result)
在论文 [3] 中,作者们将两个最大规模的 Vision Transformer(ViT)模型——ViT-H/14 和 ViT-L/16,与最先进的CNN 模型进行了对比。
实验使用的数据集包括:
-
JFT-300M(一个 Google 内部的大规模数据集)
-
ImageNet(标准图像分类基准数据集)
-
ImageNet-21k(包含 21000 个类别的扩展版 ImageNet)
对比的 CNN 模型包括:
-
Big Transfer(BiT):一种使用大规模 ResNet 进行有监督迁移学习的 CNN 模型。
-
Noisy Student:一种基于 EfficientNet 的 CNN 模型,使用半监督学习进行训练,曾在 ImageNet 上取得最优结果。
所有模型均在 TPUv3 硬件上训练,并记录了所需的计算资源(TPUv3 核心天数)。
4.1 ViT vs CNN:分类任务的比较
表 II 总结了 ViT 与 CNN 在不同数据集上的分类性能:
观察结果:
-
ViT 在所有数据集上均超过了基于 ResNet 的 CNN 模型(BiT 和 Noisy Student)。
-
ViT 需要的计算资源远少于 CNN,例如 ViT-H/14 仅用 256 TPUv3-core-days 即可达到 88.55%,而 Noisy Student 需要 960 TPUv3-core-days。
-
ViT-L/16 在更小的数据集 ImageNet-21k 上也能取得竞争性表现,但仍比 CNN 需要更少的计算资源。
这些结果表明,ViT 在大规模数据集上超越了 CNN,同时计算成本更低。
4.2 预训练数据规模对 ViT 影响
图 6 展示了 ViT 和 BiT(ResNet)在不同规模预训练数据集上的表现(使用 ImageNet Top-1 准确率衡量)。
图 6. ViT 与 BiT 在不同预训练数据集上的性能对比 [3]
关键发现:
-
在小数据集(如 ImageNet)上,ViT 的表现不如 CNN。
-
在中等规模数据集(ImageNet-21k)上,ViT 和 CNN 表现相当。
-
在大规模数据集(JFT-300M)上,ViT 显著超越 CNN。
这表明:
ViT 需要大规模数据集进行预训练,才能真正展现其优势。
当数据量较小时,CNN 的卷积归纳偏置(Convolutional Inductive Bias) 使其能够更有效地学习特征,而 ViT 则更容易过拟合。
4.3 数据规模 vs 过拟合趋势
研究人员进一步分析了 ViT 和 ResNet 在不同规模的数据集上的过拟合程度。
他们在 JFT 数据集中随机抽取不同规模的子集(9M、30M、90M 和 300M),并训练 ViT 和 CNN,然后比较它们在测试集上的表现,如 图 7 所示。
图 7. ViT vs ResNet 在不同规模数据集上的泛化能力 [3]
观察结果:
-
在小数据集(9M, 30M)上,ViT 比 ResNet 更容易过拟合。
-
ResNet 在小数据集上表现更稳健,但在数据量增加后,性能增长变缓(趋于饱和)。
-
ViT 在大数据集上显著超越 ResNet,因为它能够学习到更复杂的全局模式和特征。
研究结论:
CNN 在小数据集上具有更好的归纳偏置(Inductive Bias),但 ViT 在大规模数据集上更具优势。
这意味着,如果数据量不足,ViT 可能不会比 CNN 更好,但在大规模数据下,ViT 可以学习到比 CNN 更强的特征表示。
4.4 计算资源 vs 迁移能力
研究人员还比较了 ViT 和 CNN 在相同计算预算下的性能(单位:ExaFLOPs)。
图 8 显示了不同模型在 JFT-300M 预训练后的迁移性能:
图 8. 计算预算 vs 迁移性能 [3]
关键发现:
-
ViT 在相同计算预算下,比 ResNet 效率更高。
-
ViT 仅需 2-4 倍更少的计算量即可达到与 ResNet 相同的性能。
-
混合模型(Hybrid ViT + CNN)在小型模型上有优势,但在大模型上优势消失。
这表明:
ViT 比 CNN 计算效率更高,尤其是当计算资源有限时,ViT 能够在更短时间内达到更好的性能。
5. ViT 的局限性与未来发展
尽管 ViT 在大规模数据集上的表现优越,但它仍然存在一些局限性:
5.1 ViT 的局限性
-
需要大规模数据才能发挥优势
-
ViT 在小数据集上表现不如 CNN,因为 CNN 具有更强的归纳偏置(Inductive Bias),能更有效地学习局部特征,而 ViT 需要大量数据来学习全局模式。
-
-
缺乏空间归纳偏置
-
CNN 通过卷积操作天然捕捉图像的局部空间信息,而 ViT 需要额外的位置编码(Positional Embedding) 解决这个问题,可能导致 ViT 在目标检测、语义分割等任务上不如 CNN。
-
-
预训练模型较少
-
目前 CNN 具有大量经过优化的预训练模型(如 ResNet, EfficientNet),可以直接用于小型数据集的迁移学习。
-
ViT 仍然缺乏足够多的高质量预训练权重,限制了其在工业应用中的普及。
-
5.2 ViT 的未来发展方向
-
更高效的 ViT 变体
-
研究者们正在探索更小、更高效的 ViT 结构,如 Swin Transformer、DeiT(Data-Efficient Image Transformer),以降低计算成本。
-
-
结合 CNN 的混合模型
-
未来可能会出现ViT + CNN 结合的混合架构,利用 CNN 提取局部特征,ViT 处理全局依赖。
-
-
扩展到其他计算机视觉任务
-
目前 ViT 主要应用于图像分类,未来可能会探索目标检测、语义分割、视频分析等任务。
-
总结:ViT 是计算机视觉的未来吗?
✅ 在大规模数据集上,ViT 比 CNN 更强大
✅ ViT 计算效率更高,适合大规模训练
❌ ViT 需要大量数据,在小数据集上不如 CNN
❌ ViT 仍然缺乏良好的空间归纳偏置
ViT 未来仍需要改进,但它无疑为计算机视觉的未来打开了新的大门!🚀
参考文献
-
N. Pogeant, “Transformers - the NLP revolution,” Medium, https://medium.com/mlearning-ai/transformers-the-nlp-revolution-5c3b6123cfb4 (accessed Sep. 23, 2023).
-
A. Vaswani, et. al. “Attention is all you need.” NIPS 2017.
-
A. Dosovitskiy, et. al. “An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale,” ICLR 2021.
-
X. Wang, G. Chen, G. Qian, P. Gao, X.-Y. Wei, Y. Wang, Y. Tian, and W. Gao, “Large-scale multi-modal pre-trained models: A comprehensive survey,” Machine Intelligence Research, vol. 20, no. 4, pp. 447–482, 2023, doi: 10.1007/s11633-022-1410-8.
-
H. Wang, “Addressing Syntax-Based Semantic Complementation: Incorporating Entity and Soft Dependency Constraints into Metonymy Resolution”, Scientific Figure on ResearchGate. Available from: https://www.researchgate.net/figure/Attention-matrix-visualization-a-weights-in-BERT-Encoding-Unit-Entity-BERT-b_fig5_359215965 [accessed 24 Sep, 2023]
-
A. Krizhevsky, et. al. “ImageNet Classification with Deep Convolutional Neural Networks,” NIPS 2012.
-
C. Sun, et. al. “Revisiting Unreasonable Effectiveness of Data in Deep Learning Era,” Google Research, ICCV 2017.
相关文章:
视觉Transformer(ViT)解析:它们比CNN更好吗?
深入理解计算机视觉任务中突破性架构的工作原理 1. 引言 自从自注意力机制(Self-Attention Mechanism)被引入以来,Transformer模型一直是自然语言处理(NLP)任务的首选。基于自注意力的模型具有高度并行化的特性&…...
rustup-init.exe 安装缓慢的解决办法
首先在rust官网下载安装程序,官网下载的 rustup-init.exe 下载慢,安装慢,或者直接卡死。 下载安装程序在本地,使用国内镜像加速 Rust 更新与下载。 使用国内镜像源:在 rustup-init.exe 程序文件夹下使用 PowerShell 中…...
动规【力扣】72. 编辑距离
数组含义: dp[i][j]含义是word1的i长度字符串和word2的j长度字符串所需的最少编辑距离。 递推公式: 1.当word1.charAt(i-1)word2.charAt(j-1)时,不用做任何操作,所以dp[i][j] dp[i-1][j-1]; 2.当word1.charAt(i-1)&a…...
获取哔站评论
一、文章立论 哔哩哔哩(B站)是当前年轻人十分喜爱的视频分享平台,以其丰富多样的内容、互动性强的社区氛围以及独特的弹幕文化深受用户喜爱。在该平台上,用户不仅可以观看各种类型的视频,如动画、游戏、科技、生活、影…...
LeetCode 链表章节
简单 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2…...
JavaScript实现倒计时函数
函数代码 /*** 倒计时* param {function} callback 回调函数,参数为当前剩余时间(time)* param {number} count 倒计时开始时间(s)* param {number} interval 间隔时间(ms)*/ function countDown(callback, count 60, interval 1000) {callback(count);const sta…...
Spring Boot全局异常处理:“危机公关”团队
目录 一、全局异常处理的作用二、Spring Boot 实现全局异常处理(附上代码实例)三、总结: 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢…...
Vue 调用摄像头扫描条码
以下是一个基于 Vue.js 的页面代码示例,用于调用摄像头并扫描条码。我们将使用 jsQR 库来解析二维码(或条形码),这是一个轻量级的 JavaScript 库。 实现步骤: 安装依赖:需要引入 jsQR 库。调用摄像头&…...
springboot3.x下集成hsqldb数据库
springboot3.x下集成hsqldb数据库 本文使用目前最新的sringboot3.4.3 和HyperSQL 2.7.4演示 HSQLDB数据库简介 HSQLDB(HyperSQL DataBase)是一个开放源代码的JAVA数据库。 可以透过 jdbc driver 来存取, 支持 ANSI-92 标准的 SQL 语法, 而且他占的空…...
网络流算法: Edmonds-Karp算法
图论相关帖子 基本概念图的表示: 邻接矩阵和邻接表图的遍历: 深度优先与广度优先拓扑排序图的最短路径:Dijkstra算法和Bellman-Ford算法最小生成树二分图多源最短路径强连通分量欧拉回路和汉密尔顿回路网络流算法: Edmonds-Karp算法网络流算法: Dinic算法 环境要求 本文所用…...
ArcGIS Pro可见性分析:精通地形视线与视域分析
在地理信息系统(GIS)的广泛应用中,可见性分析作为一项关键技术,发挥着不可替代的作用。 无论是城市规划、环境监测,还是军事侦察、景观设计,可见性分析都能提供精确的数据支持,帮助我们更好地理…...
jenkens使用笔记
jenkens使用笔记 笔记使用版本是2.492.1 git仓库ssh证书配置 已开始配置一直不行,然后下载插件,多次重启等一些列操作, 后来配置就可以工作了,原因不祥,不知道哪个配置起效了。 等回来闹明白了,再补充笔记…...
解决跨域请求的问题(CORS)
目录 解决跨域请求问题的方法 1. 服务器端配置响应头 2. JSONP(JSON with Padding) 3. 代理服务器 场景示例 前端代码(使用 Fetch API) 后端代码(使用 Node.js Express 并设置 CORS 响应头) 跨域资…...
未来经济范式争夺战:AR眼镜为何成为下一代交互终端的制高点?
未来经济范式争夺战:AR眼镜为何成为下一代交互终端的制高点? 在蒸汽机轰鸣的工业革命时代,煤炭、铁路、电报构建了第一个现代经济范式;互联网时代,电力、光纤、物流网络重构了全球经济版图。当前,我们正站…...
CentOS 7 安装Nginx-1.26.3
无论安装啥工具、首先认准了就是官网。Nginx Nginx官网下载安装包 Windows下载: http://nginx.org/download/nginx-1.26.3.zipLinxu下载 wget http://nginx.org/download/nginx-1.26.3.tar.gzLinux安装Nginx-1.26.3 安装之前先安装Nginx依赖包、自行选择 yum -y i…...
基于opencv消除图片马赛克
以下是一个基于Python的图片马赛克消除函数实现,结合了图像处理和深度学习方法。由于马赛克消除涉及复杂的图像重建任务,建议根据实际需求选择合适的方法: import cv2 import numpy as np from PIL import Imagedef remove_mosaic(image_pat…...
MongoDB Compass中MONGOSH常用查询整理
MongoDB Compass中MONGOSH常用查询整理 选择数据库基本的查找指令find() 方法findOne() 方法 高级查询条件比较操作符逻辑操作符投影操作排序操作限制和跳过操作limit() 方法skip() 方法 正则表达式查询数组查询 MongoDB Compass 是一款可视化的 MongoDB 数据库管理工具&#x…...
SSM笔记
一、获取对象 Scop 单例在容器启动时就直接创建,如果不希望这样,那就使用Lazy懒加载,只能在单例模式下 3、4不常用 FactoryBean创建 对象 创建对象比较复杂时,可以实现创建一个类实现FactoryBean,实现3个方法来创建…...
5G学习笔记之BWP
我们只会经历一种人生,我们选择的人生。 参考:《5G NR标准》、《5G无线系统指南:如微见著,赋能数字化时代》 目录 1. 概述2. BWP频域位置3. 初始与专用BWP4. 默认BWP5. 切换BWP 1. 概述 在LTE的设计中,默认所有终端均能处理最大2…...
MongoDB Chunks核心概念与机制
1. 基础定义 Chunk(块):MongoDB分片集群中数据的逻辑存储单元,由一组连续的片键(Shard Key)范围数据组成,默认大小为64MB(可调整范围为1-1024MB)。数据分…...
el-table 手动选择展示列
需求: 由于表格的列过多,用滚动条进行滚动对比数据不方便,所以提出,手动选择展示列 实现思路: 表格默认展示所有字段,每个字段通过 v-if 属性来进行判断是否显示;点击设置按钮图标(表格右上角࿰…...
Netty笔记3:NIO编程
Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8…...
LeetCode Hot 100
1.两数之和 暴力解法:时间/空间复杂度 O(N),O(1) class Solution {public int[] twoSum(int[] nums, int target) {for(int i0;i<nums.length;i){for(int ji1;j<nums.length;j){if(nums[i] nums[j] target){return new int[]{i,j};}}}return new int[0];}…...
Vue.js 学习笔记
文章目录 前言一、Vue.js 基础概念1.1 Vue.js 简介1.2 Vue.js 的特点1.3 Vue.js 基础示例 二、Vue.js 常用指令2.1 双向数据绑定(v-model)2.2 条件渲染(v-if 和 v-show)2.3 列表渲染(v-for)2.4 事件处理&am…...
MySQL表连接详解
MySQL表连接详解 在 MySQL 中,表连接(Join)用于将多个表中的数据组合在一起,基于它们之间的关系进行查询。常见的表连接类型包括内连接、左连接、右连接和全外连接。以下是这些连接类型的详细说明: 1. 内连接&#x…...
【JAVA】ThreadPoolTaskExecutor 线程池学习、后端异步、高并发处理
ThreadPoolTaskExecutor 是 Spring 框架提供的一个线程池实现类,基于 Java 原生的 ThreadPoolExecutor 进行了封装和扩展,支持更灵活的配置,并与 Spring 的依赖注入、生命周期管理等功能无缝集成。它常用于异步任务处理、定时任务调度和高并发…...
PPT 小黑第38套
对应大猫40 幻灯片母板-最后一页-重命名为奇数页 奇偶页-点中标题-形状格式-形状填充-青色 最后一页页码左对齐 更换幻灯片背景:设计-设置背景格式-图片填充 【开始】-段落居中,对齐文本-中部对齐,排列-对齐-底端,-再水平居中…...
安卓开发相机功能
相机功能 安卓中的相机调用功能也经历了很多的方案升级,目前可选的官方方案是CameraX、Camera2、Camera(废弃),还有一些第三方免费或者是付费的相机库。对于大多数开发者,建议使用 CameraX。 CameraX CameraX 是 An…...
宝塔找不到php扩展swoole,服务器编译安装
1. 在php7.4中安装swoole,但找不到这个扩展安装 2. 服务器下载源码解压安装 http://pecl.php.net/package/swoole 下载4.8.0版本 解压到/www/server/php/74/下 3. 发现报错问题; 更新一下依赖 yum update yum -y install gcc gcc-c autoconf libjpe…...
Spring Web MVC
前言 今天来复习 Spring Web MVC 框架。它提供了一套高效、便捷的方式来构建 Web 应用程序。今天,就让我们一同深入 Spring Web MVC,从基础概念到实际应用,好好补补. 一、Spring Web MVC 是什么? 官方定义解读 根据官方描述&…...
蓝桥杯备考:动态规划线性dp之下楼梯问题进阶版
老规矩,按照dp题的顺序 step1 定义状态表达 f[i]表示到第i个台阶的方案数 step2:推导状态方程 step3:初始化 初始化要保证 1.数组不越界 2.推导结果正确 如图这种情况就越界了,我们如果把1到k的值全初始化也不现实,会增加程序的时间复杂度…...
机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】
目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具,便于在客户端软件中…...
UDP透传程序
UDP透传程序 本脚本用于在 设备 A 和 设备 B 之间建立 UDP 数据转发桥梁,适用于 A 和 B 设备无法直接通信的情况。 流程: A --> 电脑 (中继) --> B B --> 电脑 (中继) --> A 需要修改参数: B_IP “192.168.1.123” # 设备 B 的…...
【USRP】NVIDIA Sionna:用于 6G 物理层研究的开源库
目录 Sionna:用于 6G 物理层研究的开源库主要特点实现6G研究的民主化支持 5G、6G 等模块化、可扩展、可伸缩快速启动您的研究 好处原生人工智能支持综合研究平台开放生态系统 安装笔记使用 pip 安装基于Docker的安装从源代码安装“你好世界!”探索锡奥纳…...
Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事项
以下是修改后的完整文档,包含在多个多线程环境中使用 retain() 和 release() 方法的示例,且确保在 finally 块中调用 release(): 在 Spring WebFlux 中,WebSocketMessage 主要用于表示 WebSocket 的消息载体,其中 getP…...
SQL经典常用查询语句
1. 基础查询语句 1.1 查询表中所有数据 在SQL中,查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句,可以获取指定表中的所有记录和列。例如,假设有一个名为employees的表,包含员工的基本信息…...
0005__PyTorch 教程
PyTorch 教程 | 菜鸟教程 离线包:torch-1.13.1cpu-cp39-cp39-win_amd64.whl https://download.pytorch.org/whl/torch_stable.html...
高并发场景下的数据库优化
在高并发系统中,数据库通常是性能瓶颈。面对高并发请求,我们需要采用合适的优化策略,以保证数据库的稳定性和高效性。本文将介绍数据库高并发问题的成因,并结合 Mybatis-Plus,探讨 乐观锁、悲观锁、高并发优化及数据库…...
Linux:同步
目录 一、同步概念 条件变量 二、生产者消费者模型 三、环形队列 一、同步概念 互斥用来解决 访问临界资源 的非原子性,通俗来说,由于互斥锁的实现,保证了在用户角度看,同一个时间内访问临界资源的代码只有一个线程在执行。 而…...
GB28181开发--ZLMediaKit+WVP+Jessibuca
一、核心组件功能 1、ZLMediaKit 定位:基于 C++11 的高性能流媒体服务框架,支持 RTSP/RTMP/HLS/HTTP-FLV 等协议互转,具备低延迟(最低 100ms)、高并发(单机 10W 级连接)特性,适用于商用级流媒体服务器部署。 特性:跨平台(Linux/Windows/ARM 等)、支持 …...
23种设计模式之《备忘录模式(Memento)》在c#中的应用及理解
程序设计中的主要设计模式通常分为三大类,共23种: 1. 创建型模式(Creational Patterns) 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 工厂方法模式࿰…...
Oracle删除重复数据保留其中一条
Oracle删除重复数据保留其中一条 在Oracle数据库中,要删除重复数据并保留其中一条记录,可以使用多种方法。这里介绍两种常见的方法:使用ROWID或使用ROW_NUMBER()窗口函数。 方法1:使用ROWID ROWID是Oracle中用来唯一标识表中每…...
deepseek助力运维和监控自动化
将DeepSeek与Agent、工作流及Agent编排技术结合,可实现IT运维与监控的智能化闭环管理。以下是具体应用框架和场景示例: 一、智能Agent体系设计 多模态感知Agent 日志解析Agent:基于DeepSeek的NLP能力,实时解析系统日志中的语义&a…...
16.1STM32_ADC
STM32_ADC 数字信号分为高/低电平两种状态 模拟信号就是任意的电压值 STM32芯片内就是一整套的数字逻辑电路,来实现我们的程序执行,以及各种各样的外设功能, ADC(模拟-数字转换技术)的功能就是将模拟信号转化为数字…...
神经网络 - 激活函数(Swish函数、GELU函数)
一、Swish 函数 Swish 函数是一种较新的激活函数,由 Ramachandran 等人在 2017 年提出,其数学表达式通常为 其中 σ(x) 是 Sigmoid 函数(Logistic 函数)。 如何理解 Swish 函数 自门控特性 Swish 函数可以看作是对输入 x 进行“…...
VS2015 c++和cmake配置编程
Visual Studio 2015:确保安装了C开发工具,并安装“使用C的桌面开发”工作负载。CMake:可以从 CMake官网 下载并安装,并将其添加到系统环境变量中。vs加载项目启动Visual Studio。选择“继续但无代码”。点击“文件”。选择 “打开…...
如何为 Web 前端开发面试做好准备
大家好!我是 [数擎AI],一位热爱探索新技术的前端开发者,在这里分享前端和Web3D、AI技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | AI 应…...
深入探索像ChatGPT这样的大语言模型
参考 【必看珍藏】2月6日,安德烈卡帕西最新AI普及课:深入探索像ChatGPT这样的大语言模型|Andrej Karpathy fineweb知乎翻译介绍 fineweb-v1原始连接 fineweb中文翻译版本 Chinese Fineweb Edu数据集 查看网络的内部结果,可以参…...
代码贴——堆(二叉树)数据结构
头文件Heap.h #pragma once #include<bits/stdc.h> typedef int HPDataType;typedef struct Heap {HPDataType* a;int size;int capacity; }HP;void HPInit(HP* php); void HPDestory(HP* php); //出入后保持数据是堆 void HPPush(HP* php,HPDataType x); HPDataType HP…...
office或者word排版中,复制/黏贴进来文字不会自动换行,如何处理?
李升伟 整理 一、思考与分析 在Office或Word中复制粘贴文字时,文字不会自动换行,需要处理这个问题。首先,我得回想一下常见的原因和解决方法。可能的情况有很多,比如文本带有硬回车、段落格式设置问题,或者文本框的自…...