
pytorch工程实践
文章平均质量分 86
每当碰到新颖的工程实践问题,博主都会尽快更新。同时,本栏目到2026年前不会完结。对本专栏有使用问题的订阅者,皆可以私聊博主解决问题。如果碰到有需要解决的技术问题,也可以私聊博主补充博客。
优惠券已抵扣
余额抵扣
还需支付
¥59.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
万里鹏程转瞬至
一名热爱深度学习算法实践的算法工程师,工作日长期活动在线,有项目研发技术问题均可私聊。
展开
-
pytorch 50 大模型导出的onnx模型优化尝试
本博文基于Native-LLM-for-Android项目代码实现,具体做了以下操作:1、尝试并实现将模型结构与权重零散的onnx模型进行合并,通过该操作实现了模型加载速度提升,大约提升了3倍2、突破了onnxconverter_common 无法将llm模型导出为fp16的操作,基于该操作后将10g的权重降低到5.6g,但推理速度反而下降了3、实现了fp32格式的onnx模型转换为int8模型,该操作后模型权重只占3g,但推理结果完全不准。原创 2025-03-09 16:32:29 · 199 阅读 · 0 评论 -
pytorch 49 GroundingDINO导出为onnx模型实现python与c++部署
本博文实现了在win环境下,将GroundingDINO模型导出为onnx模型,并基于cmakelist生成c++项目实现模型的部署。并分析了官方项目为什么不能直接导出onnx,主要基于https://github.com/wenyi5608/GroundingDINO项目公开的代码实现项目,只是补充了c++配置项,实现了模型转tensorrt格式。在600x600的输入下,3060显卡,torch推理、python-onnx、c+±onxx推理速度均在0.1s左右。原创 2024-11-23 11:06:24 · 754 阅读 · 1 评论 -
pytorch 48 基于voc2012数据集对yolov10s模型进行剪枝尝试
对yolov10s模型进行剪枝,以voc2012数据集做研究对象(训练数据 voc2012 train; 测试数据 voc2012 val),移除50%的通道,28.5 GFLOPs降低到14.6 GFLOPs,理论速度提升1倍。剪枝后得到的模型的最高map50为71(相比于剪枝前的74,下降3个点),map5095最高为54(相比于剪枝前的58,下降4个点)。并基于trt-python进行fps的差异对比,发现原始模型的fp16 推理fps为380,剪枝后模型fps为405。同时,也基于onnx进行推理耗原创 2024-09-16 20:44:03 · 538 阅读 · 0 评论 -
pytorch 47 模型剪枝实战|基于torch-pruning库代码对yolov10n模型进行剪枝
torch-pruning官方提供了基于yolov8的剪枝代码,基于此代码改进博主实现了对yolov10n模型的剪枝。虽然实现了对yolov10n模型的剪枝,剪枝目标为移除60%的通道,然而实验是失败的,针对coco数据集进行操作,剪枝前的模型map时37,剪枝后只能恢复到22,比预计下降了15个点,剪枝后的模型flop是下降了很多,mac从8.9降低到2.01616 G,但在3060显卡上推理速度并未得到提升。下一期,将会实现模型的稀疏化训练与剪枝。本期实验,主要验证了多次剪枝,不如一次剪枝到位;原创 2024-08-11 21:30:03 · 450 阅读 · 0 评论 -
pytorch 46 将ASpanFormer模型导出onnx运行
ASpanFormer是一个2022年8月份发布的算法,其主要步骤与LoFTR模型类似,因此无法导出为onnx模型。根据ASpanFormer论文中的数据与效果图,可以确定AsPanFormer是可以作为一个比SP+SG更为有效的方案,其在标准数据集上的效果优于SP+SG,在速度上远超SP+SG,与LoFTR接近;在预测点的数量上远超SP+SG、LoFTR方案。通过修改代码后,可以将ASpanFormer模型导出为onnx运行,但在速度与效果上远不如torch模型。原创 2024-07-21 22:00:53 · 277 阅读 · 0 评论 -
pytorch 45 使用自己的数据对groundingdino进行微调
Grounding DINO是一种基于transformer的视觉语言检测方法,它可以根据文字描述检测指定目标。它是在DINO的基础上,增加了多个阶段的视觉语言模态融合,包括特征增强器、语言指导的查询选择模块和跨模态解码器。它可以实现最先进的对象检测器的性能,消除了对NMS等手工模块的依赖。然而在应用到业务数据上还是有所不足,故而需要对Grounding DINO进行微调。本博文基于Grounding-Dino-FineTuning项目实现对自己yolo数据的微调原创 2024-04-12 21:16:57 · 2544 阅读 · 2 评论 -
pytorch 44 不修改源码在yolov8中使用odconv动态卷积
这里仅修改对YOLOv8的使用方式,不修改任何源码即可将odconv使用到最新的yolov8n模型上,实现了对私有数据集下的巨大性能提升(尤其是对于类别不平衡的少样本数据)。ODCONV是Intel提出的一种极差即用的动态卷积,在小模型上涨点效果较为明显(在大模型上涨点效果略微退化),可被用于轻量化模型的性能优化。常见的轻量化模型有NanoDet、PicoDet和yolo-tiny系列模型等。原创 2024-01-20 22:15:00 · 423 阅读 · 0 评论 -
pytorch 43 TensorRT c++部署|基于面向对象思想使用4行代码实现yolov8分类模型、目标检测模型、实例分割
在win10,TensorRT 8.6,3060Ti 12g GPU,CUDA 12.1、cmake 3.27环境下实现yolov8s-det、yolov8s-seg、yolov8s-cls的部署。以面向对象的方式实现c++ TensorRT 部署,使用yolov8s-det或yolov8s-seg推理图片并绘图展示仅需3行代码即可,整个forward时间仅需4ms。在640x640的输入下,YoloDetModel infer time:4ms nms:4ms,YoloDetModel infer ti原创 2023-09-17 12:38:23 · 607 阅读 · 0 评论 -
pytorch 42 C#使用onnxruntime部署内置nms的yolov8模型
在进行目标检测部署时,通常需要自行编码实现对模型预测结果的解码及与预测结果的nms操作。所幸现在的各种部署框架对算子的支持更为灵活,可以在模型内实现预测结果的解码,但仍然需要自行编码实现对预测结果的nms操作。其实在onnx opset===11版本以后,其已支持将nms操作嵌入到模型中,具体可以参考https://hpg123.blog.youkuaiyun.com/article/details/131585808,修改代码实现yolov8模型onnx下的无nms导出。原创 2023-08-19 19:47:14 · 1721 阅读 · 0 评论 -
pytorch 41 yolov8的无nsm后处理的onnxruntime部署方案
自onnx11版本及以后,onnx支持将nms操作嵌入到模型中。本博文将yolov8模型的nms操作嵌入到模型中可以大幅度的简化模型部署代码,提升模型推理速度(在以往大家都是使用opencv的库进行nms操作,CPU效率必然是不如GPU的)。同时修改了yolov8输出的格式,移除了每一个类别的conf信息,只保留了maxClassConf和maxClassId。后续会补充C++、C#部署案例,目前仅有python onnxruntime部署案例。原创 2023-07-06 22:37:19 · 2164 阅读 · 8 评论 -
pytorch 40 分享从0开始构建一个独立的深度学习项目
都2023年了,估计没有几个人会自己独立从0开始构建深度学习项目的了,全是依赖现有的开源库进行项目研制开发。这里回顾几年的工作经验,对构建深度学习项目进行初步梳理。通常深度学习任务都被描述为:假设函数、损失函数和迭代函数。假设函数一般是我们的模型,损失函数(loss)是也就是训练任务的优化目标,迭代函数则是具体执行训练任务步骤(依据损失函数对模型进行迭代)。本文以实现一个自动编码机的训练任务为例,从0开始实现一个简单的深度学习项目。原创 2023-06-10 07:27:55 · 686 阅读 · 1 评论 -
pytorch 39 yolov5_obb的onnx部署及其优化
yolov5_obb项目的使用可以参考:https://hpg123.blog.youkuaiyun.com/article/details/129366477下载yolov5s_csl_dotav1_best.pt,并执行以下命令,得到yolov5s_csl_dotav1_best.onnx```bashpython export.py --weights ./yolov5s_csl_dotav1_best.pt --device cpu```将导出的模型yolov5s_csl_dotav1_best.on原创 2023-04-20 19:17:43 · 1431 阅读 · 3 评论 -
pytorch 38 对tensorRT、openvino、onnxruntime(fp32、fp16)推理速度进行对比
tensorRT与openvino部署模型有必要么?本博文对tensorRT、openvino、onnxruntime推理速度进行对比,分别在vgg16、resnet50、efficientnet_b1和cspdarknet53四个模型进行进行实验,对于openvino和onnxruntime还进行了cpu下的推理对比。对比囊括了fp32、fp16两种情况。在float32下通过实验得出:openvino GPU < onnxruntime CPU原创 2023-04-17 19:19:41 · 4681 阅读 · 2 评论 -
pytorch 37 yolov8项目的入门解读
包含了各种指标计算、绘图展示的代码。其中值得阅读的是tal.py,里面包含了TaskAlignedAssigner的实现方式。可以看到TaskAlignedAssigner需要一个topk的参数,而在v8/detect/train.py@Loss类中设置了topk的值为10(该参数没有设置成从配置文件中读取)原创 2023-04-13 23:21:05 · 1284 阅读 · 1 评论 -
pytorch 36 基于GT-seg标签生成伪seg标签模拟模型语义分割
在论文CascadePSP中提到对seg标签进行扰动,生成二值的伪seg标签,在此对其代码进行分析和改动,实现生成多值的伪seg标签,可用于模拟全局语义分割模型的分割结果。原创 2023-03-17 20:03:12 · 771 阅读 · 0 评论 -
pytorch 35 yolov5_obb项目解读+使用技巧+调优经验(提升map)
yolov5_obb是一个用于旋转框预测的开源项目,项目地址为https://github.com/hukaixuan19970627/yolov5_obb。在使用yolov5_obb进行训练时,可能存在训练后精度不达标。使用yolov5_obb项目一定要对yolov5_obb的基本实现和关键部分要有所了解,同时对于使用过程中的参数设置,数据增强等手段要足够了解,不能使用默认的配置来训练自己的数据集。很多时候,这被归咎于数据量不足,训练数据太复杂。博主一开始也是这么想,但是通过对yolov5_obb项目的分原创 2023-03-06 21:28:59 · 2467 阅读 · 15 评论 -
pytorch 34 mmdeploy模型转换报错onnxruntime.capi.onnxruntime_pybind11_state.Fail解决方案
使用mmdeploy部署mmrotate模型时出现以下报错,虽然不影响模型转换为onnx,但是影响模型的加载。出现这个报错,是因为mmdeploy转换完模型后,要加载onnx模型测试一下,但是onnx模型中存在一些mmrotate自定义实现的onnx算子,而默认的onnxruntime中没有提供。原创 2022-09-30 10:18:33 · 2817 阅读 · 1 评论 -
pytorch 33 使用mmdeploy将mmdetection模型转换为onnx,并基于mmdeploy-sdk实现c++部署
本博文主要使用将mmdetection模型转换为onnx模型,并在实现onnx模型python下onnxruntime、mmdelpoy的测试;然后基于mmdelpoy的c++ sdk实现c++部署。以yolox的部署为例,相比于yolox作者发布的版本,基于mmdeploy部署的模型代码更加简洁,流程更加简单,而且模型内置nms无需自己写nms的代码。这里需要注意的mmdeploy概念的下模型是一个目录,包含了onnx文件和data pipeline等文件。原创 2022-09-02 18:52:36 · 3638 阅读 · 18 评论 -
pytorch 32 onnx模型每次输出的结果都会变的解决方案
正常来说onnx模型每次输出的结果都会变,这是一个超乎寻常,难以理解的话题。因为,模型参数一旦导出后,在理论上就不会发生变化。而且,paddle、pytorch、tensorflow等框架导出模型时,也是默认设置模型的mode值为eval,也就是设置参数不更新。如果不是亲身所历,亲眼所示,博主也不会相信有这种匪夷所思的事情。只能说,碰到过的都懂。正常的使用标准ai框架导出部署模型,万不可能发生这种事情。博主之所以碰到这种事情,是因为前期操作秀的太6。把手伸到了MMSegmentation中,,然后。...原创 2022-07-21 16:01:33 · 2684 阅读 · 0 评论 -
pytorch 31 基于mmdetection用yolox训练自己的coco数据集
yolox作为当下地表最强的目标检测算法,用yolox来做工程必定能事半功倍。然而,mmdetection训练yolox的配置文件写法与faster-rcnn有些不太一样,如果直接套用faster-rcnn的配置文件会存在多个异常。且在网上很难找到mmdetection用yolox训练coco数据集的案例,为此博主经过多次实践通过实践,最终实现了yolox的训练,并找出了yolox与faster-rcnn的配置文件编写的不同。博主发现yolox与faster-rcnn的配置文件存在以下不同:1.在修改模型输原创 2022-06-26 23:25:47 · 2135 阅读 · 0 评论 -
pytorch 30 torchscipt(jit模型)与onnx输入单个int数值与if分支控制
通常来说,pytorch的模型输入和输出都应该是tensor。但是,有的时候,需要传入额外的参数控制模型的执行流程,则需要考虑输入int、bool等类型的变量控制模型的forward的过程。如博主前面写的文章pytorch 20 基于pytorch实现腐蚀膨胀、开运算闭运算等形态学操作_万里鹏程转瞬至的博客-优快云博客_pytorch 腐蚀 该文章使用maxpool实现腐蚀膨胀等系列操作。其中的控制maxpool kernel size就需要传入int数值进行控制,以确保按照算法需求动态的进行腐蚀膨胀操原创 2022-06-17 18:52:51 · 914 阅读 · 0 评论 -
pytorch 29 onnx多输入多输出模型(动态尺寸)转TensorRT模型并在python与C++下用TensorRT进行部署
实现将多输入多输出的onnx模型转TensorRT的格式,并用TensorRT的python api进行调用,最后实现C++的调用,python结果与C++结果一模一样。在此过程中实现了,动态尺寸,也就是可以在运行是按照数据情况动态调整模型的输入数据的格式。在这里以pytorch的多输入多输出模型为例,从模型构建到转化为onnx动态size、tensorrt安装、onnx转tensorRT动态size、tensorRT模型pytthon调用、tensorRT C++项目配置,最终到tensorRT模型C++原创 2022-06-08 20:41:55 · 2453 阅读 · 4 评论 -
pytorch 28 jit模型(TorchScript)转换为onnx模型
TorchScript是pytorch模型c++下libtorch部署的必须要求,但是已经部署好的jit模型如果有一天突然想换成onnx部署、openvion部署,tensorRT部署则存在一定的困难。因为,pytorch是不支持直接将jit模型模型转换为onnx模型的,为此对it模型转换为onnx模型进行研究实现。这里以多输入多输出的jit模型为例,实现了将jit模型转换为onnx模型。如果有现成的jit模型不需要这一步。这里是构建多输入多输出模型,并保存为jit模型2、创建ScriptModule原创 2022-06-06 11:05:28 · 2502 阅读 · 15 评论 -
pytorch 27 科学炼丹(训练)方式之——无痛涨点(模型重参数化,ACNet、RepVGG、DBBNet)
博主这里的无痛涨点是指,在训练时增加一定的flop,可能会降低收敛速度,但是在测试时保持flop不变增强模型的精度。flop不变(模型参数量不变),性能增加,这不就白捡的性能么。那这是如何做到的呢?该操作通过利用特定卷积结构的可合并性,设计出新的block结构,在训练时block是一个多支路结构(flop增加),在测试是block的参数进行重构变成单个支路(flop不变)。其主要工作,就是设计出可以合并为单个conv的block结构。在训练时,使用block复杂结构提取更为丰富的图像特征;在测试时,将复原创 2022-05-25 11:18:03 · 1437 阅读 · 0 评论 -
pytorch 26 科学炼丹(训练)方式之——魔改网络(给模型做外科手术,实现module的删除、修改与添加,forward流程的修改)
网络结构层出不穷,但经典网络总是大家工程上的最爱。有的时候需要对网络进行微操,直接该源码一是工作量太大;二是破坏了原来的网络结构会导致预训练权重无法加载。因此,可以在加载预训练权重后对模型进行微操。本博文实现了模型中module的删除、修改与添加、以及模型forward流程的修改(重定义),后续将会以模型库中预定义的AlexNet为例子进行实操。1、module的添加该操作通过model.add_module实现,具体可见下列代码示意import torchfrom torch impor原创 2022-05-16 18:27:07 · 2175 阅读 · 1 评论 -
pytorch 25 科学炼丹(训练)方式之——加速训练
核心:在保证模型结构不变的前提下加速训练在深度学习中,从数据加载到训练模型的过程如下图所示,包含数据加载与解码、数据在线增强、数据到GPU、训练模型,接下来将从以下4个方面介绍如何加速模型训练的小技巧。并用推荐指数1~5,描述其实用性,指数越高实用性越强。1、数据加载与解码我们平时存储的jpg图像其实是经过压缩的,因此在读取数据时系统要进行解码。那么在这里一共提出以下加速方案:1、采用bmp等无压缩格式存储数据,减小解码时间(推荐指数2)2、使用torchvision.io 读取图片(推荐指原创 2022-04-28 18:25:46 · 2270 阅读 · 0 评论 -
pytorch 24 把MMSegmentation的作为pytorch的语义分割模型库使用(已实现模型的训练与部署)
MMSegmentation是商汤科技推出的语义分割库套件,属于 OpenMMLab 项目的一部分,里面有很多的语义分割模型。为什么博主会有这样的骚操作想法呢?原因有二,第一点:MMSegmentation的封装太完善了,作为一个依赖于pytorch的模型库在训练上却不一样,用户的自由发挥空间很小(比如自定义loss、自定义学习率调度器、自定义数据加载器,啥都要重新学),这让博主很难接受;第二点:github上给出了的其他pytorch模型库太拉胯了,支持的模型数量有限,大多只支持2020年以前的模型,这对原创 2022-04-27 20:59:03 · 4741 阅读 · 43 评论 -
pytorch 23 hook的使用与介绍 及基于hook实现即插即用的DropBlock
Hook(钩子):字面意思就是勾住一个函数,在其执行前修改输入数据或其他操作,或者在其执行后修改输出输出或其他操作。通过hook操作可以锁定一个layer对象(model中的模块)的生命周期,监视其执行状态和执行结果。在pytorch中,提供丰富的hook api,让我们可以监听并修改tensor在模型forword中的状态。在本博文中,基于hook操作实现了即插即用的Dropout操作,支持dorpblock、dropout2d等系列Dropout操作。在pytorch中layer的生命周期可以简单的原创 2022-04-04 11:32:36 · 2093 阅读 · 0 评论 -
pytorch 22 8种Dropout方法的简介 及 基于Dropout用4行代码快速实现DropBlock
自dropout操作被提出后,被各位大神们玩出了花样。具体有8种,本文首先介绍了8中Dropout方法,主要讲述基于dropout用4行代码实现DropBlock。核心原理就一句话:dropout会随机丢失像素点,但是对dropout的结果进行上采样后像素点将会变成像素块。基于上采样后的dropout结果,我们可以实现DropBlock。在本文实现了pytorch版与paddle版的DropBlock。在本文主要讲述基于dropout实现DropBlock的实现,因为博主在浏览中发现大量实现DropBl原创 2022-03-30 20:52:26 · 2508 阅读 · 0 评论 -
pytorch 21 各种学习率调度器的使用
pytorch内置的学习率调度在lr_scheduler包下可以使用from torch.optim import lr_scheduler。为了更直观的了解各种调度器的学习率调整过程,现将各种学习率调度器的使用和学习率曲线进行绘图。其详细的使用方法可见以下官网地址https://pytorch.org/docs/1.9.1/search.html?q=lr_scheduler&check_keywords=yes&area=default,下面只简单介绍基本的参数列表和使用方法,及其调度曲原创 2022-02-22 18:54:33 · 1481 阅读 · 0 评论 -
pytorch 20 基于pytorch实现腐蚀膨胀、开运算闭运算等形态学操作
在一些图像处理项目中,有时需要对图像进行腐蚀膨胀和各种值处理,引入opencv处理后,数据无法进行快速的值处理,如值域截取、使用mask、where操作等。因此,可以使用torch实现腐蚀膨胀,从而避免对数据结构的修改,同时保证了在一个模型内实现所有操作。(当然,opencv中的值域截取也是可以很方便的,具体可以参考以下链接中的第七节c++上opencv的常用数组操作_a486259的博客-优快云博客)但是,基于torch实现的腐蚀膨胀,有一定的假设前提:所有的结构元素都为方形算子。实现后可以作用于C原创 2022-02-14 20:47:07 · 6084 阅读 · 8 评论 -
pytorch 19 深度学习中的正则化手段(Regularization)
Regularization一词的原始意思是指规则和约束,在深度学习中正则化(Regularization)是指给模型添加约束项,限制模型的表达能力,也就是指提升模型的泛化能力。根据约束内容的不同,正则化方法可分为直接约束参数表达能力和约束模型学习过程的。直接约束参数表达能力:模型减枝、权重量化、W最大范数正则化约束模型学习过程:L1正则化、L2正则化、弹性网络(L1与L2的加权)、early stop(早停法)、辅助头loss、Dropout,MC Dropout模型剪枝是指按照一定的原创 2022-01-21 17:26:11 · 2445 阅读 · 0 评论 -
pytorch 18 onnx多输入多输出模型转IR模型并在python与C++下用Openvion部署
实现用多输入多输出的onnx模型转openvion的IR格式,并用openvion的python api进行调用,最后实现C++的调用,python结果与C++结果一模一样。pytorch模型转onnx可以参考pytorch 16 torch模型转onnx并进行调用_a486259的博客-优快云博客Openvino安装教程可以参考win10下安装配置openvino教程_a486259的博客-优快云博客一、python下模型转换及openvino.inference_engine测试1.原创 2022-01-13 19:00:44 · 1533 阅读 · 0 评论 -
pytorch 17 onnx多输入多输出模型在python与C++下用OnnxRuntime部署
pytorch模型在转换成onnx模型后可以明显加速,此外模型在进行openvino部署时也需要将pytorch模型转换为onnx格式。为此,以多输入多输出模型为例,记录一下模型转换及python下onnxruntime调用过程。并实现C++下多输入多输出模型的Onnxruntime的调用。一 、python下模型转onnx与测试1.1、构建pytorch多输入多输出模型import torchimport torch.nn as nnimport torch.nn.functional原创 2022-01-13 15:09:56 · 4093 阅读 · 2 评论 -
pytorch 16 迁移学习核心技巧·从模型加载到按需初始化模块权重,再到各layer分组设置学习率
实现加载模型任意权重,自动跳过不匹配的layer(name不匹配,权重shape不匹配),该操作通常用在迁移学习模型加载中。实现对模型中不同moudle甚至不同name的layer进行不同方式的初始化,该操作通常用在迁移学习模型初始化中。实现对模型中不同的部分设置不同的学习率(支持冻结某些layer),该操作通常用在迁移学习模型训练阶段中。原创 2022-01-12 11:15:59 · 795 阅读 · 0 评论 -
pytorch 14 训练数据不平衡下的解决方案
在实际项目进程中有时会碰到数据不平衡的情况,数据不平衡会导致训练过程中的loss/梯度不平衡,最终导致模型所学习到的知识有偏好。在部署模型时就会出现类型多的数据效果好,类型少的数据效果差。那么在解决问题就要从这三方面下手,让不平衡的数据变得平衡,让loss/梯度变得平衡,让模型在学习过程不受数据量的影响,变得无偏好。所提到的点不仅可以针对数值型数据,也可以针对图像型数据。首先在这里给出一个基本定义,多数类:数量特别多的类别 少数类:数量较少的类别。后续中假设多数类为A,少数类为B。1、让数.原创 2022-01-07 23:59:37 · 2203 阅读 · 0 评论 -
pytorch 15 模型性能分析,从loss出发到具体数据(以语义分割为例,实现深度学习中的手工TomeLinks方法)
在一些情况下,通过各类调参方法都无法提升模型的效果。在有限的数据环境下需要对模型的loss进行分析,找出其中导致模型性能下降的数据(异常数据,分类错误数据)。通过不断修正错误数据的方式,可以提升模型的性能。修正错误的分类,消除数据中的混淆对,本质上是一种TomekLinks方法。TomekLinks是指邻近的两个相反类的例子,在深度学习中可以理解为训练数据中正例与负例混淆的情况。在没有消除TomeLinks数据时,训练模型得出的分类边界如图1左边的荧光色标记所示,弯曲而又负责,同时分类错误的数据还较多。原创 2022-01-10 17:37:38 · 1010 阅读 · 0 评论 -
pytorch 13 训练过程中出现loss为nan、inf(梯度爆炸、梯度消失)的分析及解决方案
从理论的角度上看,本质是梯度消失与梯度爆炸所导致的。梯度消失是指导数值特别小,导致其连乘项接近无穷小,可能是由输入数据的值域太小(导致权重W的导致特别小)或者是神经网络层输出数据落在在激活函数的饱和区(导致激活函数的导致特别小);而梯度爆炸是指导数值特别大,导致其连乘项特别大,致使W在更新后超出了值域的表示范围。可能是输入数据没有进行归一化(数据量纲太大,致使W的梯度值极大),只要连乘项的导数一直大于1,就会使得靠近输入层的W更新幅度特别大。连乘项是指链式求导法则中每一层的导数,很明显梯度消失与梯度爆炸都受原创 2021-12-01 16:25:08 · 8569 阅读 · 0 评论 -
pytorch 12 支持任意维度数据的梯度平衡机制GHM Loss的实现(支持ignore_index、class_weight,支持反向传播训练,支持多分类)
梯度平衡机制GHM(Gradient Harmonized Mechanism)Loss是Focal loss的升级版,源自论文https://arxiv.org/abs/1811.05181。Focal loss针对难易样本的不平衡而设计,通过调节系数可以缩小易样本在loss中的比例,使得难样本的loss权重变大。但是并非所有的难样本都是值得关注的,GHMLoss对梯度进行直方图统计,统计情况如图1所示。按照一定范围计算频率,将loss值与梯度模长频率的倒数相乘。这样子可以使容易样本(数量多,梯度值小..原创 2022-01-18 20:22:05 · 2357 阅读 · 10 评论 -
pytorch 11 支持任意维度数据的focal loss的实现(支持ignore_index,支持反向传播训练,支持多分类)
由于网上大部分关于focal loss的实现代码都存在问题,比如不支持任意维度数据,也不支持ignore_index的设置,更不支持多分类,甚至有些还不支持反向传播,更有甚者在alpha=1,gamma=0时focal loss的值与交叉熵居然不相等,因此对focal loss进行重新实现。本实现支持任意维度的数据,支持ignore_index的设置,同时支持二分类与多分类,在=1,=0时 focal loss值与交叉熵完全相等,具体实现如下所示 。核心代码仅4行原创 2022-01-04 00:13:54 · 1152 阅读 · 0 评论