当前位置: 首页 > news >正文

模型压缩-对模型结构进行优化

模型压缩-对模型结构进行优化

概述

  • 模型压缩通常都是对推断过程而言,训练过程的计算代价通常不考虑,因为GPU可以快速完成任意复杂度模型的训练
  • 对于推断过程来说,模型应用才是对于速度敏感的场景
  • 多数情况下 希望使用尽可能少的能耗完成京可能多的数据处理
  • 推断过程不仅仅需要在CPU设备上完成测试,还需要再低功耗设备完成推断

卷积结构基础优化-空洞卷积

  • 增大感受野,增大感受野基本方式就是增大卷积核大小
  • 增大卷积核大小会增大训练参数 拖慢计算
  • 使用空洞卷积进行优化
  • 空洞卷积将卷积可训练参数之间添加多个1
  • 二维空洞卷积的核心形式就是再普通空洞卷积核心的横向纵向都添加1
  • pytorch中再conv添加dilation参数 默认为1
https://blog.csdn.net/mrjkzhangma/article/details/104929302
  • 关于常规卷积

在这里插入图片描述

  • 关于空洞卷积

在这里插入图片描述

  • 空洞卷积计算:扩张率D,那么就在横纵方向添加D -1 行

在这里插入图片描述

增大感受野的原因

  • 下采样过程中大量池化操作,损失一些信息,再解码重建过程中产生影响

关于分组卷积

  • 将输入特征图按照通道均分为g组,然后对每一组进行常规卷积
  • 由于分组之后,每一组输入特征图的通道数变成Cin / g,那么每一个卷积核的通道数也降低到Cin / g
  • 由于每一组进行的是常规卷积,所以每一组至少需要一个卷积核,也就是分组卷积输出通道数至少为g,那么如果每一组有n个卷积核 输出Cout = n x g, 所以输出通道数是分组数的整数倍
  • 分组卷积中要求输入和输出通道数均能整除分组数g
  • 分组卷积的运算量和参数量的减少,本质原因就是一个卷积核本身通道数减少为原来的g分之一
  • 整个分组卷积的参数量:

在这里插入图片描述

分组卷积的作用

  • 减少运算量和参数,原来的1/g
  • 隔绝不同组的信息交换
  • 如果需要考虑所有输入特征图信息的情况,分组卷积会降低模型的性能,对于这个问题,需要在两个分组卷积之间加入Channel_Shuffle模块打乱通道顺序,从而实现不同分组之间的信息交换

关于分组卷积

import torch
import torch.nn as nn# batch 5 channel 128  大小 28 x 28
x = torch.zeros([5,128,28,28])cnn = nn.Conv2d(128,256,3,groups=2)#  计算cnn 的参数数量  只有一层卷积
#  第一个参数是权重 torch.Size([256, 64, 3, 3])
# 因为分为两组 每一组输入特征图的通道数变成64,然后每一个卷积核的通道数 也是64
# 3 x 3 卷积核 输出256 输入64 总共256个卷积核个数
for var in cnn.parameters():print(var.shape)# cnn = nn.Conv1d(128,256,3,groups=2)
# for var in cnn.parameters():
#     print(var.shape)
from torchvision.models import resnet50,mobilenet_v2
import torch
import timemodel1 = resnet50()
model2 = mobilenet_v2()  # 卷积速度优化# 输入1 输出3  大小 224 x 224
x = torch.randn([1,3,224,224],dtype=torch.float32)# 进行十次推理测试 每一次测试都测量模型推理时间  然后打印结果
for i in range(10):t1 = time.perf_counter()y = model2(x)t2 = time.perf_counter()# 计算推理时间 进行十次推理 发现每一次推理的时间都减小print(f"{t2-t1:.3f}")torch.save(model1.state_dict(),"resnet.pth")#  使用torch.save  保存模型的权重参数  然后以后可以加载这些模型权重  然后重用
torch.save(model2.state_dict(),"mobilenetv2.pth")

关于深度可分离卷积

import torch
import torch.nn as nn
import time# 产生随机测试数据
x = torch.randn([32,64,300,300])
# 定义卷积网络# 逐层卷积  g = Cin = Cout  卷积核大小 3 x 3
cnn1 = nn.Conv2d(64,64,3,groups=64)# 逐点卷积 
cnn2 = nn.Conv2d(64,128,1,groups=1)cnn1.eval() # 推断模型
cnn2.eval() for i in range(10):t1 = time.perf_counter()x = cnn1(x)y = cnn2(x)t2 = time.perf_counter()print(f"{t2 - t1:.3f}")
http://www.lryc.cn/news/158335.html

相关文章:

  • 软件工程课件
  • 基于ADS的marx雪崩电路设计-设计实践(射频脉冲源)
  • X86_64函数调用汇编程序分析
  • Vue3【Provide/Inject】
  • Go-Python-Java-C-LeetCode高分解法-第四周合集
  • vue路由
  • 最强的AI视频去码图片修复模型:CodeFormer
  • jenkins自动化部署安装
  • 如何调用Zabbix API获取主机信息
  • 批量执行redis命令总结
  • 命令行git联网失败,但是实际可以联网
  • 网络编程套接字,Linux下实现echo服务器和客户端
  • java+ssh+mysql智能化办公管理系统
  • 网络层抓包tcpdump
  • QT之形态学操作
  • 15、监测数据采集物联网应用开发步骤(11)
  • Pygame中Trivia游戏解析6-2
  • java 实现命令行模式
  • A - Orac and Models(最长上升子序列——加强版)
  • 【python手写算法】逻辑回归实现分类(含公式推导)
  • 【2023高教社杯数学建模国赛】ABCD题 问题分析、模型建立、参考文献及实现代码
  • yum安装mysql5.7散记
  • DNS解析
  • 从jdk8 升级到jdk17的问题总结
  • 一百七十二、Flume——Flume采集Kafka数据写入HDFS中(亲测有效、附截图)
  • pnpm 升级
  • 有关使用HttpServletRequest的Cookie的设置和获取
  • 关于 Nginx 的哪些事
  • 插入排序——希尔排序
  • C语言之初阶总结篇