无锡网站排名推广,wordpress虎嗅,建设银行个人网上银行网站加载,建设一个网站可以采用哪几种方案学习深度学习有些时间了#xff0c;相信很多小伙伴都已经接触 图像分类、目标检测甚至图像分割(语义分割)等算法了#xff0c;相信大部分小伙伴都是从分类入门#xff0c;接触各式各样的 Backbone算法开启自己的炼丹之路。
但是炼丹并非全是 Backbone#xff0c;更多的是各…学习深度学习有些时间了相信很多小伙伴都已经接触 图像分类、目标检测甚至图像分割(语义分割)等算法了相信大部分小伙伴都是从分类入门接触各式各样的 Backbone算法开启自己的炼丹之路。
但是炼丹并非全是 Backbone更多的是各种辅助代码而这部分公开的并不多特别是对于刚接触/入门的人来说就更难了博主当时就苦于没有完善的辅助代码走了很多弯路好在YOLOv5提供了分类、目标检测的完整代码不同于目标检测因数据集不同对应的数据辅助代码也不兼容图像分类就不会有这方面的影响只需要更换下模型设置下输出类即可。可谓相当的成熟学者必备
官方代码https://github.com/ultralytics/yolov5 分类任务有四部分组成tutorial说明train、val、predict 脚本
对于有一定基础的小伙伴可以直接查看 tutorial 自行运行如果遇到一些暂无解决的问题时再往下阅读 train任务
整个 图像分类任务还是较为复杂的内容略微庞大一篇讲解不完讲解不清的可以下方留言较难问题博主再出新博文解释。 parse_opt() 函数
首先大家在学习代码时一定要学会 debug 模型这样才知道代码是如何运行的一般从 if __name__ __main__: 开始进行。 首先是 def parse_opt(knownFalse): 解析配置参数 parser.add_argument(--model, typestr, defaultyolov5s-cls.pt, helpinitial weights path) –model 参数是配置模型类型从下面的解析 --model参数可以看出如果 --model的值是模型权重名称/路径的话直接加载到模型model如果–model是torchvision模型库的将从torchvision库中读取 如果都没有的话将以错误输出。 所以 --model 一定要是 模型权重名称/路径并且需要能够读取得到才可以。亦可以是torchvision模型库中的模型名称也可以可以通过 torchvision.models.__dict_ 查看安装的torchvision封装了哪些模型库 此外 torchvision.models.__dict__[opt.model](weightsIMAGENET1K_V1 if pretrained else None) 代码并不适用于所有版本的 torchvision模型还是需要进入 torchvision.model下的具体模型代码中查看 调用方法否则会出现错误。 parser.add_argument(--data, typestr, defaultmnist, helpcifar10, cifar100, mnist, imagenet, etc.) –data 可以是数据集的路径也可以是数据集而名称 只是数据集名称必须是 ultralytics 公开的数据集才可以比如ClassificationCaltech 101、Caltech 256、CIFAR-10、CIFAR-100、Fashion-MNIST、ImageNet、ImageNet-10、Imagenette、Imagewoof、MNIST 如果是自定义的数据集需要注意的是每一类的所有数据需要放到同一个文件夹下面如同 cifar10 数据集一样在 train/val/test 文件夹下分别建立每一类的子文件夹其中可以存放全部图片也可以有多层嵌套路径注意train/val/test下的文件夹名称和数量 要保持一致否则训练出来的指标会很差 parser.add_argument(--epochs, typeint, default10) 就是训练的迭代轮数 parser.add_argument(--imgsz, --img, --img-size, typeint, default128, helptrain, val image size (pixels)) 训练时 图片的尺寸大小 parser.add_argument(--nosave, actionstore_true, helponly save final checkpoint) 不保存中间每个epoch的权重如果需要保存的话将其设置为 False parser.add_argument(--cache, typestr, nargs?, constram, help--cache images in ram (default) or disk) 选择数据的读取方式ram方式为一次性将所有的数据读取到内存里以为内存与显存的传输速度高因此训练市场可以极大降低前提是内存够大如果没有足够大的内存的话可以算法disk硬盘读取效率略低 parser.add_argument(--device, default, helpcuda device, i.e. 0 or 0,1,2,3 or cpu) 选择训练设备可以选择“cup, mps, cuda”MPSApple Metal Performance Shaders parser.add_argument(--workers, typeint, default8, helpmax dataloader workers (per RANK in DDP mode)) 数据集加载时的线程数 parser.add_argument(--project, defaultROOT / runs/train-cls, helpsave to project/name) 项目保存路径及名称 parser.add_argument(--name, defaultexp, helpsave to project/name) 每次训练的子文件名 parser.add_argument(--exist-ok, actionstore_true, helpexisting project/name ok, do not increment) 如果已经存在保存文件名/路径可以覆盖保存 parser.add_argument(--pretrained, nargs?, constTrue, defaultTrue, helpstart from i.e. --pretrained False) 是否使用预训练权重前提是必须是torchvision中的模型官方提供预训练接口的模型才有用 parser.add_argument(--optimizer, choices[SGD, Adam, AdamW, RMSProp], defaultAdam, helpoptimizer) 优化器选择此处官方配置好了 [‘SGD’, ‘Adam’, ‘AdamW’, ‘RMSProp’] 优化器如果需要其他优化器需用小伙伴自行配置 parser.add_argument(--lr0, typefloat, default0.001, helpinitial learning rate) 优化器的初始学习率 parser.add_argument(--label-smoothing, typefloat, default0.1, helpLabel smoothing epsilon) label-smoothing 方法对 label进行 smoothing 处理 parser.add_argument(--cutoff, typeint, defaultNone, helpModel layer cutoff index for Classify() head) 裁切模型的 classify分支 的层数model.model model.model[:cutoff] parser.add_argument(--dropout, typefloat, defaultNone, helpDropout (fraction)) 随机失效部分神经元dropout处理 parser.add_argument(--verbose, actionstore_true, helpVerbose mode) 冗余模式记录中间的模型日志 parser.add_argument(--seed, typeint, default0, helpGlobal training seed) 全局随机种子 parser.add_argument(--local_rank, typeint, default-1, helpAutomatic DDP Multi-GPU argument, do not modify) 如果小伙伴有多卡可以采用此方法可以自动调用多个显卡的资源即DDP 模式-1 为不采用 train() 函数
train() 函数前面都是一些模型配置
模型训练保存路径以及配置训练日志默认情况下模型训练保存 一个 last.pt 和 best.pt数据集下载如果是官方的数据集直接 对 --data 设置数据集名称即可完成路径也是可以的如果是自己的数据集需要设置数据集路径只需要给到 train 的上一级目录即可 数据集构建此处将读取数据集的类别数以及加载数据集此处默认是以 test 为验证集的如果没有test 备份选择 val。如果需要用 val 当验证集手动改为 val即可。再次提示train 下的文件夹名称和数量需要和 验证集下的保持一致否则模型性能很低且无法提升惨痛的教训 构建模型此处需要注意一点作为分类模型模型的输出层必须和数据集的类别数量保持一致必须 如果不使用 torchvision中的模型只需要将 model 赋值为自己的模型即可 日志保存模型等信息以及加载 数据和标签此处的数据加载器采用的是迭代器方式因此采用 nest(iter())然后是优化器设置学习率、调度器(scheduler)设置 和 EMA配置最后是损失函数criterion。 进行完上面所有的参数配置真正的模型训练还在下面这个循环里