首页 > 其他分享 >关于yolov5训练后权重较大的原因及其解决方案

关于yolov5训练后权重较大的原因及其解决方案

时间:2023-01-29 11:35:06浏览次数:43  
标签:__ yolov5 optimizer 训练 权重 解决方案 weights model

yolov5在官方预训练权重的基础之上再训练后权重较预训练权重大很多,为了大家更加直观的了解为什么及其解决方案,此篇简单介绍一下。

精度变化
官方给的预训练权重是FP16,而我们训练的时候是使用混合精度训练(支持CUDA才行),半精度训练只能在CUDA下进行,不支持CUDA默认是使用单精度训练,最终我们保存的权重是FP32,较FP16储存空间大了一倍。直接上代码视图:


import argparse

from models.common import *

if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='D:/py/test_FP/weights/yolov5s.pt', help='weights path')
opt = parser.parse_args()

# Load pytorch model
model = torch.load(opt.weights, map_location=torch.device('cpu'))['model']

for name, parameters in model.named_parameters():
# print(name,':',parameters.size())
print(parameters.dtype)

原始预训练权重


我们自己的训练权重


参数储存不同

预训练权重默认epoch=-1,不保存training_results,不保存optimizer,相当于只保存了模型和权重

ckpt = {'epoch': -1,
'best_fitness': model['best_fitness'],
'training_results': None,
'model': model['model'],
'optimizer': None}

可以用以下代码测试以下


import argparse

from models.common import *

if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='D:/py/test_FP/weights/yolov5s.pt', help='weights path')
opt = parser.parse_args()

# Load pytorch model
model = torch.load(opt.weights, map_location=torch.device('cpu'))
print(model)


我们训练的时候是默认都保存,源码设置的是在最后一个批次不保存optimizer,如果你是正常跑完所有epoch,最后的权重应该是不包含optimizer,否则会自动保存,以下是官方train.py的保存权重的部分代码

所以我们自己训练出来的模型权重文件比较大是必然的

那问题来了,如果想让权重文件变小怎么办
[注]小编此处使用的权重是基于yolov5s预训练权重训练后的结果,且未在批次执行完就停止,也就是这个权重默认是包含以下这么多信息,内容较多,暂且用省略号表示

ckpt = {'epoch': .....,
'best_fitness': ......,
'training_results': .......,
'model': ......,
'optimizer': ......}


初始大小为:57M

现在我一步步来让这个权重变小
step1
第一步按照以下内容进行,为什么epoch变成-1,官方权重设置的epoch为-1,作为预训练权重,批次从0开始,如果仅作为inference权重,这个不影响;接着是把training_results变为None

ckpt = {'epoch': -1,
'best_fitness': model['best_fitness'],
'training_results': None,
'model': model['model'],
'optimizer': model['optimizer']}


我们按照以上内容把权重文件重新保存以下看看大小变化多少,如下图所示,发现这个training_results占的内存很少,基本可以忽略不计:

step2
第二步按照以下内容执行,相比第一步,只是把optimizer参数变成None

ckpt = {'epoch': -1,
'best_fitness': model['best_fitness'],
'training_results': None,
'model': model['model'],
'optimizer': None}

这次权重又有多大变化呢,如下图所示,发现这个optimizer占的内存很多,大致占了权重文件的一般大小,说明优化器的参数是导致文件较大的主谋:

step3
可是权重文件还是很大,比原始的yolov3s大了一倍,这是因为目前的权重还是FP32,需要把FP32转为FP16,此处根据个人情况来决定是否转为FP16,小编不才,此处使用暴力方法直接把FP32转FP16(使用half函数),如下图,权重小了一倍,基本和yolov3s大小差不多。

以下把代码附上,很简单

 

import argparse
import numpy as np
import torch

from models.common import *

if __name__ == '__main__':

weights_path = 'D:/py/test_FP/weights/last.pt'
is_half = True

# Load pytorch model
model = torch.load(weights_path, map_location=torch.device('cpu'))

net = model['model']

if is_half:
net.half() # 把FP32转为FP16

# print(model)

ckpt = {'epoch': -1,
'best_fitness': model['best_fitness'],
'training_results': None,
'model': net,
'optimizer': None}

# Save .pt
torch.save(ckpt, 'weights/test.pt')
# for name, parameters in model.named_parameters():
# # print(name,':',parameters.size())
# print(parameters.dtype)

小编能力有限,在FP32转FP16时暂且使用最暴力的方法解决,以后有新的方法再及时更新,还有很多不足,希望大家多多指教。

标签:__,yolov5,optimizer,训练,权重,解决方案,weights,model
From: https://www.cnblogs.com/kn-zheng/p/17072162.html

相关文章

  • Redis缓存的主要异常及解决方案
    作者:京东物流陈昌浩1导读Redis是当前最流行的NoSQL数据库。Redis主要用来做缓存使用,在提高数据查询效率、保护数据库等方面起到了关键性的作用,很大程度上提高系统的......
  • setting.xml的mirror、mirrorOf和pom.xml的repositories、repository的关系关联snapsh
    setting.xml的mirror、mirrorOf和pom.xml的repositories、repository的关系关联snapshots带有时间错问题解决方案nexus3.8私有仓库https://blog.csdn.net/Michaelwubo/a......
  • 记录解决方案(sqlserver篇)
    一个月的补卡次数不超过三次(即统计一个月内某人的补卡次数)表结构是某人一天内的四次打卡状态,这样是统计当月补卡的天数了(错误)selectcount(*)from[Proc_HR_Punch]wher......
  • 工业物联网解决方案:无人值守水库监测系统
    水库安全事关人民群众的生命财产安全,也是利国利民的重要基础设施。目前,水库雨情监测存在信息化手段不足,人力成本大等问题,严重影响水库管理效率和防灾管控。针对水库防灾安全......
  • Unity中的网络同步解决方案
    网络同步的解决方案有三种:状态同步、帧同步、实时广播同步,实际使用中可以混合使用。网络同步概览知名游戏中的同步方案类型游戏名同步方案MMORPG魔兽世界状态同步+实时广播......
  • CPU流水线竞争解决方案
    增加资源,通过添加指令缓存和数据缓存,让我们对于指令和数据的访问可以同时进行。帮助CPU解决取指令和访问数据之间的资源冲突。就像是在软件开发过程,发现效率不够,于是研发负......
  • Microsoft 365 解决方案:Shared Channel的使用场景和说明
    Blog链接:https://blog.51cto.com/u_13637423在2022年第三季度MicrosoftTeams支持了SharedChannel功能,但很多时候大家都很疑惑,为什么要支持该功能呢,使用场景是什么呢?带着......
  • 爱站权重怎样查询?怎样提高爱站权重?
    这一篇又是网站权重查询和提高权重的分享,爱站权重怎样查询?怎么提高爱站权重?大家一起来看看嘿。爱站权重怎样查询?第一步:打开iis7站长之家seo批量检测,在左上方的框框里面输入......
  • 安装OpenCV时提示缺少boostdesc_bgm.i文件的问题解决方案
    安装OpenCV时,会遇到下面的错误/home/zhang/slam/opencv-3.4.5/opencv_contrib/modules/xfeatures2d/src/boostdesc.cpp:653:20:fatalerror:boostdesc_bgm.i:没有那个文......
  • jetson nano yolov5
    ​​Yolov5学习笔记(2)——部署在jetsonnano上​​​​tensorrtx​​3.利用TRT加速部署模型3.1下载tensorrtx的源码很高兴你能来到这里,到这里已经完成了一半,是不是觉得很......