近年来,有很多轻量级的骨干网络问世,尤其最近两年,各种 NAS 搜索出的网络层出不穷,这些网络要么主打 FLOPs 或者 Params 上的优势,要么主打 ARM 设备上的推理速度的优势,很少有网络专门针对 Intel CPU 做特定的优化,导致这些网络在 Intel CPU 端的推理速度并不是很完美。基于此,我们针对 Intel CPU 设备以及其加速库 MKLDNN 设计了特定的骨干网络 PP-LCNet,比起其他的轻量级的 SOTA 模型,该骨干网络可以在不增加推理时间的情况下,进一步提升模型的性能,最终大幅度超越现有的 SOTA 模型。与其他模型的对比图如下。

import torch
import torch.nn as nn
NET_CONFIG = {"blocks2":#k, in_c, out_c, s, use_se[[3, 16, 32, 1, False]],"blocks3": [[3, 32, 64, 2, False], [3, 64, 64, 1, False]],"blocks4": [[3, 64, 128, 2, False], [3, 128, 128, 1, False]],"blocks5": [[3, 128, 256, 2, False], [5, 256, 256, 1, False],[5, 256, 256, 1, False], [5, 256, 256, 1, False],[5, 256, 256, 1, False], [5, 256, 256, 1, False]],"blocks6": [[5, 256, 512, 2, True], [5, 512, 512, 1, True]]
}def make_divisible(v, divisor=8, min_value=None):if min_value is None:min_value = divisornew_v = max(min_value, int(v + divisor / 2) // divisor * divisor)if new_v < 0.9 * v:new_v += divisorreturn new_vclass ConvBNLayer(nn.Module):def __init__(self,num_channels,filter_size,num_filters,stride,num_groups=1):super().__init__()self.conv = nn.Conv2d(in_channels=num_channels,out_channels=num_filters,kernel_size=filter_size,stride=stride,padding=(filter_size - 1) // 2,groups=num_groups,)self.bn = nn.BatchNorm2d(num_filters)self.hardswish = nn.Hardswish()def forward(self, x):x = self.conv(x)x = self.bn(x)x = self.hardswish(x)return xclass SEModule(nn.Module):def __init__(self, channel, reduction=4):super().__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.conv1 = nn.Conv2d(in_channels=channel,out_channels=channel // reduction,kernel_size=1,stride=1,padding=0)self.relu = nn.ReLU()self.conv2 = nn.Conv2d(in_channels=channel // reduction,out_channels=channel,kernel_size=1,stride=1,padding=0)self.hardsigmoid = nn.Hardsigmoid()def forward(self, x):identity = xx = self.avg_pool(x)x = self.conv1(x)x = self.relu(x)x = self.conv2(x)x = self.hardsigmoid(x)x = identity*xreturn xclass DepthwiseSeparable(nn.Module):def __init__(self,num_channels,num_filters,stride,dw_size=3,use_se=False):super().__init__()self.use_se = use_seself.dw_conv = ConvBNLayer(num_channels=num_channels,num_filters=num_channels,filter_size=dw_size,stride=stride,num_groups=num_channels)if use_se:self.se = SEModule(num_channels)self.pw_conv = ConvBNLayer(num_channels=num_channels,filter_size=1,num_filters=num_filters,stride=1)def forward(self, x):x = self.dw_conv(x)if self.use_se:x = self.se(x)x = self.pw_conv(x)return xclass PP_LCNet(nn.Module):def __init__(self,scale=1.0,class_num=1000,dropout_prob=0.2,class_expand=1280,return_patterns=None,return_stages=None):super().__init__()self.scale = scaleself.class_expand = class_expandself.conv1 = ConvBNLayer(num_channels=3,filter_size=3,num_filters=make_divisible(16 * scale),stride=2)self.blocks2 = nn.Sequential(* [DepthwiseSeparable(num_channels=make_divisible(in_c * scale),num_filters=make_divisible(out_c * scale),dw_size=k,stride=s,use_se=se)for i, (k, in_c, out_c, s, se) in enumerate(NET_CONFIG["blocks2"])])self.blocks3 = nn.Sequential(* [DepthwiseSeparable(num_channels=make_divisible(in_c * scale),num_filters=make_divisible(out_c * scale),dw_size=k,stride=s,use_se=se)for i, (k, in_c, out_c, s, se) in enumerate(NET_CONFIG["blocks3"])])self.blocks4 = nn.Sequential(* [DepthwiseSeparable(num_channels=make_divisible(in_c * scale),num_filters=make_divisible(out_c * scale),dw_size=k,stride=s,use_se=se)for i, (k, in_c, out_c, s, se) in enumerate(NET_CONFIG["blocks4"])])self.blocks5 = nn.Sequential(* [DepthwiseSeparable(num_channels=make_divisible(in_c * scale),num_filters=make_divisible(out_c * scale),dw_size=k,stride=s,use_se=se)for i, (k, in_c, out_c, s, se) in enumerate(NET_CONFIG["blocks5"])])self.blocks6 = nn.Sequential(* [DepthwiseSeparable(num_channels=make_divisible(in_c * scale),num_filters=make_divisible(out_c * scale),dw_size=k,stride=s,use_se=se)for i, (k, in_c, out_c, s, se) in enumerate(NET_CONFIG["blocks6"])])self.avg_pool = nn.AdaptiveAvgPool2d(1)self.last_conv = nn.Conv2d(in_channels=make_divisible(NET_CONFIG["blocks6"][-1][2] * scale),out_channels=self.class_expand,kernel_size=1,stride=1,padding=0,)self.hardswish = nn.Hardswish()self.dropout = nn.Dropout(p=dropout_prob)self.fc = nn.Linear(self.class_expand, class_num)def forward(self, x):x = self.conv1(x)x = self.blocks2(x)x = self.blocks3(x)x = self.blocks4(x)x = self.blocks5(x)x = self.blocks6(x)x = self.avg_pool(x)x = self.last_conv(x)x = self.hardswish(x)x = self.dropout(x)x = torch.flatten(x, start_dim=1, end_dim=-1)x = self.fc(x)return xdef PPLCNET_x0_25(**kwargs):model = PP_LCNet(scale=0.25, **kwargs)return modeldef PPLCNET_x0_35(**kwargs):model = PP_LCNet(scale=0.35, **kwargs)return modeldef PPLCNET_x0_5(**kwargs):model = PP_LCNet(scale=0.5, **kwargs)return modeldef PPLCNET_x0_75(**kwargs):model = PP_LCNet(scale=0.75, **kwargs)return modeldef PPLCNET_x1_0(**kwargs):model = PP_LCNet(scale=1.0, **kwargs)return modeldef PPLCNET_x1_5(**kwargs):model = PP_LCNet(scale=1.5, **kwargs)return modeldef PPLCNET_x2_0(**kwargs):model = PP_LCNet(scale=2.0, **kwargs)return modeldef PPLCNET_x2_5(**kwargs):model = PP_LCNet(scale=2.5, **kwargs)return modelif __name__ == '__main__':model = PPLCNET_x1_5()input = torch.randn(1, 3, 224, 224)print(input.shape)output = model(input)print(output.shape)

百度框架下的最轻量化模型 PP-LCNet,Pytorch版本代码相关推荐

  1. Hugging Face实战(NLP实战/Transformer实战/预训练模型/分词器/模型微调/模型自动选择/PyTorch版本/代码逐行解析)下篇之模型训练

    模型训练的流程代码是不是特别特别多啊?有的童鞋看过Bert那个源码写的特别特别详细,参数贼多,运行一个模型百八十个参数的. Transformer对NLP的理解是一个大道至简的感觉,Hugging F ...

  2. 什么是轻量化,轻量化模型is all your need hhh

    其实学了几个小月,我们肯定知道,MLP有多deeper ,卷积层有多少层呀 抑或是Transformer架构,大量的参数,只能用huge 来描述, 可实际上我们的设备,有时候并没有服务器那么厉害,所以 ...

  3. CNN结构演变总结(二)轻量化模型

    CNN结构演变总结(一)经典模型 导言: 上一篇介绍了经典模型中的结构演变,介绍了设计原理,作用,效果等.在本文,将对轻量化模型进行总结分析. 轻量化模型主要围绕减少计算量,减少参数,降低实际运行时间 ...

  4. 综述 | 语义分割经典网络及轻量化模型盘点

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 基于图像的语义分割又被理解为密集的像素预测,即将每个像素进行分类, ...

  5. 【DeepCV】轻量化模型 Lightweight model

    Backto DeepCV CNN 在CV领域大放异彩,但是网络层数不断增加,模型体积越来越大,引出了实用中的效率问题.效率问题主要是模型的存储问题和模型进行预测的速度问题(以下简称速度问题) 第一, ...

  6. 即插即用 | S-FPN全新的金字塔网络,更适合轻量化模型的FPN

    FPN(特征金字塔网络)已经成为大多数优秀One-Stage检测器的基本组成部分.以往的许多研究已经多次证明,FPN可以让多尺度特征图更好.更精确地描述不同大小的目标.然而,对于大多数Backbone ...

  7. net下的高性能轻量化半自动orm+linq的《SqlBatis》

    一.项目介绍 该项目内置单表linq操作,xml动态sql解析,词法分析,类型映射等功能. SqlMapper,用来处理sql与数据库操作,它设计的目标是支持mysql,sqlserver,sqlli ...

  8. YOLOv5首发改进最新CVPR2023主干FasterNet系列:实测私有数据集mAP有效涨点,同时降低参数量|为更快的神经网络追求更高的 FLOPS,参数量下降,超越其他轻量化模型

  9. BERT |(3)BERT模型的使用--pytorch的代码解释

    参考代码:https://github.com/649453932/Bert-Chinese-Text-Classification-Pytorch 从名字可以看出来这个是做一个中文文本分类的的任务, ...

最新文章

  1. F5负载均衡的双机冗余配置与全冗余解析
  2. fmt打印不显示 go_golang打印输出fmt和log
  3. Host is not allowed to connect to this MySQL server解决方法
  4. Xcode 9 新建的工程如何支持 iOS 8
  5. MDOP 2011 R2 DaRT 7.0 创建包含诊断和恢复的图形化PE
  6. TensorFlow入门--队列与TensorBoard操作
  7. Determining IP information for eth0...failed
  8. Git:clean用法
  9. c语言如何做一个打卡的程序,C语言实现学生打卡系统
  10. linux系统可安装博途吗,安装博途V14是在什么系统下?
  11. 那些被一行代码蒸发1个亿的智能合约,形式化验证了解一下? | 人物志
  12. 如何做一份漂亮的年终总结报告?教你5个实用套路
  13. 10015---JavaScript--表单验证
  14. 云计算是什么通俗解释_什么是云? 解释
  15. 分布式ID生成器-订单号的生成(全局唯一id生成策略)
  16. 软件开发中的瀑布模型
  17. 应用宝省流量更新sdk接入指南
  18. UiPath认证考试难吗
  19. 红米路由器ac2100怎样设置ipv6_【路由刷机】红米小米 AC2100 Windows下刷Padavan固件小小白教程、升级固件...
  20. python 头条_python-selenium登陆今日头条

热门文章

  1. 获取网易云音乐接口以及使用
  2. UNAS折腾:raidriver映射webdav作为本地盘
  3. 南方数据编辑器southidceditor最新注入0day漏洞
  4. android so库支持虚拟机,抖音数据采集教程,跨平台模拟执行AndroidNativeEmu手册
  5. LWN:DVB与头文件和用户空间的regression!
  6. mybatis中xml之trim属性
  7. 为什么要做心理咨询师?
  8. 四轴之互补滤波与四元数算法简单分析
  9. 【毕业设计】基于微信小程序的超市购物系统
  10. [C] 在GCC中获取CPUID信息(兼容VC)