- 博客(49)
- 收藏
- 关注

原创 我的第一个博客
##博客_01作为一个刚刚学完javase并且准备复习一遍的小萌新,我以后将会在优快云记录我所学的知识及自己的理解,(•̀ᴗ•́)و欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设
2020-08-06 22:29:52
129
原创 [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - 模型训练篇
collate_fn传入之前导入的data_collate函数,对训练数据进行统一的批处理,并利用partial函数固定tokenizer,black_token_length等参数,有关data_collate函数的细节请参考。训练参数的数据类,继承自transformers.TrainingArguments,并添加了一个新的参数feature_proj_lr,用于调整中间映射层的学习率。本节介绍的是模型训练部分。多模态模型的训练代码,将视觉模型的参数冻结,并采用LoRA对语言模型进行微调。
2024-08-27 14:20:23
538
原创 [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - DataSet篇
初始化caption_labels,开头是长度为(black_token_length + 当前字幕长度 - L - 1)的掩码,中间为字幕的倒数L个token,结尾为长度是(max_lenght - 当前字幕长度)的掩码。使用导入的创建上下文方法,传入初始化的成员变量self.tokennizer分词器,prompt,初始化历史信息为空,代表当前没有历史对话,system作为描述信息,描述了系统功能。如Multimodal[1],其中Multimodal为类的实例对象,1为传入的index参数值。
2024-08-26 13:39:27
965
原创 [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - MultiModal篇
使用nn.Sequential创建一个顺序执行的深度网络块,nn,Linear为全连接线性层,第一个全连接层接受视觉模型的输入,将输入的维度转换为语言模型隐藏层维度的输出,经过一个激活函数GELU增加模型的非线性,经过另一个线性全连接层转换后输出。调用父类的to方法,传入*args, **kwargs参数,提高代码的可拓展性。假设传入的Input_ids的size为(1,5),利用语言模型生成结果的size为(1,10),这里切片操作的目的就是只获取模型的生成结果,即预测结果,out[1,5:-1]
2024-08-24 13:30:39
899
原创 [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - trainer篇
我们传入的model参数实际上是一个以Qwen为语言模型,SIGLIP/CLIP-VIT为视觉模型的多模态模型参数,所有这里的model.LLM大概率是语言模型,saved_params_llm获取语言模型微调后的adapter状态字典,并将其存储到输出路径下的adapter_model.bin文件中。其余的参数在后续都将应用权重衰减。如果设置了投影层的学习率,我们获取opt_model中所有名字里带有‘feature_proj’的参数,这些参数都是投影层参数,代表我们的模型是多模态模型,具有投影层。
2024-08-22 15:59:30
857
原创 [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - 视觉模型篇
定义一个继承CLIPModel成员变量和成员方法的visualModel类,在python3.5之后,可以对传递参数的类型进行注解,这里的CLIPModel是一个特定的自定义参数类型,用于指定传入的config参数是CLIPConfig类型,并使用传递的一般配置参数初始化父类。本节中将阅读视觉模型部分,即重构后的visual-encoder的源码,位于文件夹visual下的CLIP_VIT.py文件,模型选择的是clip-vit-large-patch14。利用传入的通用配置模型参数初始化父类。
2024-08-21 22:49:06
1364
原创 [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - 语言模型篇(4)
本节中将接着看MQwen.py中的剩余源码,即MQwenLMHeadModel和main函数源码,MQwen.py重构了Qwen大模型中QwenModel的前向传播代码和QwenLMHeadModel的部分代码,以适配视觉编码器CLIP-VIT-L和语言模型Qwen的多模态架构,QwenModel类作为基座模型,QwenLMHeadModel 是基于 QwenModel 的一个扩展,加入了针对特定下游任务的头,在后续我们主要使用重写后的MQwenLMHeadModel作为多模态架构中的语言模型。
2024-08-21 14:57:04
1148
原创 CLIP-VIT-L + Qwen 多模态源码阅读 - 语言模型篇(3)
如果batch_size合法,我们重塑attention_mask的第一个维度为batch_size。其他情况,我们初始化一个空的ntk_alpha_list,如果存在attention_mask且kv_seq_len大于继承的成员变量self.seq_len,我们用attenrion_mask计算序列的实际长度,这里去除掉四维张量attenrion_mask的中间两个维度,计算seq_len维度中指为0的元素数量(由于之前翻转了attention_mask,所以值为0代表我们需要关注的元素)。
2024-08-20 22:23:05
1552
原创 [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - 语言模型篇(2)
我们确保token_type_id和position_id的最后一个维度都是seq_len + image_context_len,以便于后续的处理。最后对position_id进行重新塑性,position_ids原本的size为(seq_len + image_context_len,),我们添加一个为1的维度(用unsqueeze(0)),并且将position_ids最后一个维度重塑为(seq_len + image_context_len),这里可能有点多此一举,但是为了代码的健壮性也无妨。
2024-08-19 23:02:56
971
原创 [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - 语言模型篇(1)
想要做一个以Qwen-7B-Insturct为language decoder, 以CLIP-VIT-14为vision encoder的image captioning模型,找了很多文章和库的源码,但是无奈都不怎么看得懂,刚开始打算直接给language decoder加上cross attention层对接vison encoder的图片编码结果,无奈不会写TAT,看了Qwen的源码半天都没搞懂这么多类是干什么的,心累。input_ids:输入序列的索引,将token映射为唯一的整数数字索引。
2024-08-17 23:37:14
759
1
原创 2020-8-19 JavaWebDay_06
核心DOM:Document:创建:1.window: document;2.document;(在html dom模型中)方法:1.获取Element对象;getElementByid(id);getElementsByTagName(tagname):返回数组;getElementsByClassNmae(classname):返回数组;getElementsByName(name):返回数组;2.创建其他DOM对象:creatAttribute();crea
2020-08-19 23:26:38
173
原创 2020-8-19 JavaWebDay_06
DOM简单功能:功能:控制html文档的内容;代码:获取页面元素(标签)对象 Element;document.getElementByid("id值"):通过文本的id获取元素对象;操作对象:1.修改属性值;2.修改标签体内容;属性:innerHTML;简单事件:功能:某些组件被执行了一些操作后.触发某些代码的执行;绑定事件:1.直接在html标签上指定事件的属性,属性就是html代码;2.通过js获取元素对象,指定事件属性,设置一个函数;onclick:单击
2020-08-19 17:28:14
175
原创 2020-8-19 JavaWebDay_06
JS特殊语法:1.语句以;结尾,如果一行只有一条语句,则;可以省略;2.变量的定义使用var关键字,也可以不使用;使用:定义的是局部变量;不使用:定义的是全局变量;流程控制:基本和java语法一致,有一点小差别;switch:可以接收任意类型;JS基本对象:Function:创建:var 方法名=new Function(形参列表,方法体);var 方法名=Function(形参列表){方法体};Function 方法名(形参列表){方法体};属性:len
2020-08-19 11:14:38
190
原创 2020-8-18 JavaWebDay_05
JavaScript:概念:一门客户端脚本语言;运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎;脚本语言:不需要编译,直接就可以被浏览器解析执行;功能:可以用来增强和html页面的交互过程,可以来控制html元素,让页面有一些动态的效果,增强用户的体验;ECMAScript:客户端脚本语言的标准;与html的结合方式:1.内部JS:定义<script>标签体内容就是js代码;2.外部js:定义<script>,通过src
2020-08-18 22:55:40
113
原创 2020-8-18 JavaWebDay_05
今天做了个小案例,差不多是这样未写完的两个标签:<select>:下拉列表;子元素:<option><textarea>:文本域;cols:默认列数;rows:默认行数;CSS:页面美化和布局控制;概念:Coscoding Style Sheets(层叠样式表);层叠:多个样式可以做用在同一个html元素上,同时生效;好处:1.功能强大;2.将内容展示和样式控制分离;降低耦合度,解耦;让分工协作更容易;提高开发效率
2020-08-18 18:30:41
119
原创 2020-8-18 JavaWebDay_05
熬夜伤身体啊,残念…HTML标签:表单:概念:用于采集用户输入的数据的,用于和服务器进行交互使用的标签;表单标签:<form>:用于定义表单的,可以定义一个范围,代表采集用户数据的范围;属性:action:提交数据的URL,#代表本页面;method:指定提交方式;get:1.请求参数会在地址栏中显示,会封装到请求行中;2.请求参数的长度有限制;3.不太安全;post:1.请求参数不会在地址栏显示,会封装在请求体中;2.请求参数的长度没有限制
2020-08-18 11:12:27
137
原创 2020-8-17JavaWebDay_04
今天晚上写了一个html静态网页,一不小心写到18号去了B/S架构详解:资源分类:1.静态资源;2.动态资源;1.使用静态网页开发技术发布的资源:特点:所有用户访问得到的结果都一样;如:文本,图片,音频,视频,HTML,CSS,JavaScript;如果用户请求的是静态资源,那么服务器会直接将静态资源发送给浏览器,浏览器内置的静态资源解析引擎可以将静态资源展示;2.使用动态网页技术发布的资源:特点:所有用户访问,得到的结果可能不一样;如:jsp/servlet,
2020-08-18 00:42:27
152
原创 2020-8-17 JavaWebDay_04
Spring JDBC:简介:Spring提供的JDBC简单封装,提供了一个JDBCTemplate对象简化JDBC的开发;步骤:1.导入jar包;2.创建JdbcTemplat对象,依赖于数据源DataResource(通过DruidDataResourceFactory创建);3.调用方法来完成CRUD的操作;Update(sql,Object args..):执行DML语句;queryForMap:将结果封装为Map集合对象,结果集的长度只能为1,列名为key,值为value
2020-08-17 16:55:57
139
原创 2020-8-17 JavaWebDay_04
PreparedStatement:SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题;解决sql注入问题:使用PreparedStatement对象:预编译的sql语句的对象;预编译sql语句:参数使用?占位符;步骤:1.导入驱动;2.注册驱动;3.获取连接;4.定义sql(参数使用?占位符);5.获取执行对象:Connection.preparedStatement(sql);6.给?赋值;方法:setXx
2020-08-17 10:32:13
141
原创 2020-8-16 JavaWebDay_03
JDBC:ResultSet:结果集对象,封装查询结果;方法:boolean next():游标向下移动一行,如果当前列不是最后一行,返回true,是,返回false;getXxx(参数):获取数据;Xxx:代表数据类型,如int,String;参数:1.int:代表列的编号;2.String:代表列名称:可以使用while(resultset.next()){ int age=resultset.get("age"); .....}语法来循环读取;JD
2020-08-16 23:12:24
97
原创 2020-8-16 JavaWebDay_03
事务:事务的四大特征:1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败;2.持久性:如果事务一旦提交或者回滚后,数据库会持久化的保存数据;3,隔离性:多个事务之间,相互独立;4.一致性:事务操作前后,数据总量不变;事务的隔离级别:概念:多个事务之间是隔离的,相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题;存在问题:1.脏读;2.不可重复读(虚读);3.幻读;脏读:一个事务读取到另一个事务中没有提交
2020-08-16 17:05:34
146
原创 2020-8-16 JavaWebDay_03
多表查询:笛卡尔积:由两个集合A,B,取这两个集合的所有组成情况;要完成多表查询,需要先消除无用的数据;多表查询的分类:1.内连接查询;2.外连接查询;3.子查询;内连接查询:隐式内连接:语法:select 字段列表 from 表名列表 where 条件;使用where条件消除无用的数据;显示内连接:语法;select 字段列表 from 表名1 [inner] join 表名2 on 条件;内连接查询需要确定的前提:1.从那些表中查询数据;2.条件是什
2020-08-16 10:34:35
100
原创 2020-8-15 JavaWebDay_02
约束:外键约束:1.在创建表示可以添加外键;语法:create table 表名( ...... 外键列 constraint 外键名称 foreign key(外键列名) references 主表名称(需要绑定的列名称) )2.删除外键:alter table 表名 drop foreign key 外键名称;3.添加外键:alter table 表名 add constraint 外键名称 foreign key(外键列名) references 主表名
2020-08-15 22:26:04
106
原创 2020-8-15 JavaWebDay_02
DDL:操作表:查询:1.查询某个数据库中所有的表名称:show tables;2.查询表结构:desc 表名;修改:1.修改表名:alter table 表名 rename to 新的表名;2.修改表的字符集:alter table 表名 character set 字符集名称;3.添加一列:alter table 表名 add 列名 数据类型;4.修改列名称 类型:alter table 表名 change 被修改列名 修改后列名 新数据类型;al
2020-08-15 17:19:48
124
原创 2020-8-15 JavaWebDay_02
MySQL:MySQL数据库软件:1.安装;2.卸载:找到mysql的安装目录,找到my.ini文件,复制datedir="C:/ProgramData/MySQL/...Data/";卸载MySQL;删除C:/ProgramData目录下的MySQL文件夹;3.配置:MySQL服务启动:1.手动;2.cmd-->servicesmsc 打开服务的窗口;3.net stop/start mysql(cmd使用管理员打开);MySQL登录:1.mysql -
2020-08-15 11:31:58
152
原创 2020-8-14 JavaWebDay_01
注解:自定义注解:格式:元注解;public @interface 注解名称{ 属性列表}本质:注解本质上就是一个接口该接口默认继承Annocation接口;属性:接口中可以定义的成员方法(抽象方法);要求:1.属性的返回值类型:基本数据类型;String;枚举;注解;以上类型的数组;2.定义了属性,在使用时需要给属性赋值;如果定义属性时,用default关键字给属性默认初始化值,则使用注解时可以不用给属性赋值;如果只有一个属性需要赋值,且
2020-08-14 23:05:27
151
原创 2020-8-14 JavaWebDay_01
Junit单元测试:测试分类:1.黑盒测试:不需要写代码,给输入值,看程序是否输出期望值;2.白盒测试:需要写代码,关注程序执行流程;Junit使用:白盒测试;步骤:1.定义一个测试类(测试用例); 建议:测试类名:被测试的类名+Test; 包名:xxx.xxx.xx.test;2.定义测试方法:可以独立运行; 建议:方法名:test+测试的方法名 返回值:void 参数列表:空参;3.给方法加@Test;4.导入junit依赖环境;
2020-08-14 17:27:58
111
原创 2020-8-14 JDK新特性(5,7,8)
JDK5:自动拆箱和装箱泛型增强for循环静态导入可变参数枚举 :是指将变量的值一一列出来,变量的值只限于列举出来的位的范围内;通过enum来实现枚举类;public enum 类名{ 枚举项1,2,3.... }注意事项:1.定义枚举类要用关键字enum;2.所有枚举类都是enum的子类;3.枚举类的第一行必须是枚举项,最后一个枚举项后的分号可以省略,但如果枚举项后还有内容则不能省略,建议不省略;4.枚举类可以有构造器,但必须用private修饰,默认构造器
2020-08-14 11:57:23
133
原创 2020-8-13 网络编程_02
InetAdress:1.public static InetAdress getBytes(String host):获取主机ip地址的封装对象;2.public String getHostName():返回主机名;3.public String getHostAdress():获取ip地址;端口:物理端口:网卡口;逻辑端口:1.每个网络程序都有至少一个逻辑端口;2.用于表示进程的逻辑地址,不同进程的标识;3.有效端口:0-65535,其中0-1024为系统使用或保留
2020-08-13 16:53:08
97
原创 2020-8-13 网络编程_01
昨天中午下午学的GUI有点抽象,就不写了网络编程:网络模型:OSI(开放系统互联)参考模型;TCP/IP参考模型;分层:应用层:主要是终端的应用;表示层:主要是进行对接收的数据进行解释,加密与解密,压缩与解压缩;会话层:通过传输层建立数据传输的通路;传输层;定义了一些传输数据的协议和端口号;网络层:主要讲从下层收到的数据进行了IP地址的封装与解封装;数据链路层:主要将从物理层接受的数据进行MAC地址的封装与解封装;物理层:主要定义物理设备标准;网络参考模型图:
2020-08-13 11:13:24
93
原创 2020-8-12 多线程_02
多线程实现方式3(依赖于线程池):实现Callable<T>接口,重写call方法,T是call()方法返回值,返回值可以通过Future<T>接收,并通过get方法获取;好处:可以有返回值;可以抛出异常;弊端:代码较复杂,所以一般不用;匿名内部类使用多线程:new Thread(){代码........}.start();(继承自Thread类)new Thread(new Runnable(){代码......}){(如果在该括号内重写,运行时将运行该
2020-08-12 11:20:28
111
原创 2020-8-11 多线程_01
今天和爹妈出去恰烤鱼,回来的有点晚。。。。JDK5中lock锁的使用:lock:void lock():获取锁;void unlock():释放锁;ReentrantLock():lock的实现类;死锁问题:如果出现了同步嵌套,就容易产生死锁问题;死锁:是指两个或以上的线程在执行的过程中,因争夺资源产生的一种相互等待现象;生产者消费者案例:1.如果消费者先抢到CPU执行权,就回去消费数据,但是现在的数据是默认值,无意义,需要等到生产者生产后再消费;2.如果生产者先抢到CP
2020-08-12 00:17:16
175
1
原创 2020-8-11 IO流_04
打印流:打印流写数据:1.write(数据类型 ~):2.print(数据类型 ~):3.println(数据类型 ~):自动换行;自动刷新:PrintWriter pw=new PrintWriter(Writer out,boolean autoFlush);刷新println,printf,format;标准输入输出流:System中的字段:in,out;它们各代表了系统标准的输入和输出设备;默认输入设备为键盘,输出设备是显示器;System.in的类型是Inp
2020-08-11 18:37:46
95
原创 2020-8-11 IO流_03
字符缓冲流:循环读写:字符输出流为bw,字符输入流为br;String line=null;while((line=br.read)!=null){ bw.write(line); bw.newline(); bw.flush(); }LineNumberReader:特有功能:1.setLineNumber(int num):设置当前行号;2.getLineNumber():获取当前行号;操作基本数据的流:数据输出流:DataOutputStream;
2020-08-11 11:26:14
117
原创 2020-8-10 IO流_02
IO流:概述:IO流用来处理设备之间的数据传输,上传文件和下载文件;java对数据的操作是通过流的方式进行;java用于操作流的对象都在IO包中;分类:根据数据流向:输入流 读入数据;输出流 写出数据;按照数据类型:字节流字符流;使用:如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流,其他用字节流(诸如图片,视频等);如果不清楚,就用字节流;IO流常用基类:字节流的抽象基类:InputStream,OutputStream
2020-08-11 00:12:11
212
原创 2020-8-10 IO流_01
Throwable:成员方法:1.getMessage():获取异常信息,返回字符串;2.toString():获取异常类名和异常信息,返回字符串;3.printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void;4.printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中以便查阅;throws:概述:定义功能方法时,需要把出现的问题暴露出来让调用者来处理,那么就通过throws在方法上标识;格
2020-08-10 18:00:25
81
原创 2020-8-10 集合框架_02
Map:概述:将键映射到值得对象,一个映射不能包含重复的键,每个键最多只能映射一个值;Map和Collection的区别:1.Map是双列的,Collection是单列的;2.Map的键唯一,Collection的子体系Set是唯一的;3.Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结果是针对元素有效;成员方法:1.添加功能:V put(K key,V value):添加元素;2.删除功能:void clear():移除所有键值对元素;V
2020-08-10 11:30:20
95
原创 2020-8-9 集合框架_01
泛型:概述:一种特殊的类型,是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的类型;格式:<数据类型>(只能是引用类型);好处:把运行时期的问题提前到了编译时期,避免了强制类型转换,优化了程序设计,解决了黄色警告线(eclipse);泛型应用:泛型类:把泛型定义在类上;格式:public class 类名<泛型,...>;泛型方法:把泛型定义在方法上;格式:public <泛型类型> 返回类型 方法名(泛型类型);泛
2020-08-09 23:30:53
116
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人