深度学习篇---计算机视觉任务模型的剪裁、量化、蒸馏
文章目录
- 前言
- 第一部分:计算机视觉任务
- 图像分类
- 特点
- 图像识别
- 特点
- 目标检测
- 特点
- 图像分割
- 子任务
- 特点
- 第二部分:模型剪裁、量化、蒸馏
- 模型剪裁
- 1.权重剪裁
- 2.结构剪裁
- 3.迭代剪裁
- 模型量化
- 1.对称量化
- 2.非对称量化
- 3.动态量化
- 4.静态量化
- 知识蒸馏
- 1.训练教师网络
- 2.软标签生成
- 3.学生网络训练
- 区别
- 1.模型剪裁
- 2.模型量化
- 3.知识蒸馏
- 第三部分:模型的剪裁、量化、蒸馏框架中的实现
- PaddlePaddle
- 1.模型量化
- 2.模型剪裁
- 3.知识蒸馏
- PyTorch
- 1.模型量化
- 2.模型剪裁
- 3.知识蒸馏
- 总结
前言
以上就是今天要讲的内容,本文简单介绍了计算机视觉任务以及模型的剪裁、量化、蒸馏。
第一部分:计算机视觉任务
在深度学习领域,图像分类、图像识别、目标检测和图像分割是几种常见的计算机视觉任务,它们各自有不同的应用场景和任务目标。以下是这些应用的区别:
图像分类
图像分类(Image Classification): 图像分类是最基础的计算机视觉任务。它的目的是将给定的图像划分到预定义的类别中。具体来说,就是输入一张图片,输出这张图片属于哪一个类别。例如,将一张图片分类为“猫”或“狗”。
特点
- 只需要一个输出,即图片的类别。
- 不需要定位图像中的对象。
- 应用广泛,如垃圾邮件检测、疾病诊断等。
图像识别
图像识别(Image Recognition): 图像识别有时与图像分类是同义的,但通常它指的是更复杂的任务,不仅包括分类,还可能包括检测、识别和定位图像中的多个对象。
特点
- 可能需要识别图像中的多个对象及其位置。
- 输出可以是图像中对象的类别和位置。
- 例如,识别照片中的多个人脸并指出它们是谁。
目标检测
目标检测(Object Detection): 目标检测不仅识别图像中的对象,还确定这些对象的位置和每个对象的具体边界(通常用边界框表示)。
特点
- 需要输出对象的类别和位置(边界框坐标)。
- 可以检测图像中的多个对象。
- 应用包括自动驾驶汽车中的物体检测、监控视频分析等。
图像分割
图像分割(Image Segmentation): 图像分割是将图像划分为多个部分或对象的过程,其目的是识别图像中每个像素所属的对象类别。
子任务
- 语义分割(Semantic Segmentation):将每个像素分类到预定义的类别中,但不区分同一类别的不同实例。例如,将道路图像中的每个像素分类为“道路”、“人行道”、“车辆”等。
- 实例分割(Instance Segmentation):不仅对每个像素进行分类,还区分同一类别的不同实例。例如,在一张图片中区分每一只不同的猫。
特点
- 需要高精度的像素级标注。
- 输出通常是像素级别的掩码,指示每个像素的对象类别。
- 应用包括医疗图像分析、机器人导航等。
总结来说,这些任务的区别在于:
- 图像分类:最简单,只关心整体图像的类别。
- 图像识别:可能涉及分类和检测,但重点在于识别图像中的对象。
- 目标检测:不仅识别对象,还确定它们的位置。
- 图像分割:最复杂,需要对图像中的每个像素进行分类,区分不同的对象实例。
第二部分:模型剪裁、量化、蒸馏
在深度学习中,模型剪裁、量化、蒸馏等简化措施是为了
- 减少模型的复杂性
- 降低计算资源的需求
- 加快推理速度以及减少模型大小
- 尽量保持模型的性能。
以下是这些措施的详细解释:
模型剪裁
模型剪裁(Model Pruning): 模型剪裁是一种减少模型大小和计算量的技术,通过移除网络中不重要的权重或神经元来实现。
以下是模型剪裁的几种常见方法:
1.权重剪裁
权重剪裁:直接移除绝对值较小的权重,认为这些权重对模型的贡献较小。
2.结构剪裁
结构剪裁:移除整个神经元或滤波器,这通常需要基于某些准则,如神经元的重要性评分。
3.迭代剪裁
迭代剪裁:在训练过程中多次进行剪裁,逐渐减少网络大小。
剪裁可以减少模型的过参数化,提高模型的泛化能力,并且可以减少模型的存储和计算需求。
模型量化
模型量化(Model Quantization): 模型量化是将模型的权重和激活从浮点数转换为低比特宽度的整数,这样可以减少模型大小并加速推理。量化可以分为以下几种类型:
1.对称量化
对称量化:权重和激活被量化到相同的范围,使用相同的尺度因子。
2.非对称量化
非对称量化:权重和激活可以有不同的范围和尺度因子。
3.动态量化
动态量化:在运行时动态确定量化参数。
4.静态量化
静态量化:在训练后离线确定量化参数。
量化可以显著减少模型大小,降低内存占用,并提高推理速度,尤其是在不支持浮点运算的硬件上。
知识蒸馏
知识蒸馏(Knowledge Distillation): 知识蒸馏是一种将大型、复杂的教师网络(Teacher Network)的知识转移到小型学生网络(Student Network)上的技术。
这个过程通常包括以下步骤:
1.训练教师网络
训练教师网络:首先训练一个大型、高精度的网络。
2.软标签生成
软标签生成:使用教师网络的输出(通常是softmax层的输出)作为软标签来训练学生网络。
3.学生网络训练
学生网络训练:学生网络同时学习硬标签(真实标签)和软标签,以模仿教师网络的行为。
知识蒸馏允许小型网络捕获大型网络的行为,从而在不牺牲太多性能的情况下减少模型大小和计算量。
区别
1.模型剪裁
模型剪裁:直接减少模型中的参数数量,可能需要重新训练或微调模型以恢复性能。
2.模型量化
模型量化:减少模型中数值的精度,通常不需要重新训练,但可能需要微调。
3.知识蒸馏
知识蒸馏:转移知识而不是直接减少参数,学生网络可能比剪裁或量化后的网络更小,但能保持更高的性能。
这些技术可以单独使用,也可以组合使用,以达到更好的模型压缩和加速效果。在实际应用中,选择哪种简化措施取决于具体的需求、硬件限制和性能目标。
第三部分:模型的剪裁、量化、蒸馏框架中的实现
在PaddlePaddle和PyTorch框架下实现模型的量化、剪裁和蒸馏涉及不同的步骤和API。以下是每个步骤的基本示例代码。
PaddlePaddle
1.模型量化
PaddlePaddle提供了**PaddleSlim**工具来进行模型压缩,包括量化。import paddle
from paddleslim.quant import quant_aware, convert#加载预训练模型
model = paddle.vision.models.resnet50(pretrained=True)#量化配置
quant_config = {'weight_preprocess_type': None,'activation_preprocess_type': None,'weight_quantize_type': 'channel_wise_abs_max','activation_quantize_type': 'moving_average_abs_max','quantize_op_types': ['conv2d', 'mul'],'onnx_format': False
}#量化感知训练
quant_aware_config = quant_aware(model, quant_config)#训练量化模型...
#这里省略了训练代码#量化模型转换
quant_model = convert(quant_aware_config, model)#保存量化模型
paddle.jit.save(quant_model, 'quant_model/model')
2.模型剪裁
from paddleslim.dygraph import L1NormFilterPruner#初始化剪裁器
pruner = L1NormFilterPruner(model, [100, 100, 100, 100])#计算剪裁比例
pruner.prune_vars([{'ratio': 0.2, 'scope': model.conv1}])#应用剪裁
pruner.apply()#重新训练模型...
#这里省略了训练代码
3.知识蒸馏
from paddleslim.dist import distillationteacher_model = paddle.vision.models.resnet50(pretrained=True)
student_model = paddle.vision.models.mobilenet_v1()#知识蒸馏配置
distill_config = {'teacher_feature_map': 'teacher_model.layer4.2.conv3','student_feature_map': 'student_model.conv2_2.conv','loss': 'l2','weight': 1.0
}#应用知识蒸馏
distiller = distillation(teacher_model, student_model, distill_config)#训练学生模型...
#这里省略了训练代码
PyTorch
1.模型量化
PyTorch提供了torch.quantization模块来进行模型量化。
import torch
import torch.nn as nn
import torch.quantization#加载预训练模型
model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)#量化准备
model.qconfig = torch.quantization.default_qconfig
torch.quantization.prepare(model, inplace=True)#训练量化模型...
#这里省略了训练代码#量化模型转换
torch.quantization.convert(model, inplace=True)#保存量化模型
torch.save(model.state_dict(), 'quant_model.pth')
2.模型剪裁
PyTorch中没有内置的剪裁API,但可以使用以下方式:
#假设我们有一个预训练的模型
model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)#剪裁模型
for name, module in model.named_modules():if isinstance(module, nn.Conv2d):# 剪裁比例prune_ratio = 0.2# 应用剪裁torch.nn.utils.prune.l1_unstructured(module, 'weight', amount=prune_ratio)#重新训练模型...
#这里省略了训练代码
3.知识蒸馏
from torch.nn import functional as Fteacher_model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet50', pretrained=True)
student_model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=False)#知识蒸馏损失函数
def distillation_loss(student_output, teacher_output, temperature):return F.kl_div(F.log_softmax(student_output / temperature, dim=1),F.softmax(teacher_output / temperature, dim=1)) * (temperature ** 2)#训练学生模型...
#这里省略了训练代码,包括前向传播、计算蒸馏损失和反向传播
请注意,上述代码仅为示例,实际应用时需要根据具体模型和任务进行调整。例如,训练循环、损失函数、优化器设置等都是必要的,但在这里没有详细展示。此外,量化、剪裁和蒸馏的过程中可能需要微调超参数以达到最佳性能。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了计算机视觉任务区别以及模型的剪裁、量化、蒸馏。
相关文章:
深度学习篇---计算机视觉任务模型的剪裁、量化、蒸馏
文章目录 前言第一部分:计算机视觉任务图像分类特点 图像识别特点 目标检测特点 图像分割子任务特点 第二部分:模型剪裁、量化、蒸馏模型剪裁1.权重剪裁2.结构剪裁3.迭代剪裁 模型量化1.对称量化2.非对称量化3.动态量化4.静态量化 知识蒸馏1.训练教师网络…...
java-关键字(final,static)
关键字 final 和 static 是两个常用的关键字,它们分别用于不同的场景,具有不同的作用。 final final 关键字用于表示某个实体是不可变的。它可以应用于变量、方法和类。 final 变量 当 final 用于变量时,表示该变量一旦被初始化后&#…...
游戏引擎 Unity - Unity 设置为简体中文、Unity 创建项目
Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...
JDK17主要特性
JDK 17,也被称为Java 17或Java Platform, Standard Edition 17,是Java编程语言的第十七个主要版本,由Oracle公司在2021年9月发布。Java 17是一个长期支持(LTS,Long-Term Support)版本,这意味着它…...
将OneDrive上的文件定期备份到移动硬盘
背景: 我在oneDrive上存了很多文件,分布在多个文件夹中,也有套了好几层文件夹的情况。我希望每隔一段时间,将oneDrive上的所有文件向移动硬盘上拷贝一份,但是我只想将距离上一次向移动硬盘拷贝的文件相比,发…...
【Elasticsearch】geohex grid聚合
在 Elasticsearch 中,地理边界过滤是一种用于筛选地理数据的技术,它可以根据指定的地理边界形状(如矩形、多边形等)来过滤符合条件的文档。这种方法在地理空间数据分析中非常有用,尤其是在需要将数据限制在特定地理区域…...
crewai框架第三方API使用官方RAG工具(pdf,csv,json)
最近在研究调用官方的工具,但官方文档的说明是在是太少了,后来在一个视频里看到了如何配置,记录一下 以PDF RAG Search工具举例,官方文档对于自定义模型的说明如下: 默认情况下,该工具使用 OpenAI 进行嵌…...
算法 哈夫曼树和哈夫曼编码
目录 前言 一,二进制转码 二,哈夫曼编码和哈夫曼树 三,蓝桥杯 16 哈夫曼树 总结 前言 这个文章需要有一定的树的基础,没学过树的伙伴可以去看我博客树的文章 当我们要编码一个字符串转成二进制的时候,我们要怎么…...
TCP 丢包恢复策略:代价权衡与优化迷局
网络物理层丢包是一种需要偿还的债务,可以容忍低劣的传输质量,这为 UDP 类服务提供了空间,而对于 TCP 类服务,可以用另外两类代价来支付: 主机端采用轻率的 GBN 策略恢复丢包,节省 CPU 资源,但…...
Sumatra PDF:小巧免费,满足多样阅读需求
Sumatra PDF是一款完全免费的本地阅读器软件,以小巧的体积和全面的功能受到用户青睐。如今,它已经更新到3.3版本,带来了更多实用功能,尤其是新增的注释功能,值得我们再次关注。 软件特色 轻量级体积:压缩…...
vue2-给data动态添加属性
vue2-给data动态添加属性 1. 问题的来源 在VUe2中(VUE3中使用了proxy,及时动态添加也能实现响应式),如果我们动态给data添加一个属性,会发现视图没有同步更新举个例子我们通过v-for遍历data中的一个属性list…...
TiDB 分布式数据库多业务资源隔离应用实践
导读 随着 TiDB 在各行业客户中的广泛应用 ,特别是在多个业务融合到一套 TiDB 集群中的场景,各企业对集群内多业务隔离的需求日益增加。与此同时,TiDB 在多业务融合场景下的资源隔离方案日趋完善,详情可参考文章 《你需要什么样的…...
105,【5】buuctf web [BJDCTF2020]Easy MD5
进入靶场 先输入试试回显 输入的值成了password的内容 查看源码,尝试得到信息 什么也没得到 抓包,看看请求与响应里有什么信息 响应里得到信息 hint: select * from admin where passwordmd5($pass,true) 此时需要绕过MD5()函…...
BFS(广度优先搜索)——搜索算法
BFS,也就是广度(宽度)优先搜索,二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS(深度优先搜索)。从字面意思也很好理解,DFS就是一条路走到黑,BFS则是一层一层地展开。…...
33.Word:国家中长期人才发展规划纲要【33】
目录 NO1.2样式 NO3 图表 NO4.5.6 开始→段落标记视图→导航窗格→检查有无遗漏 NO1.2样式 F12/另存为:Word.docx:考生文件夹样式的复制样式的修改 样式的应用(没有相似/超级多的情况下)——替换 [ ]通配符&#x…...
gym-anytrading
参考:https://github.com/upb-lea/gym-electric-motor AnyTrading 是一组基于 reinforcement learning (RL) 的 trading algorithms(交易算法)的 OpenAI Gym 环境集合。 该项目主要用于foreign exchange (FOREX) 和 stock markets (股票市场)…...
如何自定义软件安装路径及Scoop包管理器使用全攻略
如何自定义软件安装路径及Scoop包管理器使用全攻略 一、为什么无法通过WingetUI自定义安装路径? 问题背景: WingetUI是Windows包管理器Winget的图形化工具,但无法直接修改软件的默认安装路径。原因如下: Winget设计限制…...
私有化部署 DeepSeek + Dify,构建你的专属私人 AI 助手
私有化部署 DeepSeek Dify,构建你的专属私人 AI 助手 概述 DeepSeek 是一款开创性的开源大语言模型,凭借其先进的算法架构和反思链能力,为 AI 对话交互带来了革新性的体验。通过私有化部署,你可以充分掌控数据安全和使用安全。…...
Java 进阶 01 —— 5 分钟回顾一下 Java 基础知识
Java 进阶 01 —— 5 分钟回顾一下 Java 基础知识 Java 生态圈Java 跨平台的语言 Java 虚拟机规范JVM 跨语言的平台多语言混合编程两种架构 举例 JVM 的生命周期 虚拟机的启动虚拟机的执行虚拟机的退出 JVM 发展历程 Sun Classic VMExact VMHotSpotBEA 的 JRockitIBM 的 J9 …...
V103开发笔记1-20250113
2025-01-13 一、应用方向分析 应用项目: PCBFLY无人机项目(包括飞控和手持遥控器); 分析移植项目,应用外设资源包括: GPIO, PWM,USART,GPIO模拟I2C/SPI, ADC,DMA,USB等; 二、移植项目的基本…...
在 Spring Boot 项目中,bootstrap.yml 和 application.yml文件区别
在 Spring Boot 项目中,bootstrap.yml 和 application.yml 是两个常用的配置文件,它们的作用和加载顺序有所不同。以下是它们的详细说明: 1. bootstrap.yml 作用: bootstrap.yml 是 Spring Cloud 项目中的配置文件,用于…...
DeepSeek研究员在线爆料:R1训练仅用两到三周,春节期间观察到R1 zero强大进化
内容提要 刚刚我注意到DeepSeek研究员Daya Guo回复了网友有关DeepSeek R1的一些问题,以及接下来的公司的计划,只能说DeepSeek的R1仅仅只是开始,内部研究还在快速推进,DeepSeek 的研究员过年都没歇,一直在爆肝推进研究…...
Java进阶文件输入输出实操(图片拷贝)
Java进阶文件输入输出实操(图片拷贝) 把某个目录下的全部图片,全部拷贝到另外一个目录 package test; import domee.chapter6_7.B; import java.io.*; public class Ex10_10 { public static void main(String[] args) throws IOException { …...
Spring Boot统一异常拦截实践指南
Spring Boot统一异常拦截实践指南 一、为什么需要统一异常处理 在Web应用开发中,异常处理是保证系统健壮性和用户体验的重要环节。传统开发模式中常见的痛点包括: 异常处理逻辑分散在各个Controller中错误响应格式不统一敏感异常信息直接暴露给客户端…...
LLM推理--vLLM解读
主要参考: vLLM核心技术PagedAttention原理 总结一下 vLLM 的要点: Transformer decoder 结构推理时需要一个token一个token生成,且每个token需要跟前序所有内容做注意力计算(包括输入的prompt和该token之前生成的token…...
vscode软件操作界面UI布局@各个功能区域划分及其名称称呼
文章目录 abstract检查用户界面的主要区域官方文档关于UI的介绍 abstract 检查 Visual Studio Code 用户界面 - Training | Microsoft Learn 本质上,Visual Studio Code 是一个代码编辑器,其用户界面和布局与许多其他代码编辑器相似。 界面左侧是用于访…...
PyQt6/PySide6 的 QTreeView 类
QTreeView 是 PyQt6 或 PySide6 库中用于显示分层数据的控件。它适用于展示树形结构的数据,如文件系统、组织结构等。QTreeView 也是基于模型-视图架构的,通常与 QAbstractItemModel 的子类(如 QStandardItemModel 或自定义模型)一…...
一键开启/关闭deepseek
一键开启/关闭 Deepseek对应下载的模型一键开启 Deepseek,一键关闭Deepseek双击对应的bat,就可以启动https://mbd.pub/o/bread/Z56YmpZvbat 下载:https://mbd.pub/o/bread/Z56YmpZv 可以自己写下来,保存成bat文件,也可…...
单纯接入第三方模型就无需算法备案了么?
随着人工智能技术的快速发展,越来越多的企业开始接入第三方模型以提升自身业务能力。然而,关于算法备案的问题也引发了诸多讨论,尤其是单纯接入第三方模型是否需要备案这一问题,更是让不少企业感到困惑。 一、明确算法备案的主体…...
实现一个 LRU 风格的缓存类
实现一个缓存类 需求描述豆包解决思路:实现代码:优化11. std::list::remove 的时间复杂度问题2. 代码复用优化后的代码优化说明 优化21. 边界条件检查2. 异常处理3. 代码封装性4. 线程安全优化后的代码示例优化说明 DeepSeek(深度思考R1&…...
