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

2024-08-22 03:44

本文主要是介绍[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模型有兴趣的童鞋可以自行阅读。

这篇关于[CLIP-VIT-L + Qwen] 多模态大模型学习笔记 - 5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095145

相关文章

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert