YoloV8改进策略:卷积改进|DOConv轻量卷积,即插即用|适用各种场景

摘要

本文使用DOConv卷积,替换YoloV8的常规卷积,轻量高效,即插即用!改进方法非常简单。
在这里插入图片描述

DO-Conv(Depthwise Over-parameterized Convolutional Layer)是一种深度过参数化的卷积层,用于提高卷积神经网络(CNN)的性能。它的核心思想是在训练阶段使用额外的深度卷积来增强卷积层,其中每个输入通道与不同的二维核进行卷积。这两个卷积的组合构成了一个过度参数化,因为它增加了可学习的参数,而结果的线性操作可以用单个卷积层来表示。在推理阶段,DO-Conv可以融合到常规卷积层中,使得计算量与常规卷积层的计算量完全相同。

DO-Conv可以作为一种即插即用的模块,用于替代CNN中的常规卷积层,以提高在各种计算机视觉任务(如图像分类、语义分割和对象检测)上的性能。通过实验证明,使用DO-Conv不仅可以加速网络的训练过程,还能在多种计算机视觉任务中取得比使用传统卷积层更好的结果。

论文链接:https://arxiv.org/pdf/2006.12030.pdf

代码

# coding=utf-8
import math
import torch
import numpy as np
from torch.nn import init
from itertools import repeat
from torch.nn import functional as F
from torch._jit_internal import Optional
from torch.nn.parameter import Parameter
from torch.nn.modules.module import Module
import collectionsclass DOConv2d(Module):"""DOConv2d can be used as an alternative for torch.nn.Conv2d.The interface is similar to that of Conv2d, with one exception:1. D_mul: the depth multiplier for the over-parameterization.Note that the groups parameter switchs between DO-Conv (groups=1),DO-DConv (groups=in_channels), DO-GConv (otherwise)."""__constants__ = ['stride', 'padding', 'dilation', 'groups','padding_mode', 'output_padding', 'in_channels','out_channels', 'kernel_size', 'D_mul']__annotations__ = {'bias': Optional[torch.Tensor]}def __init__(self, in_channels, out_channels, kernel_size, D_mul=None, stride=1,padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros'):super(DOConv2d, self).__init__()kernel_size = _pair(kernel_size)stride = _pair(stride)padding = _pair(padding)dilation = _pair(dilation)if in_channels % groups != 0:raise ValueError('in_channels must be divisible by groups')if out_channels % groups != 0:raise ValueError('out_channels must be divisible by groups')valid_padding_modes = {'zeros', 'reflect', 'replicate', 'circular'}if padding_mode not in valid_padding_modes:raise ValueError("padding_mode must be one of {}, but got padding_mode='{}'".format(valid_padding_modes, padding_mode))self.in_channels = in_channelsself.out_channels = out_channelsself.kernel_size = kernel_sizeself.stride = strideself.padding = paddingself.dilation = dilationself.groups = groupsself.padding_mode = padding_modeself._padding_repeated_twice = tuple(x for x in self.padding for _ in range(2))#################################### Initailization of D & W ###################################M = self.kernel_size[0]N = self.kernel_size[1]self.D_mul = M * N if D_mul is None or M * N <= 1 else D_mulself.W = Parameter(torch.Tensor(out_channels, in_channels // groups, self.D_mul))init.kaiming_uniform_(self.W, a=math.sqrt(5))if M * N > 1:self.D = Parameter(torch.Tensor(in_channels, M * N, self.D_mul))init_zero = np.zeros([in_channels, M * N, self.D_mul], dtype=np.float32)self.D.data = torch.from_numpy(init_zero)eye = torch.reshape(torch.eye(M * N, dtype=torch.float32), (1, M * N, M * N))d_diag = eye.repeat((in_channels, 1, self.D_mul // (M * N)))if self.D_mul % (M * N) != 0:  # the cases when D_mul > M * Nzeros = torch.zeros([in_channels, M * N, self.D_mul % (M * N)])self.d_diag = Parameter(torch.cat([d_diag, zeros], dim=2), requires_grad=False)else:  # the case when D_mul = M * Nself.d_diag = Parameter(d_diag, requires_grad=False)##################################################################################################if bias:self.bias = Parameter(torch.Tensor(out_channels))fan_in, _ = init._calculate_fan_in_and_fan_out(self.W)bound = 1 / math.sqrt(fan_in)init.uniform_(self.bias, -bound, bound)else:self.register_parameter('bias', None)def extra_repr(self):s = ('{in_channels}, {out_channels}, kernel_size={kernel_size}'', stride={stride}')if self.padding != (0,) * len(self.padding):s += ', padding={padding}'if self.dilation != (1,) * len(self.dilation):s += ', dilation={dilation}'if self.groups != 1:s += ', groups={groups}'if self.bias is None:s += ', bias=False'if self.padding_mode != 'zeros':s += ', padding_mode={padding_mode}'return s.format(**self.__dict__)def __setstate__(self, state):super(DOConv2d, self).__setstate__(state)if not hasattr(self, 'padding_mode'):self.padding_mode = 'zeros'def _conv_forward(self, input, weight):if self.padding_mode != 'zeros':return F.conv2d(F.pad(input, self._padding_repeated_twice, mode=self.padding_mode),weight, self.bias, self.stride,_pair(0), self.dilation, self.groups)return F.conv2d(input, weight, self.bias, self.stride,self.padding, self.dilation, self.groups)def forward(self, input):M = self.kernel_size[0]N = self.kernel_size[1]DoW_shape = (self.out_channels, self.in_channels // self.groups, M, N)if M * N > 1:######################### Compute DoW ################## (input_channels, D_mul, M * N)D = self.D + self.d_diagW = torch.reshape(self.W, (self.out_channels // self.groups, self.in_channels, self.D_mul))# einsum outputs (out_channels // groups, in_channels, M * N),# which is reshaped to# (out_channels, in_channels // groups, M, N)DoW = torch.reshape(torch.einsum('ims,ois->oim', D, W), DoW_shape)else:# in this case D_mul == M * N# reshape from# (out_channels, in_channels // groups, D_mul)# to# (out_channels, in_channels // groups, M, N)DoW = torch.reshape(self.W, DoW_shape)return self._conv_forward(input, DoW)def _ntuple(n):def parse(x):if isinstance(x, collections.abc.Iterable):return xreturn tuple(repeat(x, n))return parse
_pair = _ntuple(2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2978929.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

用户实践:从 HBase 升级为OceanBase,仟传实现110000 TPS的千亿级KV性能优化

本文作者&#xff1a;仟传网络科技技术专家 刘贵宗 & 肖旺生 一、业务需求及选型背景 仟传网络科技&#xff08;TargetSocial&#xff09;&#xff0c;是国内知名的内容社交平台整合营销服务商&#xff0c;为企业级客户提供高效的KOL&#xff08;关键意见领袖&#xff09;…

互联网大厂ssp面经,数据结构:part1

1. 数组和链表的区别是什么&#xff1f; a. 数组是一种线性数据结构&#xff0c;存储在连续的内存块中&#xff0c;元素可以通过索引直接访问。 b. 链表是由节点组成的数据结构&#xff0c;每个节点包含数据和指向下一个节点的指针。 2. 数组和链表的的优缺点是什么&#xff…

旅游网站制作流程

旅游网站制作流程是一个较复杂的过程&#xff0c;因为它需要结合市场调研、用户需求、内容构建、技术开发等多个方面。在这篇文章中&#xff0c;我将简单介绍一下旅游网站的制作流程&#xff0c;大致分为以下步骤。 第一步&#xff1a;市场调研 在制作旅游网站前&#xff0c;我…

【机器学习】分类与预测算法的评价与优化

以实际案例解析F1值与P-R曲线的应用 一、分类算法与性能评价的重要性二、F1值与P-R曲线的概念与意义三、实例解析&#xff1a;以垃圾邮件检测为例四、代码实现与结果分析五、结论与展望 在数据驱动的时代&#xff0c;机器学习算法以其强大的数据处理和分析能力&#xff0c;成为…

会计凭证替代和验校

会计凭证替代和验校 一、替代 在凭证保存前根据设置条件判断此凭证是否有效&#xff0c;其中可以按抬头、行项目或完全凭证来判断,然后再根据Validation设置的消息类型决定凭证是否允许保存。SAP校验是对在系统输入的数据按照规则设定检验是否正确&#xff0c;可以按抬头、行…

基于springboot实现疫情下图书馆管理系统项目【项目源码+论文说明】

基于springboot实现疫情下图书馆管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了疫情下图书馆管理系统的开发全过程。通过分析疫情下图书馆管理系统管理的不足&#xff0c;创建了一个计算机管理疫…

快速入门SpringCloudAlibaba实战篇【SpringBoot3.x + JDK17】!

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…

SpringBoot下载Excel模板功能

目录 一、前端只需要填写一个a标签调用一下后端接口即可 二、后端 2.1 准备一个excel模板 &#xff0c;将其复制到resource目录下的templates文件夹下 2.2 接着复制下列代码即可 三、运行效果 一、前端只需要填写一个a标签调用一下后端接口即可 1.1 先代理一下防止跨域 e…

代码随想录学习Day 30

860.柠檬水找零 题目链接 讲解链接 思路&#xff1a;需要找零的情况是顾客支付10元或20元&#xff0c;尤其是支付20元时需要考虑找零的方式&#xff0c;此时可以选择找零3张5元或者一张10元一张5元&#xff0c;按照贪心算法的思路来看&#xff1a; 局部最优&#xff1a;在找…

javaWeb项目-财务管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Springboot框架 …

在Qt助手(Assistant)中查看Qt5的所有模块

2024年4月23日&#xff0c;周二上午 选择“内容”选项卡&#xff0c;列表里面的内容就是Qt5的所有模块

50W 1.5KVDC 隔离 宽电压输入 DC/DC 电源模块 ——TP50DG 系列

TP50DG系列电源模块额定输出功率为50W&#xff0c;应用于2:1、4&#xff1a;1电压输入范围9V-18V、18V-36V、36V-75VDC&#xff0c;9-36V&#xff0c;18-75V的输入电压环境&#xff0c;输出电压精度可达1%&#xff0c;具有输入欠压保护、输 出过流保护、输出短路保护、输出过压…

Java基础之JVM基础调优与常见问题

常见命令 以下命令的介绍&#xff0c;全部在jdk8环境下运行的&#xff1b; jps ☆☆☆☆☆ 查看当前运行的进程号&#xff1b; jmap ☆☆☆ jmap命令可以查看jvm的内存信息&#xff0c;class对应的实例个数以及占用的内存大小 jmap -histo 查看当前java进程 [rdVM-8-12-c…

PDF文件去除文字水印

文章目录 0、背景1、准备工作2、查看是否是文字水印3、批量去除水印 0、背景 本文主题为去除PDF文件中的水印。源文件来自这里。防止丢失&#xff0c;我在这里做个记录&#xff0c;感谢原作者的付出&#xff0c;也欢迎大家关注原作者。 1、准备工作 下载Adobe Acrobat DC软件…

Spark Standalone模式部署

准备至少2台虚拟机&#xff0c;装好linux系统&#xff0c;我装的是Ubuntu20.04。 1.修改主机名&#xff08;每台&#xff09; 1&#xff09;修改/etc/hostsname内容&#xff0c;主节点改为master&#xff0c;子节点改为slaver1 sudo vim /etc/hostname 2&#xff09;在/etc/…

【Netty】使用Netty实现自己的通信协议

前言 基于Netty开发的网关 为什么需要自定义协议这一点的理由其实很容易想到。 比如对于我们比较熟知的Dubbo&#xff0c;其内部的协议就是自定义的。 之所以需要自定义协议&#xff0c;无非是因为&#xff1a;没有一种标准化协议来满足不同差异化需 求。 因此很多的中间件都会…

揭秘“磁盘管理未知没有初始化”背后的秘密与应对策略

在日常使用电脑的过程中&#xff0c;我们有时会遇到一个令人头疼的问题——磁盘管理显示“未知没有初始化”。这种情况意味着系统无法正确识别和管理该磁盘&#xff0c;导致我们无法访问其中的数据。那么&#xff0c;究竟什么是“磁盘管理未知没有初始化”&#xff1f;又该如何…

等保测评之主机测评详解(二级)

等保测评之主机测评详解&#xff08;二级&#xff09;服务器——Windows 身份鉴别: 测评项a&#xff09;&#xff1a; a&#xff09;应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换&#xff1b; 整改方…

java实现解析html获取图片或视频url

一、前言 有时在实际项目中&#xff0c;比如发布某篇文章&#xff0c;需要取文章中的某张图片作为封面&#xff0c;那么此时需要文章内容&#xff0c;获取html内容中的图片地址作为封面&#xff0c;下面讲下如何获取html中的图片或视频地址。 二、实现 1.先定义一个工具类&…

公司文件如何加密?

在数字化办公的今天&#xff0c;公司文件的加密不仅是保护企业机密的重要措施&#xff0c;也是维护企业竞争力的必要手段。通过使用专业的数据安全解决方案&#xff0c;比如华企盾DSC数据防泄密系统&#xff0c;企业可以有效地对文件进行加密&#xff0c;确保数据安全。 加密方…