【第三十二周】CLIP 论文阅读笔记
CLIP
- 摘要
- Abstract
- 文章信息
- 引言
- 方法
- 预训练
- 推理
- Q&A
- 关键代码
- 实验结果
- 总结
摘要
本篇博客介绍了CLIP(Contrastive Language-Image Pre-training),这是OpenAI于2021年提出的多模态预训练模型,其核心思想是通过对比学习将图像与文本映射到统一的语义空间,从而摆脱传统视觉模型对固定类别标签的依赖,实现零样本(zero-shot)迁移。该模型针对传统视觉模型泛化能力受限、依赖人工标注数据的问题,提出基于互联网海量图文对(4亿组)的自监督学习框架:利用双编码器结构(图像编码器采用ViT/ResNet,文本编码器采用Transformer)分别提取特征,通过归一化投影层对齐模态,并以对比损失函数最大化配对图文相似度,同时抑制非配对样本的关联。这一方法在30多个数据集上验证了其零样本迁移能力。其局限性包括依赖超大规模数据集、计算成本高昂,以及对细粒度视觉语义和长尾数据泛化不足。
Abstract
This blog introduces CLIP (Contrastive Language-Image Pre-training), a multimodal pre-training model proposed by OpenAI in 2021, which maps images and text into a unified semantic space through contrastive learning. By eliminating traditional vision models’ reliance on fixed category labels, CLIP achieves zero-shot transfer capabilities. To address the limitations of conventional visual models—such as constrained generalization and dependence on manually annotated data—CLIP introduces a self-supervised framework trained on 400 million web-scale image-text pairs. It leverages a dual-encoder architecture (ViT/ResNet for images and Transformer for text) to extract features, aligns modalities via normalized projection layers, and employs a contrastive loss function to maximize similarity between matched image-text pairs while minimizing correlations for unmatched pairs. Validated across over 30 datasets. However, limitations remain, such as reliance on ultra-large datasets, high computational costs, and insufficient generalization for fine-grained visual semantics and long-tail data distributions.
文章信息
Title:Learning Transferable Visual Models From Natural Language Supervision
Author:Alec Radford, Jong Wook Kim, Chris Hallacy, Aditya Ramesh, Gabriel Goh, Sandhini Agarwal, Girish Sastry, Amanda Askell, Pamela Mishkin, Jack Clark, Gretchen Krueger, Ilya Sutskever.
Source:https://arxiv.org/abs/2103.00020
引言
计算机视觉领域长期依赖人工标注数据集(如ImageNet)进行监督学习,这种方法存在一下缺陷:
- 标注成本高,高质量的标注数据获取困难,且无法覆盖所有可能的视觉概念。
- 泛化能力有限,模型被限制在固定的类别标签中,无法动态适应新任务或新概念。
- 分布偏移敏感:传统模型在数据分布变化时性能显著下降,例如风格、光照或场景的差异 。
自然语言处理(NLP)领域通过大规模无监督预训练(如BERT、GPT)实现了突破,表明从海量文本数据中学习语义关联是可行的。
另外,互联网上存在海量的图像-文本对(如网页、社交媒体),这些数据天然包含丰富的语义关联,可作为无需人工标注的监督来源 。
CLIP(Contrastive Language-Image Pre-training)主要围绕如何突破传统计算机视觉模型的局限性,并探索自然语言作为监督信号的可能性。
方法
CLIP的核心目标是将图像和文本映射到同一语义空间,通过对比学习最大化匹配图像-文本对的相似性,最小化不匹配对的相似性。这种设计使模型能够理解图像内容与文本描述的语义关联,而非依赖固定类别标签。CLIP模型的架构如下图所示:
其中,左侧(1)是预训练部分,右侧(2)和(3)是推理部分。
与其他训练方法相比,从自然语言中学习有以下优势:
- 自然语言标签的自由度大,与用于图像分类的标准标签相比,扩展自然语言监督要容易得多,因为它不要求标注遵循某种特定的格式 。
- 与大多数无监督或自监督学习方法相比,从自然语言中学习可以不仅“只是”学习表征,而且还将该表征与语言联系起来,从而实现灵活的zero-shot迁移。
预训练
用于预训练CLIP的数据集是互联网上各种公开可用的资源中搜集到的4亿对(图像,文本)对。
论文中给的训练流程伪代码如下:
假设每个 training batch 都有 n 个图像文本对,则每个图像和文本分别通过图像、文本编码器,得到对应的 n 个视觉特征(visual_embedding, I 1 , I 2 , I 3 . . . I n I_1,I_2,I_3...I_n I1,I2,I3...In)和 n 个文本特征(text_embedding)。但不同模态的数据表示之间可能存在 gap,无法直接进行比较,因此先将不同模态的数据映射到同一个多模态空间(joint multimodal sapce),有利于后续的相似度计算等操作。
视觉特征和文本特征被投身到同一多模态空间后,就可以进行对比学习了,多模态中的所有图片与所有其他文本进行都进行一次匹配(计算相似度,做内积),可得到一个 n × n n\times n n×n 的相似度(cosine 相似度)矩阵,其中只有对角线的图像文本对是正样本(实际的图像文本对),剩下的 n 2 − n n^2-n n2−n个匹配方式都是负样本。
有了正负样本后,模型就可以通过对比学习进行无监督训练。
如果图像和对应的文本嵌入越相似,那么他们的内积便越大。然后通过交叉熵损失函数进行训练,将来自于同一个图片文本对的图像和文本嵌入映射到相近的位置,而将来自不同样本的嵌入映射到较远的位置。这使得模型能够学习到图像和文本之间的共同特征。
推理
CLIP 的推理任务是对图片进行分类,其要判断的类别是我们感兴趣的类别,并不是固定的。
- 对于输入的图像,首先通过训练好的图像编码器,得到图像特征( I 1 I_1 I1)
- 对于类别,首先需要确定我们感兴趣的N个类别,然后使用 CLIP 提出的 prompt template ,将感兴趣的类别词(如图中的“plane”、“car”、“dog”…“bird”)扩展成描述性的句子 ,如图中展示的模板为“A photo of a {object}” ,就是要将模板中的 object 替换为类别词,得到该类别对应的句子。最后将所有句子分别通过预训练好的文本编码器,得到 N 个文本特征( T 1 , T 2 . . . T N T_1,T_2...T_N T1,T2...TN)
- 最后,计算需要分类的图像的特征与感兴趣的所有类别的文本特征之间的 cosine similarity(余弦相似度),相似度最高文本对应的类别就是最终分类的类别。
注意:编码器里包括了多模态嵌入,与预训练时一样,不然无法做相似度计算。
说明:在将单模态特征投射到多模态时,CLIP并没有使用非线性的投射层,而是用的线性投射层,作者发现在多模态的训练过程中,模型的效果与投射层是否是非线性基本无关,作者猜测非线性的投射层应该只是用来适配出图片的单模态学习的。
另外,因为CLIP用到的数据集足够大,所以除了用到随机裁剪,并没有用到其他的数据增强方法。
Q&A
Q1: 为什么要用对比学习?
A1:
对于同一张图片来说,可以有许多不同的描述,如果用预测型的任务来训练模型,就会有太多可能的结果,导致模型训练的过程会很慢。
但若使用对比的任务来训练模型,也就是说只需要判断图片和文本间是不是匹配的关系,不需要逐字逐句去预测文本,那么这个任务就会简单很多,这种监督信号在实际中也更合理。
论文中对比了预测和对比两种方式的效率:
上图中的蓝线代表open ai的GPT类的模型,基于Transformer做预测任务,橘黄色的线代表基于Bag of words的方式,不用逐字逐句去预测文本,文本已经全局化地提取成了特征,相应的约束被放宽,训练效率提高了三倍,绿色线代表CLIP所使用的对比学习的方式,其训练效率又进一步提高了四倍 。说明基于对比学习的方法的拥有很好的训练效率。
Q2: 在推理的时候为什么要做 prompt engineering 和 prompt ensembling
A2:
基于prompt的学习方法主要是在做微调或者直接推理的时候使用的一种方法,而不是在预训练阶段,因此不需要太多的训练资源,但对效果的提升比较显著。prompt顾名思义,起到的是一个提示的作用,也就是文本引导的作用。
用prompt engineering 和 prompt ensembling 的原因:
首先是多义性(polysemy),一个单词可以有很多个含义,若在做图片和文本的匹配的任务时只用一个单词去做文本的特征提取,就可能面临多义性的问题,比如在ImageNet数据集里同时包含了construction cranes 和 cranes 两个类,在相应的语境下,两个cranes对应的语义并不一样,若只用一个单词的话就会有歧义,算出的相似度可能也是错的。
其次,在做预训练的时候,图片所匹配的文本一般都是一个句子,但推理时用一个单词的话,可能就会出现 distribution gap 的问题,提取出的特征可能不佳。
所以文中提出了prompt template的方法将单词扩充为句子,而且若提前知道一些信息,可以在提示时多加一些限定,以缩小解的空间,对zero-shot的推理很有帮助。prompt ensembling是说多用一些提示模板,做多次推理,最后将结果综合起来,一般会得到更好的结果。
关键代码
CLIP模型(https://github.com/openai/CLIP)实现的核心代码在clip/models.py文件中定义的CLIP类。
初始化函数:
def __init__(self,embed_dim: int,# visionimage_resolution: int,vision_layers: Union[Tuple[int, int, int, int], int],vision_width: int,vision_patch_size: int,# textcontext_length: int,vocab_size: int,transformer_width: int,transformer_heads: int,transformer_layers: int):super().__init__()self.context_length = context_length# 图像编码器的两种形式# 当输入的vision_layer 的格式是(tuple,list), 则用ResNet实现if isinstance(vision_layers, (tuple, list)): vision_heads = vision_width * 32 // 64self.visual = ModifiedResNet(layers=vision_layers,output_dim=embed_dim,heads=vision_heads,input_resolution=image_resolution,width=vision_width)else: # 否则用Vision Transformer对图像进行编码vision_heads = vision_width // 64self.visual = VisionTransformer(input_resolution=image_resolution,patch_size=vision_patch_size,width=vision_width,layers=vision_layers,heads=vision_heads,output_dim=embed_dim)# 文本编码器用Transformer实现self.transformer = Transformer(width=transformer_width,layers=transformer_layers,heads=transformer_heads,attn_mask=self.build_attention_mask())self.vocab_size = vocab_sizeself.token_embedding = nn.Embedding(vocab_size, transformer_width) # vocab_size 表示词汇表的大小,transformer_width 表示每个 token 被映射成的向量的维度。self.positional_embedding = nn.Parameter(torch.empty(self.context_length, transformer_width))self.ln_final = LayerNorm(transformer_width)self.text_projection = nn.Parameter(torch.empty(transformer_width, embed_dim))self.logit_scale = nn.Parameter(torch.ones([]) * np.log(1 / 0.07))self.initialize_parameters()
图像编码器,调用self.visual对图像进行编码:
def encode_image(self, image):return self.visual(image.type(self.dtype)) # 先转换image的数据类别,然后再输入到图像编码器中进行编码
其中self.dtype的实现如下, 用于获取图像编码器中conv1的权重的数据类别。
@propertydef dtype(self):return self.visual.conv1.weight.dtype
文本编码器:
def encode_text(self, text):# 每个句子前面有两个特殊符号 [CLS] 和 [Seq]x = self.token_embedding(text).type(self.dtype) # [batch_size, n_ctx, d_model]x = x + self.positional_embedding.type(self.dtype) # 添加位置编码x = x.permute(1, 0, 2) # NLD -> LNDx = self.transformer(x)x = x.permute(1, 0, 2) # LND -> NLD [batch_size, n_ctx, d_model]x = self.ln_final(x).type(self.dtype) # LayerNorm# x.shape = [batch_size, n_ctx, transformer.width]# take features from the eot embedding (eot_token is the highest number in each sequence)x = x[torch.arange(x.shape[0]), text.argmax(dim=-1)] @ self.text_projectionreturn x
前向传播:首先编码图像和文本信息,然后对图像和文本特征进行归一化,将归一化后的特征计算相似度得分。
def forward(self, image, text):image_features = self.encode_image(image) # 编码图像特征text_features = self.encode_text(text) # 编码文字特征# 对特征进行归一化image_features = image_features / image_features.norm(dim=1, keepdim=True)text_features = text_features / text_features.norm(dim=1, keepdim=True)# cosine similarity as logitslogit_scale = self.logit_scale.exp() # 可学习参数logits_per_image = logit_scale * image_features @ text_features.t() # 每个图像与每个文本之间的相似度得分。logits_per_text = logits_per_image.t() # 每个文本与每个图像之间的相似度得分。# shape = [global_batch_size, global_batch_size]return logits_per_image, logits_per_text
实验结果
由于CLIP学习的是文本语义信息,而不是one-hot编码的单类别信息,这使CLIP具有更好的迁移能力。文中在多个数据集上对比了zero-shot的CLIP与在做linear probe的resnet50(有监督),(linear probe是把一个预训练好的模型冻结,用其提取特征,只训练最后一层 fc 分类头层去做分类任务),结果如下:
结果显示,zero-shot 的 CLIP 在大多数数据集上的效果比有监督的 resnet50 的效果好。
对于普通的物体分类来说,CLIP的zero-shot的表现很好,但对于一些更难、更抽象的任务和数据集,CLIP模型表现不好。
作者认为对于特别难的任务来说,CLIP上做zero-shot的迁移并不合理,可能做few-shot的迁移更合理一些。所以作者做了few-shot的实验,结果如下:
few-shot CLIP就是将训练好的图片编码器冻结,然后再做 linear probe,图中横坐标表示数据集中每个列别用了多少训练样本,0就表示的是zero-shot,纵坐标是平均分类准确度。
结果表明,zero-shot CLIP 不弱于 few-shot 里表现最好的 Bit 。另外,few-shot的linear probe CLIP在训练样本较少时,其效果还不如 zero-shot CLIP ,但随着训练样本的增多,few-shot CLIP的效果越来越好,超越了 zero-shot CLIP。
CLIP不仅在ImageNet 常规数据集上表现优秀,对于ImageNet Sketch 素描图、ImageNet-R 动漫图等非常规图像上的迁移学习能力要远远优于Resnet101。
总结
CLIP(Contrastive Language-Image Pre-training)作为多模态预训练领域的里程碑模型,基于双编码器结构(图像编码器如ViT/ResNet与文本编码器如Transformer),通过对比学习将图像和文本特征映射到同一语义空间,其核心工作流程包括:分别提取图像和文本特征后进行归一化处理,利用可学习的温度参数缩放相似度矩阵,并通过交叉熵损失函数最大化正样本对(匹配的图文对)的相似度,同时抑制负样本对(非匹配对)的关联。CLIP的优势在于其强大的零样本迁移能力,可灵活应用于图像分类、跨模态检索等任务,且摆脱了传统模型对固定类别标签的依赖;但其局限性在于训练依赖超大规模数据集(如4亿图文对),计算成本高昂,且对细粒度视觉理解和未覆盖领域的数据泛化能力有限。
相关文章:
【第三十二周】CLIP 论文阅读笔记
CLIP 摘要Abstract文章信息引言方法预训练推理Q&A 关键代码实验结果总结 摘要 本篇博客介绍了CLIP(Contrastive Language-Image Pre-training),这是OpenAI于2021年提出的多模态预训练模型,其核心思想是通过对比学习将图像与文…...
在 Ubuntu 系统上安装 PostgreSQL
在 Ubuntu 系统上安装 PostgreSQL 的完整指南: 一、安装 PostgreSQL(最新版本) 1. 更新软件包列表: bash sudo apt update 2. 安装 PostgreSQL 和客户端工具: bash sudo apt install postgresql po…...
【MySQL】数据类型
🏠个人主页:Yui_ 🍑操作环境:Centos7 🚀所属专栏:MySQL 文章目录 前言1. bit类型2.tinyint类型3. float类型4. decimal5. char类型6. varchar5&6 char和varchar的比较7.日期和时间类型8.enum和set总结 …...
Mac上Cursor无法安装插件解决方法
可能是微软的vscode被cursor这些新晋的AI-IDE白嫖够了,所以现在被制裁了,cursor下载不了vscode插件了。需要自己修改扩展商店源。 近期微软调整了 API 鉴权策略或限制了非官方客户端的访问权限。 解决方案 一、找到 product.json 文件 打开终端&…...
PI0 Openpi 部署(仅测试虚拟环境)
https://github.com/Physical-Intelligence/openpi/tree/main 我使用4070tisuper, 14900k,完全使用官方默认设置,没有出现其他问题。 目前只对examples/aloha_sim进行测试,使用docker进行部署, 默认使用pi0_aloha_sim模型(但是文档上没找到对应的&…...
NumPy数组和二维列表的区别
在 Python 中,NumPy 数组和二维列表在性能方面存在诸多不同,下面从存储方式、内存占用、操作速度、缓存局部性这几个角度详细分析。 存储方式 二维列表:它是 Python 内置的数据结构,列表中的每个元素实际上是一个引用࿰…...
学习设计模式《四》——单例模式
一、基础概念 单例模式的本质【控制实例数目】; 单例模式的定义:是用来保证这个类在运行期间只会被创建一个类实例;单例模式还提供了一个全局唯一访问这个类实例的访问点(即GetInstance方法)单例模式只关心类实例的创建…...
构建具备推理与反思能力的高级 Prompt:LLM 智能代理设计指南
在构建强大的 AI 系统,尤其是基于大语言模型(LLM)的智能代理(Agent)时,Prompt 设计的质量决定了系统的智能程度。传统 Prompt 通常是简单的问答或填空式指令,而高级任务需要更具结构性、策略性和…...
NLP 梳理03 — 停用词删除和规范化
一、说明 前文我们介绍了标点符号删除、文本的大小写统一,本文介绍英文文章的另一些删除内容,停用词删除。还有规范化处理。 二、什么是停用词,为什么删除它们? 2.1 停用词的定义 停用词是语言中的常用词,通常语义…...
算法—插入排序—js(小数据或基本有序数据)
插入排序原理:(适合小规模数据) 将数组分为“已排序”和“未排序”两部分,逐个将未排序元素插入到已排序部分的正确位置。 特点: 时间复杂度:平均 O(n),最优(已有序)O(n…...
家庭电脑隐身后台自动截屏软件,可远程查看
7-4 本文介绍一个小软件,可以在电脑后台运行,并且记录电脑的屏幕画面保存下来,并且可以远程提取查看。 可以用于记录长时间运行的软件的执行画面过程,或者用于记录家庭中小孩使用电脑的过程,如果没有好好上网课&…...
【Agent】AI智能体评测基座AgentCLUE-General
note AgentCLUE-General将题目划分为“联网检索”、“数据分析”、“多模态理解”和“多场景组合”任务AgentCLUE-General为每个题目都提供一个标准答案,将Agent智能体的答案与标准答案进行规则匹配判断对错 文章目录 note一、任务划分和场景划分二、答案提取的pro…...
最新iOS性能测试方法与教程
一、工具instrument介绍 使用Xcode的instrument进行测试,instrument自带了很多性能方面的测试工具,如图所示: 二、常见性能测试内容 不管是安卓还是iOS的性能测试,常见的性能测试都要包含这五个方面: 1、内存ÿ…...
多模态大语言模型arxiv论文略读(三十)
Mastering Text-to-Image Diffusion: Recaptioning, Planning, and Generating with Multimodal LLMs ➡️ 论文标题:Mastering Text-to-Image Diffusion: Recaptioning, Planning, and Generating with Multimodal LLMs ➡️ 论文作者:Ling Yang, Zhao…...
【AI论文】CLIMB:基于聚类的迭代数据混合自举语言模型预训练
摘要:预训练数据集通常是从网络内容中收集的,缺乏固有的领域划分。 例如,像 Common Crawl 这样广泛使用的数据集并不包含明确的领域标签,而手动整理标记数据集(如 The Pile)则是一项劳动密集型工作。 因此&…...
AI大模型发展现状与MCP协议诞生的技术演进
1. 大模型能力边界与用户痛点(2023年) 代表模型:GPT-4(OpenAI)、Claude 3(Anthropic)、通义千问(阿里云)等展现出强大的生成能力,但存在明显局限:…...
从malloc到free:动态内存管理全解析
1.为什么要有动态内存管理 我们已经掌握的内存开辟方法有: int main() {int val 20;//在栈空间上开辟四个字节char arr[20] { 0 };//在栈空间上开辟10个字节的连续空间return 0; }上述开辟的内存空间有两个特点: 1.空间开辟的时候大小已经固定 2.数组…...
CSS值和单位
CSS值和单位 CSS 中的值和单位是构建样式的基础,它们定义了属性的具体表现方式。值用于定义样式属性的具体取值,而单位用于指定这些值的度量方式。CSS中常用的值和单位如下: 1.长度单位 px : 像素,绝对单位 em : 相对于元素的字…...
Redis高级篇之I/O多路复用的引入解析
文章目录 一、问题背景1. 高并发连接的管理2. 避免阻塞和延迟3. 减少上下文切换开销4. 高效的事件通知机制5. 简化编程模型6. 低延迟响应本章小节 二、I/O多路复用高性能的本质1. 避免无意义的轮询:O(1) 事件检测2. 非阻塞 I/O 零拷贝:最大化 CPU 利用率…...
FTP协议命令和响应码
文章目录 📦 一、什么是 FTP 协议?🧾 二、FTP 常见命令(客户端发送)📡 三、FTP 响应码(服务端返回)📌 响应码分类(第一位)✅ 常见成功响应码&…...
在win上安装Ubuntu安装Anaconda(linx环境)
一,安装Ubuntu 1. 在 Microsoft 商城去下载Ubuntu(LTS:是长期维护的版本) 2.安装完之后启动程序,再重新打开一个黑窗口: wsl --list --verbose 3.关闭Ubuntu wsl --shutdown Ubuntu-22.04 WSL2 Ubuntu-20.04文件太占c盘空间,…...
【Elasticsearch入门到落地】11、RestClient初始化索引库
接上篇《10、初始化RestClient》 上一篇我们已经完成了RestHighLevelClient的初始化工作,本篇将正式进入索引库的创建阶段。我们将使用Java代码来创建酒店数据的索引库。 一、准备工作 1. 创建常量类 首先,我们需要定义一个常量类来存放索引库的mappi…...
远程服务调用的一些注意事项
引言 最近工作中,遇到了一些关于远程服务调用的问题,背景是调用三方接口获取某些特征数据,但由于调用出现了超时,导致业务本身的接口的可用行降低。因此整理一些远程服务调用时的注意事项,通过不同维度的考虑来提高系…...
QML 样式库
在 QML 中,样式库(或 UI 框架)用于快速构建一致且美观的界面。Qt/QML 本身不提供内置的完整样式库,但可以通过以下方式实现样式管理或使用第三方库。 1. Qt Quick Controls 2 样式系统 Qt Quick Controls 2 是官方提供的 UI 组件…...
[RHEL8] 指定rpm软件包的更高版本模块流
背景:挂载RHEL ISO使用kickstart安装操作系统,安装包未指定安装perl,但是安装完可以查到其版本,且安装的是ISO中多个版本中的最低版本。 原因:(1)为什么没有装perl,perl -v可以看到版…...
使用Python可视化洛伦兹变换
引言 大家好!今天我们将探讨一个非常有趣且重要的物理概念—洛伦兹变换。它是相对论的核心内容之一,描述了在高速运动下,时间、长度以及其他物理量是如何发生变化的。通过使用 Python 进行可视化,我们不仅可以更好地理解这个概念,还能感受到物理世界中的奇妙之处。 什么…...
【二叉树专题】一道深入浅出的 DFS 题:求二叉树的直径(含通俗易懂讲解)
题目: 给你一棵二叉树的根节点,返回这棵树的 直径。 直径 是任意两个节点路径中,最长的一条路径所经过的边数。 比如下面这棵树: 1/ \2 3/ \ 4 5它的最长路径是:4 → 2 → 5 或者 4 → 2 → 1 → 3,…...
考研系列-计算机网络-第三章、数据链路层
一、数据链路层的功能 1.知识点总结 2.习题总结...
医药采购系统平台第10天02:按药品分类的统计按供货商统计按医院统计统计数据的导出DWR的配置和应用
如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!! 一 按药品分类的统计实现 1 按药品分类统计的需求 按药品统计:在指定时间段中采购量、采购金…...
Navicat、DataGrip、DBeaver在渲染 BOOLEAN 类型字段时的一种特殊“视觉风格”
文章目录 前言✅ 为什么 Boolean 字段显示为 [ ]?✅ 如何验证实际数据类型?✅ 小结 前言 看到的 deleted: [ ] 并不是 Prisma 的问题,而是数据库客户端(如 Navicat、DataGrip、DBeaver)在渲染 BOOLEAN 类型字段时的一种…...
(undone) 吴恩达版提示词工程 2. 指南
url: https://www.bilibili.com/video/BV1Z14y1Z7LJ?spm_id_from333.788.videopod.episodes&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 别人的笔记 url: https://zhuanlan.zhihu.com/p/626966526 指导原则(Guidelines) 编写提示词有两个…...
VLC搭建本机的rtsp直播推流和拉流
媒体---流---捕获设备,选择摄像头,点击串流 x下一步 选择rtsp,点击添加 看到了端口,并设置路径: 选择Video -H 264 mp3(TS) 点击下一个, 点击流,就开始推流了 拉流,观看端&#x…...
Rocky Linux 9.1 修改网卡和DNS
在 Rocky Linux 9.1 中修改网卡和 DNS 配置可以通过 NetworkManager 工具实现(推荐)或直接编辑配置文件。以下是两种方法的详细步骤: 方法一:使用 nmcli 命令行工具(动态生效) 查看当前网络连接nmcli connection show # 输出示例: # NAME UUID …...
Web前端:常用的布局属性
常见的布局方式有哪些? float:浮动布局 position 定位布局 flex 弹性布局(display) table 表格布局(弃用) 一、HTML5 语义化布局标签 这些标签本身不提供布局能力,但能增强页面结构…...
XSS学习2
一、客户端的Cookie 1. 无状态的影响 无状态问题: HTTP协议的无状态特性导致每次请求都是独立的,无法保持会话。例如,在银行办理业务时,柜员不需要重复询问客户信息,但在计算机网络中,每次HTTP请求都需要重新认证用户…...
软件设计师/系统架构师---计算机网络
概要 什么是计算机网络? 计算机网络是指将多台计算机和其他设备通过通信线路互联,以便共享资源和信息的系统。计算机网络可以有不同的规模,从家庭网络到全球互联网。它们可以通过有线(如以太网)或无线(如W…...
Kubernetes(k8s)学习笔记(二)--k8s 集群安装
1、kubeadm kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具。这个工具能通过两条指令完成一个 kubernetes 集群的部署: 1.1 创建一个 Master 节点$ kubeadm init 1.2 将一个 Node 节点加入到当前集群中$ kubeadm join <Master 节点的 IP 和…...
线性DP:最长上升子序列(子序列可不连续,子数组必须连续)
目录 Q1:简单遍历 Q2:变式(加大数据量) Q1:简单遍历 Dp问题 状态表示 f(i,j) 集合所有以第i个数结尾的上升子序列集合-f(i,j)的值存的是什么序列长度最大值max- 状态计算 (其实质是集合的划分)…...
SpringBoot 基本原理
SpringBoot 为我们做的自动配置,确实方便快捷,但一直搞不明白它的内部启动原理,这次就来一步步解开 SpringBoot 的神秘面纱,让它不再神秘。 目录 SpringBootApplication 背后的秘密 Configuration ComponentScan EnableAutoC…...
LeetCode第158题_用Read4读取N个字符 II
LeetCode 第158题:用Read4读取N个字符 II 题目描述 给你一个文件,并且该文件只能通过给定的 read4 方法来读取,请实现一个方法来读取 n 个字符。 read4 方法: API read4 可以从文件中读取 4 个连续的字符,并且将它…...
webgl入门实例-矩阵在图形学中的作用
矩阵在图形学中扮演着核心角色,几乎所有图形变换、投影和空间转换都依赖矩阵运算来实现高效计算。以下是矩阵在图形学中的主要作用及具体应用: 1. 几何变换 矩阵乘法可以高效表示物体的平移、旋转、缩放等基本变换,并通过矩阵连乘实现复合变…...
基于Matlab求解矩阵电容等效容值
1需求 仿真测试8*10阶举证电容等效容值。 2模型搭建 2.1打开simscape 在打开simulink之后打开simscape库,Simscape库位置如下 2.2搭建模型 在库中寻找需要的元件搭建电路。 2.2.1基本元件 电阻电容电感等基础器件,搭建电路之后需要对其进行幅值&…...
铅酸电池充电器方案EG1253+EG4321
参考: 基于EG1253EG4321铅酸电池(48V20AH)三段式充电器 屹晶微高性价比的电瓶车充电器方案——EG1253 电瓶电压 48V电瓶锂电池,其充满约为55V~56V,因此充电器输出电压为55V~56V; 若是48V铅酸电池,标称电压为48V&…...
每天学一个 Linux 命令(26):less
可访问网站查看,视觉品味拉满: http://www.616vip.cn/26/index.html less 是 Linux 中一个强大的文件内容查看工具,用于分页显示文件内容,支持快速搜索、滚动浏览、跳转等操作。相比 more,less 功能更丰富且支持向前和向后翻页,适合查看大文件或日志。 命令格式 les…...
【网络】数据链路层知识梳理
全是通俗易懂的讲解,如果你本节之前的知识都掌握清楚,那就速速来看我的笔记吧~ 自己写自己的八股!让未来的自己看懂! (全文手敲,受益良多) 数据链路层 我们来重新理解一下这个图:…...
2.2 BackgroundWorker的使用介绍
BackgroundWorker 是 .NET Framework 中一个简化异步操作的组件,它位于 System.ComponentModel 命名空间下。它为开发人员提供了一种简单的方式在后台执行耗时操作,同时保持与 UI 线程的交互 主要属性以及任务如下: DoWork 事件:…...
Java从入门到“放弃”(精通)之旅——类和对象全面解析⑦
Java从入门到“放弃”(精通)之旅🚀——类和对象全面解析⑦ 一、面向对象初探 1.1 什么是面向对象? Java是一门纯面向对象的语言(OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想&a…...
无回显RCE
在CTF和实战渗透中,不是每一个命令执行点都有回显,有时我们审了半天代码,却发现好不容易找到的命令执行没有回显,但是这并不代表这段代码不能被我们利用,在无回显的情况下也是可以利用的 首先我们来写一个最简单的php…...
DQN在Gym的MountainCar环境的实现
DQN on MountainCar 引言 在本次实验里,我构建了DQN和Dueling DQN,并在Gymnasium库的MountainCar环境中对它们展开测试。我通过调整训练任务的超参数,同时设计不同的奖励函数及其对应参数,致力于获取更优的训练效果。最后&#…...
typescript判断是否为空
1 判断数据类型 1.1 基础数据类型 比如number,string,boolean,使用typeof,返回值是string类型: 例如: if("number" typeof(item)) {egret.log("item的类型是number"); } else if(&…...