深度学习模块实践手册(第十二期)

56、Ghost 模块

论文《GhostNet: More Features from Cheap Operations》

1、作用:
Ghost 模块是一种轻量级的特征提取模块,旨在通过廉价操作生成更多特征图,减少计算量的同时保持模型性能。传统卷积神经网络在生成特征图时存在大量冗余计算,Ghost 模块通过将特征图生成过程分解为两个步骤,有效减少了计算复杂度,特别适合移动端和嵌入式设备部署。

2、机制
Ghost 模块的机制主要包括:

  • 初始特征提取:使用少量卷积核(约为传统卷积核数量的 1/m)生成初始特征图,这些特征图包含主要信息。
  • 廉价变换生成额外特征:对初始特征图应用一系列简单的线性变换(如深度可分离卷积),生成额外的 “ghost” 特征图,这些特征图捕获了原始特征图的补充信息。
  • 特征拼接:将初始特征图和生成的 ghost 特征图拼接在一起,形成最终的输出特征图。

通过这种方式,Ghost 模块在保持与传统卷积相似表达能力的同时,将计算量减少到原来的 1/m。

3、独特优势

  • 计算高效:Ghost 模块的计算复杂度显著低于传统卷积,例如在 ImageNet 分类任务中,GhostNet 的 FLOPs 比 MobileNetV3 减少了约 30%,但准确率相当。
  • 轻量级设计:引入的参数数量极少,适合资源受限的设备。
  • 通用性强:可以替代任何标准卷积层,无缝集成到现有的神经网络架构中。

4、代码

import torch
import torch.nn as nnclass GhostModule(nn.Module):"""Ghost模块 - 生成更多特征的轻量级模块"""def __init__(self, in_channels, out_channels, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=True):super().__init__()self.out_channels = out_channelsinit_channels = int(torch.ceil(torch.tensor(out_channels / ratio)))init_channels = max(1, init_channels)# 主要卷积self.primary_conv = nn.Sequential(nn.Conv2d(in_channels, init_channels, kernel_size, stride, kernel_size//2, bias=False),nn.BatchNorm2d(init_channels),nn.ReLU(inplace=True) if relu else nn.Sequential(),)# 廉价操作生成ghost特征self.cheap_operation = nn.Sequential(nn.Conv2d(init_channels, init_channels*(ratio-1), dw_size, 1, dw_size//2, groups=init_channels, bias=False),nn.BatchNorm2d(init_channels*(ratio-1)),nn.ReLU(inplace=True) if relu else nn.Sequential(),)def forward(self, x):x1 = self.primary_conv(x)x2 = self.cheap_operation(x1)out = torch.cat([x1, x2], dim=1)return out[:, :self.out_channels, :, :]# 测试代码
if __name__ == '__main__':# 实例化Ghost模块model = GhostModule(in_channels=32, out_channels=64).cuda()# 创建随机输入张量input_tensor = torch.randn(2, 32, 32, 32).cuda()# 前向传播output_tensor = model(input_tensor)# 验证输出形状print(f"输入形状: {input_tensor.shape}")print(f"输出形状: {output_tensor.shape}")  # 预期: torch.Size([2, 64, 32, 32])

57、CBAM(Convolutional Block Attention Module)

论文《CBAM: Convolutional Block Attention Module》

1、作用:
CBAM 是一种轻量级的注意力模块,能够同时关注通道和空间维度上的重要特征。与仅关注通道或空间的注意力机制不同,CBAM 通过串行方式依次应用通道注意力和空间注意力,自适应地增强有意义的特征并抑制无关特征,从而提升模型的表示能力。

2、机制
CBAM 模块的机制主要包括:

  • 通道注意力:通过全局最大池化和全局平均池化分别提取特征的通道统计信息,然后通过共享的多层感知机(MLP)处理这两种统计信息,最后将结果相加并通过 Sigmoid 函数生成通道注意力权重。
  • 空间注意力:在通道注意力的基础上,对特征图应用空间注意力。通过对通道维度进行最大池化和平均池化,然后将这两个结果拼接并通过一个卷积层生成空间注意力权重。
  • 特征重标定:将通道注意力权重和空间注意力权重依次应用到原始特征图上,实现对特征的自适应增强和抑制。

3、独特优势

  • 双重注意力机制:同时关注通道和空间维度上的重要信息,比单一维度的注意力机制更全面。
  • 轻量级设计:引入的参数和计算开销极少,例如在 ResNet-50 中集成 CBAM 仅增加约 0.1% 的参数。
  • 广泛适用性:可以轻松集成到各种卷积神经网络架构中,在图像分类、目标检测和语义分割等任务上均有显著性能提升。

4、代码

import torch
import torch.nn as nnclass ChannelAttention(nn.Module):"""通道注意力模块"""def __init__(self, in_channels, reduction_ratio=16):super().__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.fc = nn.Sequential(nn.Conv2d(in_channels, in_channels // reduction_ratio, 1, bias=False),nn.ReLU(),nn.Conv2d(in_channels // reduction_ratio, in_channels, 1, bias=False))self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = self.fc(self.avg_pool(x))max_out = self.fc(self.max_pool(x))out = avg_out + max_outreturn self.sigmoid(out)class SpatialAttention(nn.Module):"""空间注意力模块"""def __init__(self, kernel_size=7):super().__init__()self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = torch.mean(x, dim=1, keepdim=True)max_out, _ = torch.max(x, dim=1, keepdim=True)out = torch.cat([avg_out, max_out], dim=1)out = self.conv(out)return self.sigmoid(out)class CBAM(nn.Module):"""CBAM - 卷积块注意力模块"""def __init__(self, in_channels, reduction_ratio=16, kernel_size=7):super().__init__()self.channel_att = ChannelAttention(in_channels, reduction_ratio)self.spatial_att = SpatialAttention(kernel_size)def forward(self, x):x = x * self.channel_att(x)x = x * self.spatial_att(x)return x# 测试代码
if __name__ == '__main__':# 实例化CBAM模块model = CBAM(in_channels=64).cuda()# 创建随机输入张量input_tensor = torch.randn(2, 64, 32, 32).cuda()# 前向传播output_tensor = model(input_tensor)# 验证输出形状print(f"输入形状: {input_tensor.shape}")print(f"输出形状: {output_tensor.shape}")  # 预期: torch.Size([2, 64, 32, 32])

58、CoordConv 模块

论文《An intriguing failing of convolutional neural networks and the CoordConv solution》

1、作用:
CoordConv 是一种改进的卷积操作,通过在输入特征图中添加坐标信息,帮助卷积神经网络更好地理解空间关系。传统卷积操作对输入的平移具有等变性,无法显式表示空间位置信息,这使得网络在处理需要精确空间理解的任务(如目标检测、语义分割)时存在困难。CoordConv 通过简单地在输入特征图中添加坐标通道,显著提升了网络对空间关系的建模能力。

2、机制
CoordConv 模块的机制主要包括:

  • 坐标添加:在输入特征图的基础上,添加两个额外的通道,分别表示每个像素的归一化 x 坐标和 y 坐标。例如,对于一个 H×W 的特征图,添加的 x 坐标通道在所有行上的值为 [0/W, 1/W, ..., (W-1)/W],y 坐标通道在所有列上的值为 [0/H, 1/H, ..., (H-1)/H]。
  • 标准卷积:在添加了坐标信息的特征图上应用标准卷积操作。

通过这种方式,CoordConv 使网络能够显式地利用空间位置信息,提高对空间变换的敏感性。

3、独特优势

  • 简单高效:只需在输入特征图中添加两个通道,几乎不增加计算复杂度和参数数量。
  • 提升性能:在多个任务(如目标检测、语义分割、姿态估计)上,CoordConv 能够显著提升模型性能,例如在 COCO 目标检测任务中,使用 CoordConv 的网络 mAP 提升了 2-3 个点。
  • 广泛适用性:可以替代任何标准卷积层,无缝集成到现有的神经网络架构中。

4、代码

import torch
import torch.nn as nn
import torch.nn.functional as Fclass AddCoords(nn.Module):"""添加坐标通道"""def __init__(self, with_r=False):super().__init__()self.with_r = with_rdef forward(self, x):batch_size, _, height, width = x.size()# 创建坐标通道x_coords = torch.linspace(-1, 1, width).repeat(height, 1).to(x.device)y_coords = torch.linspace(-1, 1, height).repeat(width, 1).t().to(x.device)x_coords = x_coords.unsqueeze(0).unsqueeze(0)y_coords = y_coords.unsqueeze(0).unsqueeze(0)# 添加到输入张量out = torch.cat([x, x_coords.repeat(batch_size, 1, 1, 1), y_coords.repeat(batch_size, 1, 1, 1)], dim=1)# 可选:添加半径坐标if self.with_r:rr = torch.sqrt(torch.pow(x_coords, 2) + torch.pow(y_coords, 2))out = torch.cat([out, rr.repeat(batch_size, 1, 1, 1)], dim=1)return outclass CoordConv(nn.Module):"""CoordConv模块"""def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, with_r=False):super().__init__()self.add_coords = AddCoords(with_r)in_channels += 2  # 添加x和y坐标通道if with_r:in_channels += 1  # 添加半径通道self.conv = nn.Conv2d(in_channels, out_channels, kernel_size,stride, padding, dilation, groups, bias)def forward(self, x):out = self.add_coords(x)out = self.conv(out)return out# 测试代码
if __name__ == '__main__':# 实例化CoordConv模块model = CoordConv(in_channels=3, out_channels=16, kernel_size=3, padding=1).cuda()# 创建随机输入张量input_tensor = torch.randn(2, 3, 32, 32).cuda()# 前向传播output_tensor = model(input_tensor)# 验证输出形状print(f"输入形状: {input_tensor.shape}")print(f"输出形状: {output_tensor.shape}")  # 预期: torch.Size([2, 16, 32, 32])

59、DropBlock 模块

论文《DropBlock: A regularization method for convolutional networks》

1、作用:
DropBlock 是一种专为卷积神经网络设计的正则化方法,通过随机丢弃连续区域(块)的特征,强制网络学习更鲁棒的特征表示。传统的 Dropout 方法在全连接层中效果良好,但在卷积层中效果有限,因为卷积层的特征具有空间相关性,随机丢弃单个神经元无法有效正则化。DropBlock 通过丢弃整个区域的特征,模拟了物体部分被遮挡的情况,提高了模型的泛化能力。

2、机制
DropBlock 模块的机制主要包括:

  • 块丢弃:在训练过程中,DropBlock 随机选择一些区域(块),并将这些区域内的所有特征值置为 0。块的大小通常是超参数,控制丢弃区域的规模。
  • 自适应丢弃率:DropBlock 的丢弃率会随着训练进行而逐渐调整,通常在训练初期使用较低的丢弃率,在训练后期使用较高的丢弃率。
  • 反向传播:在反向传播过程中,被丢弃的区域对梯度没有贡献,从而实现正则化效果。

3、独特优势

  • 更有效正则化:相较于传统 Dropout,DropBlock 在卷积神经网络中能更有效地防止过拟合,提高模型泛化能力。
  • 提升鲁棒性:通过模拟物体部分被遮挡的情况,DropBlock 使模型学习到更具鲁棒性的特征表示,在测试时对遮挡和噪声更具抵抗力。
  • 易于实现:DropBlock 可以很容易地集成到现有的神经网络中,只需替换传统的 Dropout 层。

4、代码

import torch
import torch.nn as nn
import torch.nn.functional as Fclass DropBlock(nn.Module):"""DropBlock正则化模块"""def __init__(self, block_size, keep_prob):super().__init__()self.block_size = block_sizeself.keep_prob = keep_probdef forward(self, x):if not self.training or self.keep_prob == 1.0:return x# 计算gamma值gamma = (1.0 - self.keep_prob) / (self.block_size ** 2)# 生成maskbatch_size, channels, height, width = x.size()mask_shape = (batch_size, channels, height - (self.block_size - 1), width - (self.block_size - 1))mask = torch.bernoulli(torch.full(mask_shape, gamma, device=x.device))# 扩展mask到block_sizemask = F.pad(mask, (self.block_size//2, self.block_size//2, self.block_size//2, self.block_size//2))mask = F.max_pool2d(mask, kernel_size=self.block_size, stride=1, padding=self.block_size//2)mask = 1 - mask# 应用mask并归一化countM = mask.numel()count_ones = mask.sum()x = x * mask * (countM / count_ones)return x# 测试代码
if __name__ == '__main__':# 实例化DropBlock模块model = DropBlock(block_size=5, keep_prob=0.9).cuda()# 创建随机输入张量input_tensor = torch.randn(2, 32, 32, 32).cuda()# 前向传播(训练模式)model.train()output_train = model(input_tensor)# 前向传播(推理模式)model.eval()output_eval = model(input_tensor)# 验证输出形状print(f"输入形状: {input_tensor.shape}")print(f"训练模式输出形状: {output_train.shape}")  # 预期: torch.Size([2, 32, 32, 32])print(f"推理模式输出形状: {output_eval.shape}")  # 预期: torch.Size([2, 32, 32, 32])

60、Swish 激活函数

论文《Searching for Activation Functions》

1、作用: Swish 是一种平滑的非线性激活函数,形式为\(f(x) = x \cdot \sigma(x)\),其中\(\sigma(x)\)是 Sigmoid 函数。与 ReLU 相比,Swish 具有平滑性和非单调性,能够在某些情况下提供更好的性能。研究表明,Swish 在深层神经网络中表现优于 ReLU,特别是在 ImageNet 分类和机器翻译等任务上。

2、机制 Swish 激活函数的机制主要包括:

  • 平滑性:Swish 函数在整个定义域内都是连续可导的,这有助于优化算法更稳定地收敛。
  • 非单调性:当输入为负数时,Swish 函数的输出可以为负数,这使得它能够学习更复杂的函数映射。
  • 自门控特性:Swish 函数可以看作是一种自门控机制,其中x作为输入,\(\sigma(x)\)作为门控信号,控制输入的传播程度。

3、独特优势

  • 性能提升:在多个深度学习任务(如图像分类、目标检测、语音识别)上,Swish 激活函数能够提供比 ReLU 更高的准确率。
  • 平滑梯度:连续可导的特性使得 Swish 在训练过程中梯度更加平滑,减少了梯度消失和爆炸的问题。
  • 计算高效:Swish 的计算复杂度与 ReLU 相当,只需一次乘法和一次 Sigmoid 运算。

4、代码


import torch
import torch.nn as nnclass Swish(nn.Module):"""Swish激活函数"""def __init__(self):super().__init__()def forward(self, x):return x * torch.sigmoid(x)# 测试代码
if __name__ == '__main__':# 实例化Swish激活函数model = Swish().cuda()# 创建随机输入张量input_tensor = torch.randn(2, 32, 32, 32).cuda()# 前向传播output_tensor = model(input_tensor)# 验证输出形状print(f"输入形状: {input_tensor.shape}")print(f"输出形状: {output_tensor.shape}")  # 预期: torch.Size([2, 32, 32, 32])

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自己动手造轮子:如何创建JAR并通过Maven在Spring Boot中引用

让代码复用变得简单优雅——3分钟学会封装专属工具库作为Java开发者,你是否遇到过这些痛点?多个项目重复编写相同工具类工具代码分散难以统一维护团队协作缺乏标准化工具库本文将手把手教你创建自己的JAR包,并优雅地集成到Spring Boot项目中&…

使用dea工具 给vue 里面的ts打断点

在 Vue 项目中使用 TypeScript 时,我们通常会在 IDE(如 JetBrains 的 IntelliJ IDEA 或 WebStorm)中设置断点进行调试。以下是详细步骤: 准备工作 确保项目已配置 source maps(Vue CLI 创建的项目默认已配置&#xff0…

Zabbix 企业级分布式监控

目录 简介 一、监控系统基础 1.1 监控的价值 1.2 监控的 5 大类型与 5 大层次 1.3 监控系统的实现原理 二、Zabbix:企业级监控方案 2.1 Zabbix 简介 2.2 Zabbix 核心功能特性 2.3 Zabbix 角色与架构 三、Zabbix 部署案例 3.1 资源清单 3.2 基础环境配置…

SQL JOIN 全解析:用 `users` 与 `orders` 表彻底掌握内连接、左连接、右连接

SQL JOIN 全解析:用 users 与 orders 表彻底掌握内连接、左连接、右连接 在日常开发中,SQL 的连接(JOIN)语句是数据库查询的核心技能。尤其在多表联合查询时,不掌握好 INNER JOIN、LEFT JOIN、RIGHT JOIN,…

(一)从零搭建unity3d机械臂仿真-unity3d导入urdf模型

1.新建工程并加载模型 (1)unity中新建3d工程 (2)将机器人模型导入到unity3d中 导入开源Unity-Robotics-Hub的机械臂。 详细操作参考视频 ROS Unity URDF Import Testing Robot Motion 使用 URDF Importer工具 在 Unity 中&#x…

Linux之网络部分-应用层自定义协议与序列化

一、应用层 1.1、理解协议 协议是一种 "约定". socket api 的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的。如果我们要传输一些 "结构化的数据" 怎么办呢? 其实,协议就是双方约定好的结构化的数据。 1.2、网络版计…

机器学习week3-分类、正则化

1. 逻辑回归1.1. 线性回归 vs 逻辑回归对比维度线性回归逻辑回归任务类型回归(预测连续值)分类(预测离散类别)输出范围(−∞,∞)[0,1](概率值)损失函数均方误差(MSE)对数损失&#x…

FastAdmin 中生成插件

在 FastAdmin 中生成一个 OCR 发票识别插件,可以按照以下步骤进行开发。这里假设你已经熟悉 FastAdmin 插件开发的基本流程,并会使用 Composer 和 PHP 扩展。1. 创建插件骨架使用 FastAdmin 命令行工具生成插件基础结构:php think addon -a o…

DevExpress WinForms中文教程:Grouping(分组)- 如何自定义分组算法?

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

PHP 与 Vue.js 结合的前后端分离架构

PHP 与 Vue.js 结合是构建现代 Web 应用的流行技术栈,通常采用 前后端分离架构。以下是关键要点和推荐实现方案: 一、技术栈组合 角色技术选项后端 (PHP)Laravel (推荐)、Symfony、CodeIgniter前端 (Vue)Vue 2/3、Vue Router、Pinia/Vuex、Vite通信协议…

XML高效处理类 - 专为Office文档XML处理优化

/**** 提供XML读取、写入、修改、查询等高级功能,支持命名空间和复杂XML结构* * 主要功能:* 1. 复杂路径解析(支持属性筛选、索引、通配符)* 2. 完整节点类型支持(元素、文本、CDATA、注释、PI)* 3. 高效元…

星慈光编程虫2号小车讲解第一篇--向前向后

星慈光编程虫2号小车是一款基于微控制器(如Arduino)的编程教学小车,常用于学习机器人控制和编程基础。本讲解将重点介绍小车的基本运动:前进、后退、左转和右转。这些运动通过控制电机实现,通常涉及调整电机的方向和速…

iOS 加固工具有哪些?快速发布团队的实战方案

在当今快速迭代的 iOS 开发环境中,团队需要在高频上线与应用安全之间找到平衡。快速发布不应牺牲安全性,而安全加固也不应成为阻碍上线的瓶颈。这就要求开发者在加固工具的选型与流程设计上,做到既高效又可靠。 那么,iOS 加固工具…

结构型模式-架构解耦与扩展实践

结构型模式聚焦于对象间的组合关系,通过优化类与对象的装配方式,实现系统的灵活性与可扩展性。在分布式系统中,由于多节点协作、跨网络通信及异构环境集成等特性,传统结构型模式需进行适应性改造,以应对分布式特有的复…

scratch笔记和练习-第三课

角色的大小变化 亮度等特效设置 流程图图形符号 Figma攻略:26个流行流程图符号及其解释 练习 实现在闪动10次后角色缓缓变回原形

Redis MCP 安装与配置完整指南

一、Redis MCP 简介 Redis MCP (Managed Control Plane) 是一个独立于 Redis 服务运行的管理控制平台,用户可通过该平台快速高效地管理和配置 Redis 实例。Redis MCP 可配合开源 Redis 或 Redis Cloud 使用。 二、安装 Redis MCP 服务 Redis MCP 提供多种安装方式&a…

Spring Boot配置文件加载全指南:从基础到Spring Cloud集成

​​​ ​​一、核心概念​ 配置文件默认存在加载顺序优先级主要用途必需依赖bootstrap.yml❌ 无1(最先)最高Spring Cloud上下文初始化spring-cloud-starter-bootstrapbootstrap.properties❌ 无1(略高于.yml)最高同上同上application.yml✅ 自动创建2中等应用核心配置无appl…

Python通关秘籍(六)数据结构——字典

前文复习 五、数据结构 5.1 列表(List) 列表是一种有序的可变数据集合,可以包含不同类型的元素。

自学嵌入式 day33 TCP、HTTP协议(超文本传输协议)

6、黏包问题(1)、原因:发送方发送数据太快或者接收方接收数据太慢,导致数据在缓冲区缓存。(2)、解决方法:①发送指定大小数据(结构体)问题:结构体对齐问题&am…

LinuxShell 的 Here-Document(<< EOF) 笔记250723

LinuxShell 的 Here-Document(<< EOF) 笔记250723 Here-Document(<< EOF) Linux Shell Here Document (<< EOF) 终极指南 Here Document&#xff08;立即文档&#xff09;是 Shell 中用于多行输入重定向的强大功能&#xff0c;其核心语法为 << DELI…