【YOLOv5-6.x】模型参数量param及计算量FLOPs解析

这篇具有很好参考价值的文章主要介绍了【YOLOv5-6.x】模型参数量param及计算量FLOPs解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

评价一个用深度学习框架搭建的神经网络模型,除了精确度(比如目标检测中常用的map)指标之外,模型复杂度也必须要考虑,通常用正向推理的计算量(FLOPs)和参数个数(Parameters)来描述模型的复杂度。

 

参数量param和计算量FLOPs简介

参数量

  • 有参数的层主要包括:
    • 卷积层
    • 全连接层
    • BN层
    • Embedding层
    • 少数激活函数层(AconC)
    • … …
  • 无参数层:
    • 多数激活函数层(Sigmoid/ReLU/SiLU/Mish)
    • 池化层
    • Dropout层
    • … …
  • 更具体的来说,模型的参数数目(不考虑偏置项b)为:
    • 全连接Linear(M->N)参数: M × N M×N M×N
    • 卷积Conv2d(Cin, Cout, K)参数: C i n × C o u t × K × K C_{in}×C_{out}×K×K Cin×Cout×K×K
    • BatchNorm(N)参数: 2 N 2N 2N
    • Embedding(N,W)参数: N × W N×W N×W
    • … …

YOLOv5s模型的参数信息如下:

                 from  n    params  module                                  arguments                     
  0                -1  1      3520  models.common.Conv                      [3, 32, 6, 2, 2]              
  1                -1  1     18560  models.common.Conv                      [32, 64, 3, 2]                
  2                -1  1     18816  models.common.C3                        [64, 64, 1]                   
  3                -1  1     73984  models.common.Conv                      [64, 128, 3, 2]               
  4                -1  2    115712  models.common.C3                        [128, 128, 2]                 
  5                -1  1    295424  models.common.Conv                      [128, 256, 3, 2]              
  6                -1  3    625152  models.common.C3                        [256, 256, 3]                 
  7                -1  1   1180672  models.common.Conv                      [256, 512, 3, 2]              
  8                -1  1   1182720  models.common.C3                        [512, 512, 1]                 
  9                -1  1    656896  models.common.SPPF                      [512, 512, 5]                 
 10                -1  1    131584  models.common.Conv                      [512, 256, 1, 1]              
 11                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']          
 12           [-1, 6]  1         0  models.common.Concat                    [1]                           
 13                -1  1    361984  models.common.C3                        [512, 256, 1, False]          
 14                -1  1     33024  models.common.Conv                      [256, 128, 1, 1]              
 15                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']          
 16           [-1, 4]  1         0  models.common.Concat                    [1]                           
 17                -1  1     90880  models.common.C3                        [256, 128, 1, False]          
 18                -1  1    147712  models.common.Conv                      [128, 128, 3, 2]              
 19          [-1, 14]  1         0  models.common.Concat                    [1]                           
 20                -1  1    296448  models.common.C3                        [256, 256, 1, False]          
 21                -1  1    590336  models.common.Conv                      [256, 256, 3, 2]              
 22          [-1, 10]  1         0  models.common.Concat                    [1]                           
 23                -1  1   1182720  models.common.C3                        [512, 512, 1, False]          
 24      [17, 20, 23]  1    229245  models.yolo.Detect                      [80, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]

 

计算量

  • FLOPS

    • 注意全是大写
    • floating point operations per second,每秒浮点运算次数,可以理解为计算速度
    • 是一个衡量硬件性能的指标
  • FLOPs

    • 注意s是小写
    • floating point operations的缩写(s表复数),浮点运算数,可以理解为计算量
    • 计算公式(卷积层): F L O P s = 2 × C o u t × H o u t × W o u t × C i n × k 2 FLOPs=2×C_{out}×H_{out}×W_{out}×C_{in}×k^2 FLOPs=2×Cout×Hout×Wout×Cin×k2
      • 注意,公式中没有包括偏置项bias,如果要计算包括bias的FLOPs,可以用下面这个公式:
      • F L O P s = 2 × C o u t × H o u t × W o u t × ( C i n × k 2 + b i a s ) FLOPs=2×C_{out}×H_{out}×W_{out}×(C_{in}×k^2+bias) FLOPs=2×Cout×Hout×Wout×(Cin×k2+bias)
    • 可以用来衡量算法/模型的复杂度
  • GFLOPs

    • paper中常见
    • 1 G F L O P s = 1 0 9 F L O P s 1GFLOPs=10^9FLOPs 1GFLOPs=109FLOPs
    • 10亿次浮点运算量

 

YOLOv5计算模型参数

YOLOv5-6.x版本中,torch_utils.py文件中的model_info函数,负责计算并打印模型的参数信息(parameter、grandient、FLOPs):

# 打印模型的参数、FLOPs等信息
def model_info(model, verbose=False, img_size=640):
    # Model information. img_size may be int or list, i.e. img_size=640 or img_size=[640, 320]
    n_p = sum(x.numel() for x in model.parameters())  # number parameters
    # 训练时: parameters = gradients, 验证时: gradients = 0
    n_g = sum(x.numel() for x in model.parameters() if x.requires_grad)  # number gradients
    if verbose:
        print(f"{'layer':>5} {'name':>40} {'gradient':>9} {'parameters':>12} {'shape':>20} {'mu':>10} {'sigma':>10}")
        for i, (name, p) in enumerate(model.named_parameters()):
            name = name.replace('module_list.', '')
            print('%5g %40s %9s %12g %20s %10.3g %10.3g' %
                  (i, name, p.requires_grad, p.numel(), list(p.shape), p.mean(), p.std()))
    # 调用thop库中的profile计算FLOPs
    try:  # FLOPs
        from thop import profile
        stride = max(int(model.stride.max()), 32) if hasattr(model, 'stride') else 32
        # input
        # img = torch.zeros((1, model.yaml.get('ch', 3), stride * 8, stride * 8), device=next(model.parameters()).device)  # 帮助理解如何计算FLOPs的尝试
        img = torch.zeros((1, model.yaml.get('ch', 3), stride, stride), device=next(model.parameters()).device)  # input
        flops = profile(deepcopy(model), inputs=(img,), verbose=False)[0] / 1E9 * 2  # stride GFLOPs
        img_size = img_size if isinstance(img_size, list) else [img_size, img_size]  # expand if int/float
        fs = ', %.1f GFLOPs' % (flops * img_size[0] / stride * img_size[1] / stride)  # 640x640 GFLOPs
        # fs = ', %.1f GFLOPs' % (flops * img_size[0] / (stride * 8) * img_size[1] / (stride * 8))  # 640x640 GFLOPs  # 帮助理解如何计算FLOPs的尝试
    except (ImportError, Exception):
        fs = ''

    LOGGER.info(f"Model Summary: {len(list(model.modules()))} layers, {n_p} parameters, {n_g} gradients{fs}")

 

训练和验证输出模型参数不同的原因分析

输出模型参数结果(以YOLOv5s-coco2017为例)

  • 训练时输出模型参数:
Model Summary: 270 layers, 7235389 parameters, 7235389 gradients, 16.5 GFLOPs
  • 验证时输出模型参数:
Fusing layers... 
Model Summary: 213 layers, 7225885 parameters, 0 gradients

 

参数不同的原因分析

  • layers
    • 可以看到验证时网络层数减少了很多
    • 其中一个原因是使用了Fuse前向加速推理方法,将Conv和BN层融合在一起,具体见torch_utils.py文件中的fuse_conv_and_bn函数
    • 其他原因目前还没有看出来,欢迎大家在评论区交流看法~
  • parameters
    • 原因也是使用了Fuse前向加速推理方法,将Conv和BN层融合在一起,相当于砍掉了BN层
  • grandients
    • 训练时所有参数都需要求梯度进行反向传播,所以训练时gradients = parameters
    • 验证时,由于加载的是训练好的权重文件,参数不需要更新,所以不需要求梯度,因此gradients = 0

 

Reference

深度学习中GPU和显存分析

分享一个FLOPs计算神器

Pytorch中计算自己模型的FLOPs | thop.profile() 方法 | yolov5s 网络模型参数量、计算量统计

Pytorch:model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别

【YOLOV5-5.x 源码解读】torch_utils.py文章来源地址https://www.toymoban.com/news/detail-443473.html

到了这里,关于【YOLOv5-6.x】模型参数量param及计算量FLOPs解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • YOLOv5解析 | 参数与性能指标

    conf_thres 与 iou_thres 均位于 detect.py 文件当中 conf_thres :Confidence Threshold,置信度阈值,即以下图片上的值。 只显示预测概率超过conf_thres的预测结果 。 iou_thres :Intersect over Union Threshold,交并比阈值。 IOU值:预测框大小∩真实框大小 / 预测框大小∪真实框大小。预测框与真实

    2024年02月04日
    浏览(42)
  • YOLOV5超参数设置与数据增强解析

    YOLOv5有大约30个超参数用于各种训练设置。它们在*xml中定义。/data目录下的Yaml文件。更好的初始猜测将产生更好的最终结果,因此在进化之前正确地初始化这些值是很重要的。如果有疑问,只需使用缺省值,这些缺省值是为YOLOv5 COCO训练从头优化的。 YOLOv5的超参文件见data/h

    2023年04月08日
    浏览(82)
  • YOLOv5(v6.1)解析(四)超参数进化

    本文对YOLOv5项目的超参数算法进行详细阐述,笔者以后会定期讲解关于模型的其他的模块与相关技术,笔者也建立了一个关于目标检测的交流群:781334731,欢迎大家踊跃加入,一起学习鸭! 源码地址:https://github.com/ultralytics/yolov5 打开网址后,点击master可选取不同版本的分支

    2024年02月09日
    浏览(38)
  • YOLOv5代码解析——模型结构篇

    YOLOv5🚀出到第七个版本了( •̀ ω •́ )✧,同时支持 图片分类 、 目标检测 与 实例分割 ;我们在跑通过模型训练与推理后,可以尝试改进模型😀,或者根据任务需求来修改网络结构与损失函数等等。 本文分享一下,在模型结构方面,如何快速理解源码。 https://github.com/s

    2023年04月26日
    浏览(90)
  • yolov5 模型输出的格式解析

    工作需要, 又需要对yolov5 输出的模型进行转onnx 再用c++进行后续处理。 两个问题。 yolov5 的模型输出的是个啥啊? 转成onnx后输出的和yolov5输出的处理是否一样呢? 以前只知道抄代码就行, 也不知道里面干了啥 , 输出的后处理也都是由现成的代码来实现。 我也懒得考虑内

    2023年04月08日
    浏览(56)
  • 【目标检测】YOLOv5:模型构建解析

    最近在看一些目标检测的最新论文和代码,大多数都是在YOLOv5的基础上进行魔改。 改的最多的基本是原版本的网络结构,这篇博文就从源码角度来解析YOLOv5中,模型是如何构建出来的。 本文使用的是YOLOv5-5.0版本。 在YOLOv5中,模型结构基本是写在了 .yaml 中,5.0版本的YOLOv5共

    2024年02月06日
    浏览(90)
  • YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml(包括源码+网络结构图)

    前言: Hello大家好,我是小哥谈。 配置文件yolov5s.yaml在YOLOv5模型训练过程中发挥着至关重要的作用,属于初学者必知必会的文件!在YOLOv5-6.0版本源码中,配置了5种不同大小的网络模型,分别是YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,其中YOLOv5n是网络深度和宽度最小但检测速度

    2024年02月08日
    浏览(50)
  • YOLOv8 独家改进最新PWConv核心结构|来自CVPR2023,可以直接写模型改进,进一步轻量化!测试数据集mAP有效涨点,进一步降低参数量,追求更高的 FLOPS

    💡 本篇内容 :YOLOv8 独家原创改进最新PWConv核心结构|来自最新CVPR2023顶会, 🚀🚀各种数据集mAP有效涨点,进一步降低参数量,追求更高的 FLOPS 💡 🚀🚀🚀内含·改进源代码·,按步骤操作运行改进后的代码即可 重点 :🔥🔥🔥有同学已经使用这个 PWConv 创新点 在 数据集

    2024年02月08日
    浏览(41)
  • yolov5源码解析(10)--损失计算与anchor

    本文章基于yolov5-6.2版本。主要讲解的是yolov5在训练过程中是怎么由推理结果和标签来进行损失计算的。损失函数往往可以作为调优的一个切入点,所以我们首先要了解它。 损失函数的调用点如下,在train.py里  代码入口:utils/loss.py 1.先说一下两个入参: p: 推理结果列表,

    2024年02月08日
    浏览(39)
  • yolov5的运行环境配置、参数修改和训练命令,并将训练的pt模型转换为rknn模型,并推理

    目录 一.yolov5的运行环境配置(Windows系统) 1、NVIDIA驱动安装与更新  2、Anaconda 的安装 3、Pytorch环境安装  4、pycharm安装 二.yolov5训练数据集,得到best.pt(Windows系统)  1.下载YOLO项目代码  2.环境安装 3. 数据集下载: 三.best.pt转为onnx模型(Windows系统) 四.best.onnx转为best.rknn模型(Linu

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包