pytorch 融合 fuse 学习笔记
目录
fuse_lora 作用是什么
fuse_modules源码解读
fuse_lora 作用是什么
- 在深度学习模型微调场景下(与 LoRA 相关)
- 参数融合功能
- 在使用 LoRA(Low - Rank Adaptation)对预训练模型进行微调后,
fuse_lora
函数的主要作用是将 LoRA 模块学到的参数和原始模型的参数进行融合。以自然语言处理中的 Transformer 架构模型为例,在微调阶段,LoRA 会在模型的某些关键层(如多头注意力层)添加低秩矩阵来调整模型参数。 - 当调用
fuse_lora
函数时,它会根据预定义的规则将这些额外的 LoRA 参数融入到原始模型的权重中。例如,假设原始模型某一层的权重矩阵为,LoRA 模块对应的权重矩阵为(通过微调得到),fuse_lora
函数可能会执行类似于的操作来更新原始权重,使得模型能够以融合后的参数进行推理,避免在推理过程中还需要单独处理 LoRA 模块。
- 在使用 LoRA(Low - Rank Adaptation)对预训练模型进行微调后,
- 优化推理性能
- 从性能角度来看,在模型推理阶段,不融合 LoRA 参数可能会导致额外的计算开销。因为每次进行前向传播计算时,都需要考虑原始模型参数和 LoRA 参数的交互。通过
fuse_lora
函数将参数融合后,推理过程可以直接使用融合后的单一参数集,减少了计算量。 - 例如,在处理大规模文本生成任务时,融合后的模型能够更快地生成文本,因为它在推理时不需要频繁地在原始模型和 LoRA 模块之间切换计算。同时,也减少了内存占用,因为不需要同时存储原始模型和 LoRA 模块的参数,这对于在资源有限的设备(如移动设备或边缘计算设备)上进行模型部署非常重要。
- 从性能角度来看,在模型推理阶段,不融合 LoRA 参数可能会导致额外的计算开销。因为每次进行前向传播计算时,都需要考虑原始模型参数和 LoRA 参数的交互。通过
- 参数融合功能
- 如果是在其他自定义的代码库或特定应用场景下(非典型的 LoRA 关联情况)
- 特定的数据或功能融合
fuse_lora
函数可能被定义为将与 “lora” 相关的数据结构或功能与其他部分进行融合。例如,在一个包含多种通信协议(假设 “lora” 代表一种低功耗广域网通信协议)的物联网软件系统中,fuse_lora
函数可能用于将 Lora 协议相关的数据接收、处理功能与系统的主数据处理模块进行融合。- 这可能涉及整合 Lora 设备发送的数据格式(如传感器数据)到系统通用的数据存储或分析模块中,使得系统能够统一处理来自不同通信源的数据,提高系统的整体性和数据处理效率。具体的融合方式和作用完全取决于函数在该特定应用场景中的定义和设计目的。
- 特定的数据或功能融合
fuse_modules源码解读
转自:pytorch中fuse_modules_pytorch中的fuse函数是什么意思-CSDN博客
1. 官方代码
torch.ao.quantization.fuse_modules — PyTorch 2.5 documentation
2. fuse_modules源码解读
仅融合以下序列:
conv, bn
conv, bn, relu
conv, relu
linear, relu
bn, relu
网络中所有其他序列保持不变,对于上述序列,用融合的模块替换列表中的第一项,用identity替换其余模块。
fuse_modules
def fuse_modules(model, modules_to_fuse, inplace=False, fuser_func=fuse_known_modules, fuse_custom_config_dict=None):
1
model:要进行操作的模型名称
modules_to_fuse:要融合的模块名称的列表。如果只有一个要融合的模块列表,可以是一个字符串列表,如:[‘conv1’, ‘bn1’, ‘relu’]
inplace:bool类型参数,默认为false。融合发生在模型上,默认会返回一个新模型
fuser_func:接收模块列表并输出相同长度的融合模块列表的函数。例如,fuser_func([convModule, BNModule]) 返回 [ConvBNModule, nn.Identity()] 。 默认为 fuse_known_modules
fuse_custom_config_dict :自定义配置,默认为none
fuse_known_modules
将给定的模块列表mod_list中的一些常见模块进行融合,返回融合后的模块列表。融合后的模块可以有效地减少模型计算量和内存占用,从而提高模型的计算效率。
参数:mod_list:一个包含了一系列PyTorch模块对象的列表,这些模块可以是常见的卷积、线性、批归一化等模块。
is_qat:指定模型是否使用量化感知训练(true使用,false不使用)
additional_fuser_method_mapping:一个可选的字典,用于指定额外的融合方法。字典的key是要融合的模块类型,value是一个融合函数,它将被用于融合指定类型的模块。默认为None。
def fuse_known_modules(mod_list, is_qat, additional_fuser_method_mapping=None):r"""Returns a list of modules that fuses the operations specifiedin the input module list.Fuses only the following sequence of modules:conv, bnconv, bn, reluconv, relulinear, bnlinear, reluFor these sequences, the first element in the output module list performsthe fused operation. The rest of the elements are set to nn.Identity()"""types = tuple(type_before_parametrizations(m) for m in mod_list)fuser_method = get_fuser_method(types, additional_fuser_method_mapping)if fuser_method is None:raise NotImplementedError("Cannot fuse modules: {}".format(types))new_mod : List[Optional[nn.Module]] = [None] * len(mod_list)fused = fuser_method(is_qat, *mod_list)# NOTE: forward hooks not processed in the two following for loops will be lost after the fusion# Move pre forward hooks of the base module to resulting fused modulefor handle_id, pre_hook_fn in mod_list[0]._forward_pre_hooks.items():fused.register_forward_pre_hook(pre_hook_fn)del mod_list[0]._forward_pre_hooks[handle_id]# Move post forward hooks of the last module to resulting fused modulefor handle_id, hook_fn in mod_list[-1]._forward_hooks.items():fused.register_forward_hook(hook_fn)del mod_list[-1]._forward_hooks[handle_id]new_mod[0] = fusedfor i in range(1, len(mod_list)):identity = nn.Identity()identity.training = mod_list[0].trainingnew_mod[i] = identityreturn new_mod
'
运行运行
在融合前,首先获取mod_list中每个模块的类型,并将它们作为一个元组存储在types变量中。这个元组中的类型用于选择要使用的模块融合方法。在默认情况下,该函数支持一些特定的模块序列进行融合。如果输入模块序列不符合这些支持的模式,则函数会尝试使用 additional_fuser_method_mapping 中定义的自定义融合函数fuser_method。
融合方法fuser_method :使用get_fuser_method() 函数根据types来选择一个合适的融合函数。
– 在 get_fuser_method函数中调用了字典DEFAULT_OP_LIST_TO_FUSER_METHOD(定义了元组和融合函数之间的映射关系)。下面仅展示部分2d模块融合
DEFAULT_OP_LIST_TO_FUSER_METHOD: Dict[Tuple, Union[nn.Sequential, Callable]] = {(nn.Conv2d, nn.BatchNorm2d): fuse_conv_bn,(nn.Conv2d, nn.BatchNorm2d, nn.ReLU): fuse_conv_bn_relu,(nn.Conv2d, nn.ReLU): sequential_wrapper2(nni.ConvReLU2d),(nn.Linear, nn.BatchNorm1d): fuse_linear_bn,(nn.Linear, nn.ReLU): sequential_wrapper2(nni.LinearReLU),(nn.BatchNorm2d, nn.ReLU): sequential_wrapper2(nni.BNReLU2d),
}
如果在特定模块序列的additional_fuser_method_mapping中提供了自定义fuser函数,则将使用该函数来代替默认的fuser函数。如果找不到合适的fuser函数,该函数将引发NotImplementedError
定义new_mod :使用 [None] * len(mod_list)创建一个长度为len(mod_list)的列表,这个列表中,每个元素都是一个nn.Module类型的可选对象,初始值为None。
融合后的新模块fused:使用fuser_method调用对应的融合函数,如 fuse_conv_bn(is_qat, conv, bn)得到一个模块融合后的新的模块(ConvBn2d)。该模块包含了卷积层和BN层的参数,并将其组合成一个新的运算,该融合模块的名称默认为ConvBn2d、ConvBn1d或ConvBn3d。fuse_conv_bn函数在后面进行介绍。
融合后,第一个for循环遍历 mod_list列表中第一个模块(mod_list[0])的handle_id(前向预处理钩子函数的ID)和hook_fn(前向预处理钩子函数,在模块前向传递时会被自动调用,用于执行某些操作,如记录中间结果、打印日志等。)。
– 然后,将这些钩子函数注册到fused模块中,使其能够在后续计算中被调用。
– 接着,从mod_list[0]._forward_pre_hooks字典中删除这些钩子函数,避免这些钩子函数被重复调用。
第一个for循环的作用是将mod_list列表中第一个模块的前向预处理钩子函数从原始模块对象中转移到融合模块对象中,以确保在使用融合模块进行前向传递时,所有需要的操作都能够被执行。
第二个for循环将mod_list列表中最后一个模块的前向钩子函数注册到fused模块中,并从原始模块对象的钩子字典中删除这些钩子函数。
与前向预处理钩子函数不同,前向钩子函数是在模块的前向传递过程中执行的,通常用于在模块输出计算完成后执行某些操作,如统计模型输出分布、进行可视化等。
最后,将融合好的fused模块赋给前面定义的new_mod 列表的第一个元素,最后使用for循环补充identity()到new_mod列表,使其长度和原始模块长度一致。
fuse_conv_bn
将给定的conv和bn模块融合并返回融合后的模块。
在此函数中构建了一个fused_module_class_map字典,用于指定模块类型与对应的融合模块类型之间的映射关系。
如果其类型在fused_module_class_map字典中有对应的融合模块类型,则将这些模块融合为一个新的模块(ConvBn2d),如果没有对应的融合模块类型,则不对其进行融合处理。
def fuse_conv_bn(is_qat, conv, bn):assert(conv.training == bn.training),\"Conv and BN both must be in the same mode (train or eval)."fused_module_class_map = {nn.Conv1d: nni.ConvBn1d,nn.Conv2d: nni.ConvBn2d,nn.Conv3d: nni.ConvBn3d,}if is_qat:assert bn.num_features == conv.out_channels, 'Output channel of Conv2d must match num_features of BatchNorm2d'assert bn.affine, 'Only support fusing BatchNorm2d with affine set to True'assert bn.track_running_stats, 'Only support fusing BatchNorm2d with tracking_running_stats set to True'fused_module_class = fused_module_class_map.get((type(conv)), None)if fused_module_class is not None:return fused_module_class(conv, bn)else:raise NotImplementedError("Cannot fuse train modules: {}".format((conv, bn)))else:return nn.utils.fuse_conv_bn_eval(conv, bn)
'
运行运行
返回调用的 fuse_conv_bn_eval(conv, bn) 函数如下
返回一个新的融合模块,该模块包含了卷积层和BN层的参数,并将其组合成一个新的运算。
def fuse_conv_bn_eval(conv, bn, transpose=False):assert(not (conv.training or bn.training)), "Fusion only for eval!"fused_conv = copy.deepcopy(conv)fused_conv.weight, fused_conv.bias = \fuse_conv_bn_weights(fused_conv.weight, fused_conv.bias,bn.running_mean, bn.running_var, bn.eps, bn.weight, bn.bias, transpose)return fused_conv
'
运行运行
3. fuse_modules实际测试
3.1 modules_to_fuse参数的使用方法
1. 此参数的列表可以包含多个需要融合的组合,子模块列表也可以,使用方法一
方法一:
modules_to_fuse = [ [‘conv1’, ‘bn1’, ‘relu1’], [‘submodule.conv’, ‘submodule.relu’]]
融合ResNet18中layer1的conv和bn层如下:
print('\n Before fusion \n\n', r18_o.layer1)
r18_o.eval()
r18 = torch.quantization.fuse_modules(
r18_o,
[['conv1', 'bn1', 'relu'],
['layer1.0.conv1', 'layer1.0.bn1'], # , 'layer1.0.relu'],
['layer1.0.conv2', 'layer1.0.bn2'],
['layer1.1.conv1', 'layer1.1.bn1'], #, 'layer1.1.relu'],
['layer1.1.conv2', 'layer1.1.bn2']]
)
print('\n After fusion\n\n', r18.layer1)
结果:
ResNet18融合前:(仅显示ResNet18中layer1的网络结构)
ResNet18融合后
此融合只将Conv2d和BN层进行融合,从上面对比可以看到融合后的 (bn) 变成了 identity(),(conv) 中的Conv2d是原本Conv2d和BN融合的。
2. 如果要融合的module被Sequential封装了,可使用方法二
方法二:
torch.quantization.fuse_modules(m, [‘0’, ‘1’, ‘2’], inplace=True)
1. 使用方法二对ResNet18中模块进行融合操作,融合代码如下:
def fuse_model(self):
for m in self.modules():
if type(m) == BasicBlock:
torch.quantization.fuse_modules(m, [['conv1', 'bn1', 'relu'], ['conv2', 'bn2']], inplace=True)
运行运行
此处代码是仿pytorch官方写MobileNetV2模块融合,这部分代码写在 class ResNet(nn.Module) 中,后面融合直接使用model.fuse_model(),得到的方法二融合ResNet18结果如下:
此处是分别对(conv2d、bn、relu)和(conv2d、bn)进行融合融合
2. 使用方法二对MobileNetv2中模块进行融合操作
def fuse_model(self):
for m in self.modules():
if type(m) == ConvBNReLU:
torch.quantization.fuse_modacules(m, ['0', '1', '2'], inplace=True)
if type(m) == InvertedResidual:
for idx in range(len(m.conv)):
if type(m.conv[idx]) == nn.Conv2d:
torch.quantization.fuse_modules(m.conv, [str(idx), str(idx + 1)], inplace=True)
运行运行
结果:
MobileNetv2融合前(下面结果展示的是第一个残差模块,因此没有第一个1x1的卷积)
MobileNetv2融合后
从此对比可以看到,融合前的conv2d、bn、relu融合成了ConvRelu2d(Conv2d,ReLU),这里面的Conv2d是融合前的Conv2d和BN融合的。
相关文章:
pytorch 融合 fuse 学习笔记
目录 fuse_lora 作用是什么 fuse_modules源码解读 fuse_lora 作用是什么 在深度学习模型微调场景下(与 LoRA 相关) 参数融合功能 在使用 LoRA(Low - Rank Adaptation)对预训练模型进行微调后,fuse_lora函数的主要作…...
41 基于单片机的小车行走加温湿度检测系统
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采样DHT11温湿度传感器检测温湿度,滑动变阻器连接数码转换器模拟电量采集传感器, 电机采样L298N驱动,各项参数通过LCD1602显示&#x…...
GitLab: You cannot create a branch with a SHA-1 or SHA-256 branch name
最近在迁移git库,把代码从gerrit迁移到gitlab,有几个库报错如下: GitLab: You cannot create a branch with a SHA-1 or SHA-256 branch name ! [remote rejected] refs/users/73/373/edit-95276/1 -> refs/users/73/373/edit-95276/1 (p…...
YOLOv9改进,YOLOv9引入TransNeXt中的ConvolutionalGLU模块,CVPR2024,二次创新RepNCSPELAN4结构
摘要 由于残差连接中的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉Transformer模型往往无法形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,作者提出了一种聚合注意力(Aggregated Attention),这是一种基于仿生设计的token混合器,模拟了生物的中央凹…...
TorchMoji使用教程/环境配置(2024)
TorchMoji使用教程/环境配置(2024) TorchMoji简介 这是一个基于pytorch库,用于将文本分类成不同的多种emoji表情的库,适用于文本的情感分析 配置流程 从Anaconda官网根据提示安装conda git拉取TorchMoji git clone https://gi…...
uniapp运行时,同步资源失败,未得到同步资源的授权,请停止运行后重新运行,并注意手机上的授权提示。
遇到自定义基座调试时安装无效或无反应?本文教你用 ADB 工具快速解决:打开 USB 调试,连接设备,找到应用包名,一键卸载问题包,清理干净后重新运行调试基座,轻松搞定! 问题场景&#…...
uniapp中父组件调用子组件方法
实现过程(setup语法糖形式下) 在子组件完成方法逻辑,并封装。在子组件中使用defineExpose暴露子组件的该方法。在父组件完成子组件ref的绑定。通过ref调用子组件暴露的方法。 子组件示例 <template> </template><script se…...
腾讯云 AI 代码助手:单元测试应用实践
引言 在软件开发这一充满创造性的领域中,开发人员不仅要构建功能强大的软件,还要确保这些软件的稳定性和可靠性。然而,开发过程中并非所有任务都能激发创造力,有些甚至是重复且乏味的。其中,编写单元测试无疑是最令人…...
ArcGIS栅格影像裁剪工具
1、前言 在最近的栅格转矢量处理过程中,发现二值化栅格规模太大,3601*3601,并且其中的面元太过细碎,通过arcgis直接栅格转面有将近几十万的要素,拿这样的栅格数据直接运行代码,发现速度很慢还难以执行出来结…...
VueWordCloud标签云初实现
文章目录 VueWordCloud学习总结安装初使用在组件中注册该组件简单使用项目中实现最终实现效果 VueWordCloud学习总结 本次小组官网的项目中自己要负责标签模块,想要实现一个标签云的效果,搜索了很多,发现vue有一个VueWordCloud库,…...
AI数据分析工具(二)
豆包-免费 优点 强大的数据处理能力: 豆包能够与Excel无缝集成,支持多种数据类型的导入,包括文本、数字、日期等,使得数据整理和分析变得更加便捷。豆包提供了丰富的数据处理功能,如数据去重、填充缺失值、转换格式等…...
sizeof和strlen区分,(好多例子)
sizeof算字节大小 带\0 strlen算字符串长度 \0之前...
求100之内的素数-多语言
目录 C 语言实现 方法 1: 使用 for 循环 方法 2: 使用埃拉托斯特尼筛法 方法 3: 使用自定义判断素数 Python 实现 方法 1: 使用自定义函数判断素数 方法 2: 使用埃拉托斯特尼筛法(Sieve of Eratosthenes) 方法 3: 使用递归方法 Java 实现 方法…...
0.shell 脚本执行方式
1.脚本格式要求 🥑脚本以 #!/bin/bash 开头 🥦 脚本要有可执行权限 2.执行脚本的两种方式 🥬 方式1:赋予x执行权限 🥒 方式2: sh执行 ...
Web实时通信@microsoft/signalr
概要说明 signalr 是微软对 websocket技术的封装; build() 与后端signalR服务建立链接;使用 on 方法监听后端定义的函数;ps:由后端发起,后端向前端发送数据使用 invoke 主动触发后端的函数;ps:由前端发起&a…...
智截违规,稳保安全 | 聚铭视频专网违规外联治理系统新品正式发布
“千里之堤,毁于蚁穴”。 违规外联作为网络安全的一大隐患, 加强防护已刻不容缓。 这一次, 我们带着全新的解决方案来了 ——聚铭视频专网违规外联治理系统, 重磅登场!...
博弈论算法详解与Python实现
目录 博弈论算法详解与Python实现第一部分:博弈论简介与算法概述1.1 博弈论概述1.2 博弈论算法概述第二部分:纳什均衡算法2.1 纳什均衡的定义2.2 纳什均衡算法的实现2.2.1 算法思路2.2.2 Python实现2.2.3 设计模式分析第三部分:囚徒困境问题的博弈论算法3.1 囚徒困境的定义3…...
Python学习笔记之IP监控及告警
一、需求说明 作为一名运维工程师,监控系统必不可少。不过我们的监控系统往往都是部署在内网的,如果互联网出口故障,监控系统即使发现了问题,也会告警不出来,这个时候我们就需要补充监控措施,增加从外到内的…...
2024/11/30 RocketMQ本机安装与SpringBoot整合
目录 一、RocketMQ简介 1.1、核心概念 1.2、应用场景 1.3、架构设计 2、RocketMQ Server安装 3、RocketMQ可视化控制台安装与使用 4、SpringBoot整合RocketMQ实现消息发送和接收 4.1、添加maven依赖 4.2、yaml配置 4.3、生产者 4.4、消费者 4.5、接口 4.6、接口测试 一、R…...
解决“磁盘已插上,但Windows系统无法识别“问题
电脑上有2块硬盘,一块是500GB的固态硬盘,另一块是1000GB的机械硬盘,按下开机键,发现500G的固态硬盘识别了,但1000GB的机械硬盘却无法识别。后面为了描述方便,将"500GB的固态硬盘"称为X盘…...
解决vue3,动态添加路由,刷新页面出现白屏或者404
解决vue3,动态添加路由,刷新页面出现白屏或者404 1.解决出现刷新页面,出现404的情况 1.问题的出现 在做毕设的时候,在权限路由得到时候,我问通过router**.**addRoute(item)的方式,在路由守卫动态添加路由…...
大数据新视界 -- 大数据大厂之 Hive 数据质量监控:实时监测异常数据(下)(18/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
可视化建模以及UML期末复习篇----相关软件安装
作为一个过来人,我的建议是别过来。 一、可视化建模 <1>定义: 官方:一种使用图形符号来表示系统结构和行为的建模技术。 我:其实说白了就是把工作流程用图形画出来。懂不? <2>作用: 提高理解和分析复杂系统的能力。促…...
Flask项目入门—request以及Response
导入 request(请求)以及Response(响应)通过flask导入,如下: from flask import Blueprint, request, render_template, \jsonify, make_response, Response, redirect, url_for, abort requestÿ…...
【VUE3】【Naive UI】<n-button> 标签
【VUE3】【Naive UI】<n-button> 标签 **type**- 定义按钮的类型,这会影响按钮的颜色和样式。**size**- 设置按钮的大小。**disabled**- 布尔值,控制按钮是否处于禁用状态。**loading**- 布尔值,表示按钮是否处于加载状…...
接口测试工具:reqable
背景 在众多接口测试工具中挑选出一个比较好用的接口测试工具。使用过很多工具,如Postman、Apifox、ApiPost等,基本上是同类产品,一般主要使用到的功能就是API接口和cURL,其他的功能目前还暂未使用到。 对比 性能方面ÿ…...
autoware.universe源码略读(3.20)--perception:radar_tracks_msgs_converter
autoware.universe源码略读3.20--perception:radar_tracks_msgs_converter Overviewradar_tracks_msgs_converter_node Overview 这里看起来是非常简单的一个模块,作用就是把radar_msgs/msg/RadarTracks类型的消息数据转换到autoware_auto_perception_msgs/msg/Tra…...
【论文阅读】Multi-level Semantic Feature Augmentation for One-shot Learning
用于单样本学习的多层语义特征增强 引用:Chen, Zitian, et al. “Multi-level semantic feature augmentation for one-shot learning.” IEEE Transactions on Image Processing 28.9 (2019): 4594-4605. 论文地址:下载地址 论文代码:https:…...
说说Elasticsearch查询语句如何提升权重?
大家好,我是锋哥。今天分享关于【说说Elasticsearch查询语句如何提升权重?】面试题。希望对大家有帮助; 说说Elasticsearch查询语句如何提升权重? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…...
jeecgbootvue2重新整理数组数据或者添加合并数组并遍历背景图片或者背景颜色
想要实现处理后端返回数据并处理,添加已有静态数据并遍历快捷菜单背景图 遍历数组并使用代码 需要注意: 1、静态数组的图片url需要的格式为 require(../../assets/b.png) 2、设置遍历背景图的代码必须是: :style"{ background-image: url( item…...
Vue-常用指令-02
目录 Vue常用指令 实操 v-bind、v-model v-bind v-model 总结 v-on 总结 编辑 v-if、v-show v-if v-show 总结 v-for 总结 综合案例 编辑 Vue常用指令 Vue指令:在HTML文件或者HTML标签中涉及的带有v-..的指令都是Vue的指令。不同指令不同含义不同作用。v-…...
ESLint 配置文件全解析:格式、层叠与扩展(3)
配置文件系统处于一个更新期,存在两套配置文件系统,旧的配置文件系统适用于 v9.0.0 之前的版本,而新的配置文件系统适用于 v9.0.0之后的版本,但是目前还处于 v8.x.x 的大版本。 配置文件格式 在 ESLint 中,支持如下格…...
曲面单值化定理
曲面单值化定理(Uniformization Theorem)是复分析、几何和拓扑学中的一个重要结果。它为紧致黎曼曲面提供了标准化的几何结构,是研究复几何和代数几何的基础。以下是对曲面单值化定理的详细介绍以及其应用场景。 曲面单值化定理的陈述 基本版…...
数据预处理方法—数据增强、数据平衡
1.数据增强 1.1 原理 通过对数据进行变换增加数据的多样性,提高模型泛化能力,常用于图像和文本处理任务。 1.2 核心公式 例如:图像旋转: 其中,R()是旋转矩阵,是旋转角度。 1.3 Python案例 下面是一个…...
从扩散模型开始的生成模型范式演变--SDE
SDE是在分数生成模型的基础上,将加噪过程扩展时连续、无限状态,使得扩散模型的正向、逆向过程通过SDE表示。在前文讲解DDPM后,本文主要讲解SDE扩散模型原理。本文内容主要来自B站Up主deep_thoughts分享视频Score Diffusion Model分数扩散模型…...
基于Java Springboot 协同过滤算法音乐推荐系统
一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue2、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA 数据库&#x…...
【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势?
【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势? 重要性:⭐⭐⭐ 💯 NLP Github 项目: NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练…...
win10中使用ffmpeg的filter滤镜
1 给视频加文字水印 1.1 添加播放时间 ffmpeg -i input.mp4 -vf "drawtextfontfileC\\:/Windows/fonts/consola.ttf:fontsize30:fontcolorwhite:timecode00\:00\:00\:00:rate25:textTCR\::boxcolor0x000000AA:box1:x20:y20" -y output.mp4 在视频的x20:y20位置添加t…...
shell编程7,bash解释器的 for循环+while循环
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
Flutter 1.2:flutter配置gradle环境
1、在android的模块中进行gradle环境配置 ①在 gradle-wrapper.properties文件中将url配置为阿里云镜像,因为gradle的服务器在国外,国内下载非常慢,也可在官网进行下载 gradle版本下载 gradle版本匹配 阿里云镜像gradle下载 可以通过复制链…...
LVS 负载均衡面试题及参考答案
目录 什么是 LVS 负载均衡?它的主要作用是什么? 为什么要使用 LVS 进行负载均衡? LVS 有哪些组成部分? 简述 LVS 的架构。 LVS 中有哪两种典型的架构?请简要说明它们的特点。 LVS 的工作原理是怎样的?简述 LVS 的工作原理。 解释 LVS 中的虚拟服务器(VS)概念。 …...
GaussDB(类似PostgreSQL)常用命令和注意事项
文章目录 前言GaussDB(类似PostgreSQL)常用命令和注意事项1. 连接到GaussDB数据库2. 查看当前数据库中的所有Schema3. 进入指定的Schema4. 查看Schema下的表、序列、视图5. 查看Schema下所有的表6. 查看表结构7. 开始事务8. 查询表字段注释9. 注意事项&a…...
c语言编程1.17蓝桥杯历届试题-回文数字
题目描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。 本题要求你找到一些5位或6位的十进制数字。满足如下要求: 该数字的各个数位之…...
MVC core 传值session
MVC Entity Framework MVC Core session 》》 需要添加 Session 服务 和 Session中间件 builder.Services.AddSession(); app.UseSession(); 》》》控制器中 public IActionResult Privacy(){HttpContext.Session.SetString("key", "123");return View(…...
六:安装服务-compute node
一:工具、环境准备-controller node 二:OpenStack环境准备-controller node 三:安装服务-controller node 四:工具、环境准备-compute node 五:OpenStack环境准备-compute node 六:安装服务-compute node 七…...
【050】基于51单片机计步器【Keil程序+报告+原理图】
☆、设计硬件组成:51单片机最小系统ADXL345三轴加速度传感器LCD1602液晶显示AT24C02存储芯片按键控制。 1、本设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片,LCD1602实时显示; 2、设计采用ADXL345三轴加速度传感器实现对行走步…...
qt QGraphicsPolygonItem详解
1、概述 QGraphicsPolygonItem是Qt框架中QGraphicsItem的一个子类,它提供了一个可以添加到QGraphicsScene中的多边形项。通过QGraphicsPolygonItem,你可以定义和显示一个多边形,包括其填充颜色、边框样式等属性。QGraphicsPolygonItem支持各…...
OpenAI浅聊爬虫
前提 OpenAI越来越火,大有要干掉一片程序员的架势。在此,我们看看Sider(本文使用的OpenAI工具)对爬虫的看法。 爬虫的应用场景 爬虫技术(Web Scraping)有广泛的应用场景,以下是一些主要的应用…...
Java学习,ArrayList
ArrayList 是 Java 集合框架(Collections Framework)中的一个重要类,它实现了 List 接口。ArrayList 基于动态数组的数据结构,能够根据需要自动调整其大小。 关键特性 动态数组:ArrayList 底层使用数组来存储元素&…...
拓扑排序的两种实现
1 按节点结束时间进行排序 拓扑排序针对一张DAG,将所有节点按照结束时间从大到小依次排列。 算法描述为:初始化一个空链表 L L L,对DAG进行DFS,维护一个全局时钟 T T T,记录每个节点的开始时间(从白色变成…...