万字长文解读深度学习——多模态模型BLIP2
🌺历史文章列表🌺
深度学习——优化算法、激活函数、归一化、正则化
深度学习——权重初始化、评估指标、梯度消失和梯度爆炸
深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总
万字长文解读深度学习——卷积神经网络CNN
万字长文解读深度学习——循环神经网络RNN、LSTM、GRU、Bi-RNN
万字长文解读深度学习——Transformer
深度学习——3种常见的Transformer位置编码【sin/cos、基于频率的二维位置编码(2D Frequency Embeddings)、RoPE】
万字长文解读深度学习——GPT、BERT、T5
万字长文解读深度学习——ViT、ViLT、DiT
DiT(Diffusion Transformer)详解——AIGC时代的新宠儿
万字长文解读深度学习——CLIP、BLIP
万字长文解读深度学习——AE、VAE
万字长文解读深度学习——GAN
万字长文解读深度学习——训练、优化、部署细节
推荐阅读:
BLIP2-图像文本预训练论文解读
【多模态】BLIP-2模型技术学习
文章目录
- 回顾BLIP
- BLIP的问题及BLIP2的优化
- 1. 模块化架构设计
- 2. 引入 Q-Former 模块
- 3. 分阶段训练策略
- 4. 减少计算开销
- BLIP2
- 架构
- 表征学习阶段 Representation Learning Stage
- 生成式预训练阶段 Generative Pre-training Stage
回顾BLIP
论文:BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
BLIP 是旨在改进图像-文本联合学习的效率多模态模型,特别是通过生成任务和对比学习结合的方式,在低监督甚至无监督情况下提升模型性能。BLIP 的创新点在于它通过多任务预训练和自引导学习(bootstrapping)机制,能够以更少的数据达到更好的性能表现。
BLIP 的架构设计包含图像编码器、文本编码器、视觉文本编码器、视觉文本解码器。它结合了对比学习和生成式任务,以自引导的方式提升模型性能。
BLIP的问题及BLIP2的优化
在 BLIP 的基础上,BLIP2 进行了以下几项主要优化,这些优化显著提升了模型的性能、计算效率和适配性:
1. 模块化架构设计
- BLIP 的问题:
- BLIP 的图像编码器、文本编码器、视觉文本编码器和解码器之间的紧密耦合关系,是造成训练成本高、灵活性不足的重要原因。
- BLIP 的架构限制了视觉编码器和语言模型的选择,适配性不足。
- BLIP2 的优化:
- 采用模块化设计,将模型分为三个模块:
- 视觉编码器(Image Encoder):用于提取图像的底层视觉特征(支持复用已有的预训练视觉模型,如 CLIP 或 ViT)。
- Q-Former(Querying Transformer):用于从视觉特征中提取与语言相关的多模态嵌入。
- 预训练语言模型(LLM, Large Language Model):用于处理生成任务,如文本生成或问答任务。
- 模块化设计使得 BLIP2 可以复用现有的强大视觉模型(如 CLIP、ViT)和语言模型(如 GPT、OPT),无需端到端联合训练,大大降低了开发和训练成本。
- 采用模块化设计,将模型分为三个模块:
2. 引入 Q-Former 模块
- BLIP 的问题:
- BLIP 直接将视觉特征与语言模型对接,特征提取过程可能包含冗余信息,导致对齐效率较低。
- BLIP2 的优化:
- 引入了 Q-Former,这是一个轻量级的变换器模块,用于从视觉特征中提取与语言模态相关的嵌入表示:
- 用于从视觉编码器生成的高维视觉特征中提取与语言模态相关的低维嵌入表示,从而实现高效的图像-文本对齐。
- Q-Former 的加入显著提升了图像-文本对齐的效果,同时减少了计算负担。
- 引入了 Q-Former,这是一个轻量级的变换器模块,用于从视觉特征中提取与语言模态相关的嵌入表示:
3. 分阶段训练策略
- BLIP 的问题:
- BLIP 需要联合训练四个组件,优化难度大,训练时间长,硬件需求高。
- BLIP2 的优化:
- 分阶段训练策略:
- 第一阶段:图像-语言对齐:
- 使用视觉编码器和Q-Former。但是冻结视觉编码器的权重(如 CLIP 或 ViT 的预训练模型),仅训练 Q-Former 模块,通过对比学习和图文匹配任务优化视觉-语言的对齐表示。
- 训练 Q-Former 模块,让其能够从视觉编码器生成的高维特征中提取与语言模态相关的信息。实现视觉模态和语言模态的对齐,构建统一的多模态嵌入表示。
- 第二阶段:文本生成任务:
- 使用Q-Former和将预训练语言模型。但是冻结的预训练语言模型(如 GPT 或 OPT),仅训练 Q-Former 来适应生成任务。
- 使用 Q-Former 提取的多模态嵌入作为语言模型的输入,适配预训练语言模型(如 GPT、OPT 等)进行文本生成任务。
- 第一阶段:图像-语言对齐:
- 这种策略避免了对大型语言模型的联合训练,显著降低了训练成本。
- 分阶段训练策略:
4. 减少计算开销
- BLIP 的问题:
- 计算成本高,特别是在需要训练大型语言模型时,对硬件资源需求较高。
- BLIP2 的优化:
- 通过模块化设计和冻结预训练模型参数,计算需求集中在轻量级的 Q-Former 模块上,减少了大规模计算开销。
- 与 BLIP 相比,BLIP2 的训练速度更快,资源需求更低,适合在资源有限的环境中使用。
BLIP2
论文:BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models
上一节已经给出了问题及其解决方案,下面将介绍详细的实现。其改进主要体现在在架构和训练过程的优化。
架构
BLIP本质上是在训练一个全新的视觉-语言模型,该过程成本大。为了解决这个问题,本文提出的方法是基于现有高质量视觉模型(frozen冻结)及语言大模型(frozen冻结)进行联合训练,同时为减少计算量及防止遗忘,论文对预训练模型进行frozen。为了实现视觉和语言的对齐,作者提出Querying Transformer (Q- Former) 预训练。
模型的架构实现为·冻结的预训练图像编码器 + Q-Former + 冻结的预训练大型语言模型
,如下图:
图 1. BLIP-2 框架概述:我们通过预训练一个轻量级的查询变换器(Querying Transformer),采用两阶段策略来弥合模态间的差距。第一阶段从冻结的图像编码器中引导视觉-语言表征学习【论文中图2】。第二阶段从冻结的大型语言模型(LLM)中引导视觉到语言的生成式学习【论文中图3】,从而实现零样本的指令化图像到文本生成(更多示例请参见图 4)。
Q-Former的核心结构如下:
Q-Former 是 BLIP-2 中用于视觉-语言交互的核心部分。它用于视觉输入(图像)和语言输入(文本)之间的相互理解和转换。图中将其分成了两个部分:图像 Transformer(左半部分)和文本 Transformer(右半部分),它们共享相同自注意力层self attention,使用 B E R T b a s e BERT_{base} BERTbase的预训练权重初始化QFormer,并且随机初始化交叉注意层。Q-Former总共包含1.88亿个参数。
Learned Queries被视为模型参数。在我们的实验中,我们使用了32个查询,其中每个查询具有768维(与Q-Former的隐藏维相同)。我们使用Z来表示输出查询表示。Z的大小(32 × 768)远小于冻结图像特征的大小(例如,ViT-L/14的大小为257 × 1024)。这种瓶颈结构与我们的预训练目标一起工作,迫使查询提取与文本最相关的视觉信息。
-
图像 Transformer(左半部分)红框:
- 图像 Transformer 负责与Frozen Image Encoder交互,融合Learned Queries和Input Image中的信息,提取图像特征,
-
文本 Transformer(右半部分)绿框:
- 文本 Transformer 主要用于处理输入的文本信息(Learned Queries和Input Text)。它既可以作为一个文本编码器,也可以作为文本解码器,用来生成或理解图像相关的文本内容。
在上图中,有三个输入,分别是Learned Queries、Input Image 和 Input Text 是三个重要的组成部分,它们在 Q-Former 模块中共同作用,进行图像-文本融合和交互。下面是它们的详细解释:
-
Learned Queries (学习到的查询)
-
Learned Queries 是 Q-Former 中的一种机制,指的是模型通过训练学习得到的一组“查询向量”。这些查询向量用于从图像和文本中提取信息,帮助模型聚焦于最相关的部分。它们是一个动态学习的参数,在训练过程中更新和优化,以便更好地捕捉图像和文本之间的关系。
-
在 BLIP-2 中,Learned Queries 主要通过交互式方式提取图像和文本的交叉信息。它们在图像和文本的交互过程中充当“桥梁”,帮助模型理解图像和文本之间的关联。
-
作用:在 Q-Former 中,Learned Queries 的作用是引导图像和文本信息的融合,并决定哪些信息是最重要的。它们帮助 Q-Former 精确地匹配图像和文本,从而生成更准确的描述或进行正确的推理。
-
-
Input Image (输入图像)
-
Input Image 是 BLIP-2 模型中的输入之一,指的是输入给模型的原始图像数据。这些图像数据会通过 Frozen Image Encoder(一个预训练的图像编码器)进行编码,转换为高维的视觉特征表示。
-
在 Q-Former 中,图像通过编码器转换为一个固定的特征表示,然后与 Learned Queries 和 Input Text 进行交互。这些图像特征是图像和文本匹配任务的基础,帮助模型理解图像的内容。
-
作用:图像输入提供了模型所需的视觉信息,帮助模型理解并生成与图像相关的文本描述或回答相关问题。
-
-
Input Text (输入文本)
-
Input Text 是 BLIP-2 模型的另一个输入,指的是输入给模型的文本数据。通常,这个文本数据是描述图像的文字信息。这些文字数据会通过 Frozen Text Encoder(一个预训练的文本编码器)进行编码,转换为低维的文本特征表示。
-
在 Q-Former 中,文本会经过 Text Encoder(文本编码器)处理,转化为文本的表示。文本与图像的特征表示通过 Learned Queries 相互作用,共同生成最终的输出(如图像描述、问题答案等)。
-
作用:文本输入提供了模型所需的语言信息,帮助模型理解和生成与图像相关的语言输出。通过与图像特征的融合,文本输入使得模型能够在视觉-语言任务中进行推理和生成。
-
表征学习阶段 Representation Learning Stage
表征学习阶段【冻结的预训练图像编码器 + Q-Former】,在冻结的图像编码器中引导视觉-语言表征学习。使用图像-文本对进行预训练,目标是训练Q-Former,使得查询可以学习提取最能提供文本信息的视觉表示。
预训练过程如下图:
图 2. (左)Q-Former 和 BLIP-2 第一阶段视觉-语言表示学习目标的模型架构。我们联合优化了三个目标,这些目标通过一组可学习的嵌入(queries)来提取与文本最相关的视觉表示。(右)针对每个目标的自注意力掩码策略,用于控制查询与文本的交互。
-
左图(Q-Former 和 BLIP-2 第一阶段的模型架构),上图红框:
- 输入图像通过 冻结的Image Encoder(图像编码器) 提取初始视觉特征。
- 视觉特征与一组可学习的查询(Learned Queries,作为嵌入)通过 Q-Former 模块交互(可学习的查询通过 自注意力(Self Attention) 层相互作用,并且通过 交叉注意力(Cross Attention) 层与frozen图像特征相互作用)。
- 和BLIP一样,BLIP2使用3个目标函数来训练模型,并且它们共享相同的输入格式和模型参数。每个目标函数通过不同的注意力掩码(attention mask)策略来控制查询和文本的交互和影响。
- 模型目标分为三个子任务:
- 图像文本对比学习(ITC)——在隐空间对齐图片编码和文本编码
- 图文匹配(ITM)——二分类任务,让模型判断图文是否一致
- 基于图像文本生成(ITG)——下一词预测,让模型学会给定图片输出caption
-
右图(注意力掩码策略):
- 描绘了 Q-Former 不同任务的注意力掩码机制,用于控制查询和文本的交互模式:
- 双向自注意力掩码(Bi-directional Self-Attention Mask):
- 用于图像-文本匹配任务(Image-Text Matching)。
- 允许查询和文本令牌之间的全连接交互。
- 多模态因果自注意力掩码(Multi-modal Causal Self-Attention Mask):
- 用于基于图像的文本生成任务(Image-Grounded Text Generation)。
- 查询令牌可以访问文本令牌(包括过去和当前),但文本令牌仅关注其过去的令牌,保证生成的因果性。
- 单模态自注意力掩码(Uni-modal Self-Attention Mask):
- 用于图像-文本对比学习任务(Image-Text Contrastive Learning)。
- 查询令牌与文本令牌的交互被掩盖,仅进行单模态内部的学习。
- 双向自注意力掩码(Bi-directional Self-Attention Mask):
- 描绘了 Q-Former 不同任务的注意力掩码机制,用于控制查询和文本的交互模式:
论文中实验了两种预训练图像编码器:
- ViT-L/14 from CLIP
- ViT-G/14 from EVA-CLIP
生成式预训练阶段 Generative Pre-training Stage
这个阶段使用【Q-Former + 冻结的预训练大型语言模型】,在冻结的预训练大型语言模型中引导视觉到语言的生成式学习。经过第一阶段的预训练,Q-Former有效地充当了信息瓶颈,将最有用的信息提供给LLM,同时删除不相关的视觉信息。这减少了LLM学习视觉语言对齐的负担,从而减轻了灾难性的遗忘问题。
预训练过程如下如下图:
图 3. BLIP-2 的第二阶段视觉到语言生成预训练: 从冻结的大型语言模型(LLMs)中引导生成能力。顶部:从基于解码器的大型语言模型(例如 OPT)中引导。 底部:从基于编码器-解码器的大型语言模型(例如 FlanT5)中引导。 全连接层的作用是将 Q-Former 的输出维度调整为所选语言模型的输入维度。
论文中实验了两种LLM:
- 无监督训练的OPT作为Decoder-based LLM,使用语言建模损失(language modeling loss)进行预训练,冻结的 LLM 的任务是根据 Q-Former 的视觉表示生成文本,也就是说直接根据图像生成文本;
- 基于指令训练的FlanT5作为Encoder-Decoder-based LLM,使用前缀语言建模损失进行预训练(prefix language modeling loss)预训练,将文本分成两部分,前缀文本perfix test与视觉表示连接起来作为 LLM 编码器的输入,后缀文本用作 LLM 解码器的生成目标,也就是说根据前缀文本+图像生成后缀连续的文本。
无监督训练的 OPT 作为 Decoder-based LLM:
- OPT(Open Pre-trained Transformer) 是一种基于解码器的语言模型,通常用于自回归文本生成任务。在 BLIP-2 中,OPT 作为解码器使用,结合 Q-Former的视觉表示来生成文本。
- 训练方式:OPT 使用 语言建模损失(language modeling loss)进行无监督训练。语言建模损失的目标是预测文本序列中的下一个词,典型的任务是让模型根据已有的文本预测下一个词或字符。在 BLIP-2中,任务是让 OPT 根据输入的视觉表示(来自 Q-Former 的输出)生成与图像相关的文本。
OPT作为解码器,它根据视觉输入生成完整的文本描述,进行 图像到文本的生成。适合用于 图像到文本的直接生成 任务。基于指令训练的 FlanT5 作为 Encoder-Decoder-based LLM:
- FlanT5 是一个指令调优版本的 T5(Text-to-Text Transfer Transformer),在其基础上进行了特定任务的优化,使其能够更好地处理各种指令任务。在 BLIP-2 中,FlanT5 作为编码器-解码器模型,其设计允许模型同时进行编码和解码。
- 训练方式:FlanT5 使用 前缀语言建模损失(prefix language modeling loss)进行训练。这种损失函数的核心思想是将输入分为两个部分:
- 前缀文本(prefix text):这部分文本与 视觉表示 结合,作为 FlanT5 编码器的输入。
- 后缀文本(suffix text):这部分文本作为解码器的目标,用于生成与前缀文本相对应的文本内容。
- 在训练过程中,模型的任务是根据输入的前缀文本和图像表示来生成后缀文本。也就是说,模型通过 前缀文本+视觉表示 来生成 后续的文本描述。能够处理 更复杂的多模态任务,适合需要 图像和文本交互理解 的任务。
相关文章:

万字长文解读深度学习——多模态模型BLIP2
🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总 万字长…...

selinux与防火墙
selinux 什么是selinux SELinux 是 Security-Enhanced Linux 的缩写,意思是安全强化的 linux 。 SELinux 主要由美国国家安全局( NSA )开发,当初开发的目的是为了避免资源的误用。 系统资源都是通过程序进行访问的࿰…...

java基础概念47-ArrayList、LinkList和迭代器
一、ArrayList集合 1-1、ArrayList的两种添加信息的方式 1-2、ArrayList集合底层逻辑 1、利用空参创建的集合,在底层创建一个默认长度为0的数组 2、添加第一个元素时,底层会创建一个新的长度为10的数组 3、存满时,会扩容1.5倍。 4、如果…...
Delphi 12.2.1 idhttpserver的使用方法
Delphi 12.2.1 idhttpserver的使用方法 1)CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);事件 该事件和IDTCPSERVER的EXECUTE()事件一样,都是“线程方法”,即事件是在子线程里…...

【golang】单元测试,以及出现undefined时的解决方案
单元测试 要对某一方法进行测试时,例如如下这一简单减法函数,选中函数名后右键->转到->测试 1)Empty test file 就是一个空文件,我们可以自己写测试的逻辑 但是直接点绿色箭头运行会出问题: 找不到包。我们要在…...

jmeter 压测常用静默参数解释应用
简介: JMeter静默压测(即无界面压测)是一种常用的性能测试方法,用于模拟多个用户同时访问系统并测量系统的响应时间和吞吐量等关键性能指标。在JMeter静默压测中,常用的压测参数及其解释如下: 一、基本…...

【开源】A059-基于SpringBoot的社区养老服务系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...
《智能体雏形开发(高阶实操)》开发计划概述
智能体雏形开发计划 通过本计划,逐步完成一个可以真实运行的智能体雏形。 最终完成一个**“用户日志文件生成日报,日报再进一步汇总成周报”**的任务驱动型智能体雏形 第一阶段:基础准备与环境搭建 1. 学习基础知识 了解智能体的概念、类型和技术框架。学习大模型(如阿里…...
QT学习笔记-QStringList,QTimer
QStringList-存储和管理一系列的字符串 在Qt框架中,QStringList 是一个模板类 QList<QString> 的特化,专门用于处理 QString 对象(即Qt中的字符串)的列表。当你看到这样的声明: QStringList m_rec_topicList; …...

如何使用brew安装phpredis扩展?
如何使用brew安装phpredis扩展? phpredis扩展是一个用于PHP语言的Redis客户端扩展,它提供了一组PHP函数,用于与Redis服务器进行交互。 1、cd到php某一版本的bin下 /usr/local/opt/php8.1/bin 2、下载 phpredis git clone https://githu…...

游戏引擎学习第25天
Git: https://gitee.com/mrxiao_com/2d_game 今天的计划 总结和复述: 这段时间的工作已经接近尾声,虽然每次编程的时间只有一个小时,但每一天的进展都带来不少收获。尽管看起来似乎花费了很多时间,实际上这些日积月累的时间并未…...
多线程运行时,JVM(Java虚拟机)的内存模型
在多线程运行时,JVM(Java虚拟机)的内存模型主要涉及以下几个方面: 1. 主内存和工作内存 JVM内存模型定义了主内存和工作内存的概念。主内存是所有线程共享的内存区域,而工作内存是每个线程私有的内存区域。线程对变量…...
kernel crash数据解析
crash数据解析 crash解析工具下载和编译方法如下: git clone https://github.com/crash-utility/crash.git cd crash; make targetARM64 crash工具解析ramdump文件: 1. 将dump 出来的ramdump 文件拷贝到 Linux 系统 2. 找到当前Linux 内核对应的vm…...

CLIP模型也能处理点云信息
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

利用若依代码生成器实现课程管理模块开发
目录 前言1. 环境准备1.1 数据库表设计与导入 2. 使用若依代码生成器生成模块代码2.1 导入数据库表2.2 配置生成规则2.2.1 基本信息配置2.2.2 字段信息配置2.2.3 生成信息配置 3. 下载与集成生成代码3.1 解压与集成3.2 启动项目并验证 4. 优化与扩展4.1 前端优化4.2 后端扩展 结…...

用Python做数据分析环境搭建及工具使用(Jupyter)
目录 一、Anaconda下载、安装 二、Jupyter 打开 三、Jupyter 常用快捷键 3.1 创建控制台 3.2 命令行模式下的快捷键 3.3 运行模式下快捷键 3.4 代码模式和笔记模式 3.5 编写Python代码 一、Anaconda下载、安装 【最新最全】Anaconda安装python环境_anaconda配置python…...

SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD
目录 一、OFD 简介1.1 什么是 OFD?1.2 什么是 版式文档?1.3 为什么要用 OFD 而不是PDF? 二、ofdrw 简介2.1 定义2.2 Maven 依赖2.3 ofdrw 的 13 个模块 三、PDF/文本/图片 转 OFD(ofdrw-conterver)3.1 介绍:…...

linux环境人大金仓数据库修改密码
1.进入人大金仓安装目录 cd /home/opt/Kingbase/ES/V9/Server/bin2.连接数据库 ./ksql -U system -d mydb -h 127.0.0.1 -p 54321-u 用户名 -d 数据库名 -h ip地址 -p 端口号 3.修改密码 ALTER USER system WITH PASSWORD 密码;...

使用ESP32通过Arduino IDE点亮1.8寸TFT显示屏
开发板选择 本次使用开发板模块丝印为ESP32-WROOM-32E 开发板库选择 Arduino IDE上型号选择为ESP32-WROOM-DA Module 显示屏选择 使用显示屏为8针SPI接口显示屏 驱动IC为ST7735S 使用库 使用三个Arduino平台库 分别是 Adafruit_GFXAdafruit_ST7735SPI 代码详解 首…...

Spring Cloud Alibaba(六)
目录: 分布式链路追踪-SkyWalking为什么需要链路追踪什么是SkyWalkingSkyWalking核心概念什么是探针Java AgentJava探针日志监控实现之环境搭建Java探针日志监控实现之探针实现编写探针类TestAgent搭建 ElasticsearchSkyWalking服务环境搭建搭建微服务微服务接入Sky…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...