网站建设合同应注意,微信小程序制作教学,初学者拟建网站,胶南网站建设公司文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集一些问题 摘要
大核卷积神经网络#xff08;ConvNets#xff09;近年来受到广泛关注#xff0c;但仍存在两个关键问题需要进一步研究。首先#xff0c;目前的大型卷积神经网络架构大… 文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集一些问题 摘要
大核卷积神经网络ConvNets近年来受到广泛关注但仍存在两个关键问题需要进一步研究。首先目前的大型卷积神经网络架构大多遵循传统卷积神经网络或Transformer的设计原则而大核ConvNets的架构设计仍未得到充分解决。其次尽管Transformer已在多种模态中占据主导地位但仍需研究卷积神经网络是否也具备超越视觉领域的强大通用感知能力。
本文从两个方面进行了贡献。首先提出了设计大型卷积神经网络的四项架构准则。核心思想是利用大型内核与小型内核的本质区别大型内核可以广角观察而无需深入。遵循这些准则我们提出的大型卷积神经网络在图像识别方面表现出色。例如UniRepLKNet在ImageNet上达到了88.0%的准确率ADE20K mIoU为55.6%COCO box AP为56.4%性能优于最近提出的许多强大竞争对手同时速度更快。
其次大型内核是解锁ConvNets在非擅长领域中出色表现的关键。通过某些模态相关的预处理方法UniRepLKNet在时间序列预测和音频识别任务上实现了领先性能甚至在未经模态特定定制的情况下也取得了这一成就。
论文还提出了以下关于大核卷积神经网络的架构准则
利用大核的本质特性大核能够宽视野观察而不需要深入挖掘。这一特性使得大核卷积神经网络能够在保持较高性能的同时降低计算的复杂度和时间成本。设计更高效的架构针对大核卷积神经网络需要设计更高效的架构以充分利用大核的优势。例如可以采用更少的层数和更小的特征图大小同时保持较高的性能。考虑数据预处理对于大核卷积神经网络数据预处理是一个重要的方面。通过对输入数据进行适当的归一化可以改善网络的性能。优化训练策略训练大核卷积神经网络需要采用适当的优化策略。例如可以采用分阶段训练的方法以及适当的正则化技术来防止过拟合。考虑硬件实现大核卷积神经网络在硬件实现上需要考虑效率问题。因此需要设计易于并行化和优化的架构以便在具有有限资源的情况下实现高效的计算。
本文使用UniRepLKNet模型实现图像分类任务模型选择最小的unireplknet_t在植物幼苗分类任务ACC达到了96%。 通过这篇文章能让你学到
如何使用数据增强包括transforms的增强、CutOut、MixUp、CutMix等增强手段如何实现UniRepLKNet模型实现训练如何使用pytorch自带混合精度如何使用梯度裁剪防止梯度爆炸如何使用DP多显卡训练如何绘制loss和acc曲线如何生成val的测评报告如何编写测试脚本测试测试集如何使用余弦退火策略调整学习率如何使用AverageMeter类统计ACC和loss等自定义变量如何理解和统计ACC1和ACC5如何使用EMA
如果基础薄弱对上面的这些功能难以理解可以看我的专栏经典主干网络精讲与实战 这个专栏从零开始时一步一步的讲解这些让大家更容易接受。
安装包
安装timm
使用pip就行命令
pip install timmmixup增强和EMA用到了timm
数据增强Cutout和Mixup
为了提高成绩我在代码中加入Cutout和Mixup这两种增强方式。实现这两种增强需要安装torchtoolbox。安装命令
pip install torchtoolboxCutout实现在transforms中。
from torchtoolbox.transform import Cutout
# 数据预处理
transform transforms.Compose([transforms.Resize((224, 224)),Cutout(),transforms.ToTensor(),transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])需要导入包from timm.data.mixup import Mixup
定义Mixup和SoftTargetCrossEntropy mixup_fn Mixup(mixup_alpha0.8, cutmix_alpha1.0, cutmix_minmaxNone,prob0.1, switch_prob0.5, modebatch,label_smoothing0.1, num_classes12)criterion_train SoftTargetCrossEntropy()Mixup 是一种在图像分类任务中常用的数据增强技术它通过将两张图像以及其对应的标签进行线性组合来生成新的数据和标签。 参数详解 mixup_alpha (float): mixup alpha 值如果 0则 mixup 处于活动状态。 cutmix_alpha (float)cutmix alpha 值如果 0cutmix 处于活动状态。 cutmix_minmax (List[float])cutmix 最小/最大图像比率cutmix 处于活动状态如果不是 None则使用这个 vs alpha。 如果设置了 cutmix_minmax 则cutmix_alpha 默认为1.0 prob (float): 每批次或元素应用 mixup 或 cutmix 的概率。 switch_prob (float): 当两者都处于活动状态时切换cutmix 和mixup 的概率 。 mode (str): 如何应用 mixup/cutmix 参数每个’batch’‘pair’元素对‘elem’元素。 correct_lam (bool): 当 cutmix bbox 被图像边框剪裁时应用。 lambda 校正 label_smoothing (float)将标签平滑应用于混合目标张量。 num_classes (int): 目标的类数。 EMA
EMAExponential Moving Average是指数移动平均值。在深度学习中的做法是保存历史的一份参数在一定训练阶段后拿历史的参数给目前学习的参数做一次平滑。具体实现如下 import logging
from collections import OrderedDict
from copy import deepcopy
import torch
import torch.nn as nn_logger logging.getLogger(__name__)class ModelEma:def __init__(self, model, decay0.9999, device, resume):# make a copy of the model for accumulating moving average of weightsself.ema deepcopy(model)self.ema.eval()self.decay decayself.device device # perform ema on different device from model if setif device:self.ema.to(devicedevice)self.ema_has_module hasattr(self.ema, module)if resume:self._load_checkpoint(resume)for p in self.ema.parameters():p.requires_grad_(False)def _load_checkpoint(self, checkpoint_path):checkpoint torch.load(checkpoint_path, map_locationcpu)assert isinstance(checkpoint, dict)if state_dict_ema in checkpoint:new_state_dict OrderedDict()for k, v in checkpoint[state_dict_ema].items():# ema model may have been wrapped by DataParallel, and need module prefixif self.ema_has_module:name module. k if not k.startswith(module) else kelse:name knew_state_dict[name] vself.ema.load_state_dict(new_state_dict)_logger.info(Loaded state_dict_ema)else:_logger.warning(Failed to find state_dict_ema, starting from loaded model weights)def update(self, model):# correct a mismatch in state dict keysneeds_module hasattr(model, module) and not self.ema_has_modulewith torch.no_grad():msd model.state_dict()for k, ema_v in self.ema.state_dict().items():if needs_module:k module. kmodel_v msd[k].detach()if self.device:model_v model_v.to(deviceself.device)ema_v.copy_(ema_v * self.decay (1. - self.decay) * model_v)
加入到模型中。
#初始化
if use_ema:model_ema ModelEma(model_ft,decaymodel_ema_decay,devicecpu,resumeresume)# 训练过程中更新完参数后同步update shadow weights
def train():optimizer.step()if model_ema is not None:model_ema.update(model)# 将model_ema传入验证函数中
val(model_ema.ema, DEVICE, test_loader)针对没有预训练的模型容易出现EMA不上分的情况这点大家要注意啊
项目结构
UniRepLKNet_Demo
├─data1
│ ├─Black-grass
│ ├─Charlock
│ ├─Cleavers
│ ├─Common Chickweed
│ ├─Common wheat
│ ├─Fat Hen
│ ├─Loose Silky-bent
│ ├─Maize
│ ├─Scentless Mayweed
│ ├─Shepherds Purse
│ ├─Small-flowered Cranesbill
│ └─Sugar beet
├─models
│ ├─__init__.py
│ └─unireplknet.py
├─mean_std.py
├─makedata.py
├─train.py
└─test.pymean_std.py计算mean和std的值。 makedata.py生成数据集。 ema.pyEMA脚本 train.py:训练RevCol模型 models来源官方代码对面的代码做了一些适应性修改。
计算mean和std
为了使模型更加快速的收敛我们需要计算出mean和std的值新建mean_std.py,插入代码
from torchvision.datasets import ImageFolder
import torch
from torchvision import transformsdef get_mean_and_std(train_data):train_loader torch.utils.data.DataLoader(train_data, batch_size1, shuffleFalse, num_workers0,pin_memoryTrue)mean torch.zeros(3)std torch.zeros(3)for X, _ in train_loader:for d in range(3):mean[d] X[:, d, :, :].mean()std[d] X[:, d, :, :].std()mean.div_(len(train_data))std.div_(len(train_data))return list(mean.numpy()), list(std.numpy())if __name__ __main__:train_dataset ImageFolder(rootrdata1, transformtransforms.ToTensor())print(get_mean_and_std(train_dataset))数据集结构 运行结果
([0.3281186, 0.28937867, 0.20702125], [0.09407319, 0.09732835, 0.106712654])把这个结果记录下来后面要用
生成数据集
我们整理还的图像分类的数据集结构是这样的
data
├─Black-grass
├─Charlock
├─Cleavers
├─Common Chickweed
├─Common wheat
├─Fat Hen
├─Loose Silky-bent
├─Maize
├─Scentless Mayweed
├─Shepherds Purse
├─Small-flowered Cranesbill
└─Sugar beetpytorch和keras默认加载方式是ImageNet数据集格式格式是
├─data
│ ├─val
│ │ ├─Black-grass
│ │ ├─Charlock
│ │ ├─Cleavers
│ │ ├─Common Chickweed
│ │ ├─Common wheat
│ │ ├─Fat Hen
│ │ ├─Loose Silky-bent
│ │ ├─Maize
│ │ ├─Scentless Mayweed
│ │ ├─Shepherds Purse
│ │ ├─Small-flowered Cranesbill
│ │ └─Sugar beet
│ └─train
│ ├─Black-grass
│ ├─Charlock
│ ├─Cleavers
│ ├─Common Chickweed
│ ├─Common wheat
│ ├─Fat Hen
│ ├─Loose Silky-bent
│ ├─Maize
│ ├─Scentless Mayweed
│ ├─Shepherds Purse
│ ├─Small-flowered Cranesbill
│ └─Sugar beet新增格式转化脚本makedata.py,插入代码
import glob
import os
import shutilimage_listglob.glob(data1/*/*.png)
print(image_list)
file_dirdata
if os.path.exists(file_dir):print(true)#os.rmdir(file_dir)shutil.rmtree(file_dir)#删除再建立os.makedirs(file_dir)
else:os.makedirs(file_dir)from sklearn.model_selection import train_test_split
trainval_files, val_files train_test_split(image_list, test_size0.3, random_state42)
train_dirtrain
val_dirval
train_rootos.path.join(file_dir,train_dir)
val_rootos.path.join(file_dir,val_dir)
for file in trainval_files:file_classfile.replace(\\,/).split(/)[-2]file_namefile.replace(\\,/).split(/)[-1]file_classos.path.join(train_root,file_class)if not os.path.isdir(file_class):os.makedirs(file_class)shutil.copy(file, file_class / file_name)for file in val_files:file_classfile.replace(\\,/).split(/)[-2]file_namefile.replace(\\,/).split(/)[-1]file_classos.path.join(val_root,file_class)if not os.path.isdir(file_class):os.makedirs(file_class)shutil.copy(file, file_class / file_name)完成上面的内容就可以开启训练和测试了。
一些问题
1、关于depthwise_conv2d_implicit_gemm的安装
depthwise_conv2d_implicit_gemm是深度分离卷积的加速模块如果使用Window系统安装会有问题我们可以不用安装直接使用Pytorch的卷积。