[CLIP-VIT-L + Qwen] 多模态大模型学习笔记 - 5

[CLIP-VIT-L + Qwen] 多模态大模型学习笔记 - 5

  • 前情提要
  • 源码解读(visualModel类)
    • init函数
      • 整体含义
      • 逐行解读
    • get_image_features函数(重构)
      • 整体含义
      • 逐行解读
    • main函数
      • 整体含义
      • 逐行解读

参考repo:WatchTower-Liu/VLM-learning; url: VLLM-BASE

前情提要

有关多模态大模型架构中的语言模型部分(MQwen.py)的代码请看(多模态大模型学习笔记 - 1、 多模态大模型学习笔记 - 2, 多模态大模型学习笔记 - 3,多模态大模型学习笔记 - 4)
本节中将阅读视觉模型部分,即重构后的visual-encoder的源码,位于文件夹visual下的CLIP_VIT.py文件,模型选择的是clip-vit-large-patch14。

源码解读(visualModel类)

init函数

class visualModel(CLIPModel):def __init__(self, config: CLIPConfig):super().__init__(config)

整体含义

利用传入的通用配置模型参数初始化父类。

逐行解读

class visualModel(CLIPModel):def __init__(self, config: CLIPConfig):super().__init__(config)

定义一个继承CLIPModel成员变量和成员方法的visualModel类,在python3.5之后,可以对传递参数的类型进行注解,这里的CLIPModel是一个特定的自定义参数类型,用于指定传入的config参数是CLIPConfig类型,并使用传递的一般配置参数初始化父类。

get_image_features函数(重构)

    @add_start_docstrings_to_model_forward(CLIP_VISION_INPUTS_DOCSTRING)def get_image_features(self,pixel_values: Optional[torch.FloatTensor] = None,output_attentions: Optional[bool] = None,output_hidden_states: Optional[bool] = None,return_dict: Optional[bool] = None,) -> torch.FloatTensor:# Use CLIP model's config for some fields (if specified) instead of those of vision & text components.output_attentions = output_attentions if output_attentions is not None else self.config.output_attentionsoutput_hidden_states = (output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states)return_dict = return_dict if return_dict is not None else self.config.use_return_dictvision_outputs = self.vision_model(pixel_values=pixel_values,output_attentions=output_attentions,output_hidden_states=output_hidden_states,return_dict=return_dict,)pooled_output = vision_outputs.last_hidden_state  # pooled_output# print(pooled_output.shape)return pooled_output

整体含义

经典的特征提取函数,对传入的像素值进行特征提取,并用于后续进一步的处理。重构的目的在于让操作更灵活,可以使用自定义输入和直接获取池化输出。

逐行解读

    @add_start_docstrings_to_model_forward(CLIP_VISION_INPUTS_DOCSTRING)def get_image_features(self,pixel_values: Optional[torch.FloatTensor] = None,output_attentions: Optional[bool] = None,output_hidden_states: Optional[bool] = None,return_dict: Optional[bool] = None,) -> torch.FloatTensor:

这里的装饰器是为了给函数添加文档字符串,其中CLIP_VISION_INPUTS_DOCSTRING从transformers.models.clip.modeling_clip导入,这个装饰器可有可无,不必在意。
pixel_values:一个包含图像像素值的浮点数张量
其余的三个参数结尾bool值类型参数,分别代表是否输出注意力权重,是否输出每一层的隐藏层状态,返回值形式是否为字典类型。

    # Use CLIP model's config for some fields (if specified) instead of those of vision & text components.output_attentions = output_attentions if output_attentions is not None else self.config.output_attentionsoutput_hidden_states = (output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states)return_dict = return_dict if return_dict is not None else self.config.use_return_dict

这段代码主要判断是使用传入的参数还是使用配置中的默认参数,保证既可以自定义参数,也可以和配置参数保持一致。

        vision_outputs = self.vision_model(pixel_values=pixel_values,output_attentions=output_attentions,output_hidden_states=output_hidden_states,return_dict=return_dict,)

调用成员变量vision_model处理像素信息,并输出包含多个返回值的vision_outputs,传递入的参数在前文已经说明,这里不再赘述。

        pooled_output = vision_outputs.last_hidden_state  # pooled_output# print(pooled_output.shape)return pooled_output

获取最后一个时间步的隐藏层状态作为池化输出,并将其返回。这个隐藏层状态包含了模型对输入图像的压缩表示或汇总特征。

main函数

def main():modle_path = "F:/huggingface_model/clip-vit-large-patch14"model = visualModel.from_pretrained(modle_path)processor = CLIPProcessor.from_pretrained(modle_path)test_img = Image.open("D:/code/multimodal/data/000000391895.jpg")P_input = processor(images=test_img, return_tensors="pt")print(model.get_image_features(**P_input).shape)

整体含义

一个完整的测试流程,加载图像后利用processer预处理图像获得像素信息,并用视觉模型根据传入的像素信息提取图片特征。

逐行解读

def main():modle_path = "huggingface_model/clip-vit-large-patch14"model = visualModel.from_pretrained(modle_path)processor = CLIPProcessor.from_pretrained(modle_path)test_img = Image.open("D:/code/multimodal/data/000000391895.jpg")P_input = processor(images=test_img, return_tensors="pt")print(model.get_image_features(**P_input).shape)

这里的model_path可以是自己下载的文件夹,也可以直接从huggingface上加载(需要魔法),使用模型地址加载processor和model,加载测试图片后用processor获取图片像素信息,之后会重构后的模型提取池化特征输出表示。
至此,visual_model中的CLIP-VIT源码阅读完毕,有关项目中的另一个视觉模型SIGLIP模型有兴趣的童鞋可以自行阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/405724.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

avue-crud 自定义搜索项 插槽

加上 -search 就可以自定义查询项了

【MongoDB】Java连接MongoDB

连接URI 连接 URI提供驱动程序用于连接到 MongoDB 部署的指令集。该指令集指示驱动程序应如何连接到 MongoDB,以及在连接时应如何运行。下图解释了示例连接 URI 的各个部分: 连接的URI 主要分为 以下四个部分 第一部分 连接协议 示例中使用的 连接到具有…

ant design pro 中用户的表单如何控制多个角色

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的 看上面的图片 当创建或编辑一个用户时,…

Mac文件需要分卷压缩怎么办 Mac上怎么解压分卷压缩的文件

在处理大型文件的传输和存储的时候,Mac用户常面临文件大小超过限制的问题。为了有效管理这些大文件,分卷压缩成为一种必不可少的解决方案。Mac文件需要分卷压缩怎么办?Mac上怎么解压分卷压缩的文件?本文将向你介绍如何使用BetterZ…

第R2周:LSTM-火灾温度预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、什么是LSTM 1.LSTM的本质 长短时记忆网络(Long Short-Term Memory, LSTM)的本质是一种特殊的循环神经网络(Recurrent…

使用Go语言将PDF文件转换为Base64编码

使用 Go 语言将 Base64 编码转换为 PDF 文件-CSDN博客本文介绍了如何使用 Go 语言将 Base64 编码转换为 PDF 文件,并保存到指定路径。https://blog.csdn.net/qq_45519030/article/details/141225772 在现代编程中,数据转换和编码是常见的需求。本文将介绍…

SX_gitlab可视化操作c语言知识_17

gitlab可视化操作技巧: Merge into current branch直接将远程wjc_GNSS分支的数据拉下来同步到本机当前的分支代码,执行的是合并操作,即多的模块会添加到本地分支,有冲突的地方不行得rebase覆盖才行 修改完代码先暂存更改再在暂存区写入备注&a…

网络通信要素

网络介绍 定义:将具有独立功能的多台计算机通过通信线路和通信设备连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台。 学习网络的目的: 能够编写基于网络通信的软件或程序,通常来说就是网…

力扣面试经典算法150题:删除有序数组中的重复项 II

删除有序数组中的重复项 II 今天的题目是力扣面试经典150题中的数组的中等难度题: 删除有序数组中的重复项 II 题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150 题…

时间序列分析2|ARIMA模型|SARIMA模型

ARMA模型的定阶 自相关和偏自相关系数法 通过观察样本的自相关系数(ACF)和偏自相关系数(PACF),进行大体的判断 模型定阶的经验方法 截尾: 最初的d阶样本(偏)自相关系数明显在2倍标准差范围外95%的(偏)自相关系数都落在2倍标准差的范围以内非零自相…

【论文阅读】通用的语义-几何表征的机器人操作

文章目录 1. 【2023CoRL】A Universal Semantic-Geometric Representation for Robotic Manipulation针对痛点和贡献引言模型框架思考不足之处 2. Leveraging Locality to Boost Sample Efficiency in Robotic Manipulation摘要和结论引言模型框架实验思考不足之处 1. 【2023Co…

ES6-ES13学习笔记

目录 初识ES6 变量声明 解构赋值 对象解构 ​编辑 数组解构 ​编辑模版字符串 字符串扩展 includes() repeat() startsWith() endsWith() 数值扩展 二进制和八进制表示法 (Number.)isFinite()与isNaN() Number.isInteger() Math.trunc …

Leetcode JAVA刷刷站(69)x的平方根

一、题目概述 二、思路方向 在Java中,计算一个非负整数x的算术平方根,并返回其整数部分,你可以使用二分查找法。这是因为平方根函数是单调递增的,所以我们可以利用二分查找在合理的时间复杂度内找到结果。 三、代码实现 public…

Matplotlib入门与进阶:数据可视化的强大工具

Matplotlib入门与进阶:数据可视化的强大工具 在当今数据驱动的世界中,数据可视化成为了数据分析的重要一环。数据可视化不仅能够帮助开发者理解和分析数据,还能使数据展示更具说服力。本文将详细介绍Python中的2D绘图库——Matplotlib。通过…

Python自准直仪双筒望远镜光学ABCD矩阵行为算法

🎯要点 🎯平面;曲面;圆柱面;非球面光,双凸透镜;90 度棱镜;分束立方体,双透镜棱;镜分光镜光线;横置隔膜;全内反射;多个分束…

作业08.21

服务器&#xff1a; #include <myhead.h>#define SER_PORT 6666 #define SER_IP "127.0.0.1"int find_client(int *client_arr, int len, int client) {for(int i0; i<len; i){if(client_arr[i] client){return i;}}return -1; }void remove_client(int *…

python爬虫--pyquery解析库整理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理python的爬虫解析库pyquery的语法 简洁快速的整理&#xff0c;建议有前端基础的人看 pyquery解析原理 pyquery的原理就是拿到网站的前端源码后&#xff0c;我们根据我们需求信息所在的标签进行筛选。 选…

漏洞挖掘 | 记一次edusrc--轻松拿下中危信息泄露

1.前言 也是一次漏洞挖掘的思路分享 上次我们讲过了关于小程序方面的一些小思路&#xff0c;即关于抓包更改id号造成的一个信息泄露&#xff0c;但是在小程序上的信息泄露很难涉及到公民三要素这是一个痛点&#xff0c;今天就来分享一下一次edu挖掘时挖到的一个涉及公民三要素…

【云备份】项目总结

文章目录 项目总结项目总结项目扩展:常见问题: 项目总结 项目总结 搭建云备份服务器与客户端&#xff0c;客户端程序运行在客户机上自动将指定目录下的文件备份到服务器&#xff0c;并且能够支持浏览器查看与下载&#xff0c;其中下载支持断点续传功能&#xff0c;并且服务器端…

kubernetes的pod基础

kubernetes的pod基础 pod概念 pod&#xff08;豆荚&#xff09;&#xff0c;是k8s的最小管理单元。是一个或多个容器的组合&#xff0c;这些容器共享存储&#xff0c;网络和命名空间&#xff0c;以及运行规范&#xff0c;pod内的容器统一的进行安排和调度。pod是一组具有共享命…