YOLOv7-0.1部分代码阅读笔记-activations.py

news2024/11/13 2:51:24

activations.py

utils\activations.py

目录

activations.py

1.所需的库和模块

2.class SiLU(nn.Module): 

3.class Hardswish(nn.Module): 

4.class MemoryEfficientSwish(nn.Module): 

5.class Mish(nn.Module): 

6.class MemoryEfficientMish(nn.Module): 

7.class FReLU(nn.Module): 


1.所需的库和模块

# Activation functions

import torch
import torch.nn as nn
import torch.nn.functional as F

2.class SiLU(nn.Module): 

# 在不考虑计算量大小的前提下,相同的模型。 Mish > SiLU > Hardswish

# SiLU https://arxiv.org/pdf/1606.08415.pdf ----------------------------------------------------------------------------
# SiLU 激活函数,也被称为 Swish 函数 。这个函数的数学表达式是 f(x) = x * sigmoid(x)  。
class SiLU(nn.Module):  # export-friendly version of nn.SiLU()
    # @staticmethod
    # @staticmethod 是一个python装饰器,用于标记一个静态方法。
    # 静态方法是属于类而不是类的实例的方法。
    # 静态方法不需要访问类的实例或实例的状态。因此,它们不接受 self 参数。
    # 可以通过类名直接调用静态方法,也可以通过实例调用。
    @staticmethod
    def forward(x):
        return x * torch.sigmoid(x)
# 这里的代码是 SiLU 激活函数的一个简单实现,它覆盖了 forward 方法,这是 PyTorch 中所有模块必须实现的一个方法,用于定义前向传播的行为。
# 在这个 forward 方法中,输入 x 被乘以 x 的 Sigmoid 函数,Sigmoid 函数的输出范围是 (0, 1),因此 SiLU 函数的输出范围是 (0, x)。

3.class Hardswish(nn.Module): 

class Hardswish(nn.Module):  # export-friendly version of nn.Hardswish()
    @staticmethod
    def forward(x):
        # return x * F.hardsigmoid(x)  # for torchscript and CoreML

        # torch.nn.functional.hardtanh(input, min_val=-1.0, max_val=1.0, inplace=False)
        # F.hardtanh 函数是PyTorch中 torch.nn.functional 模块提供的HardTanh激活函数的实现。HardTanh函数是一个分段线性函数,它将输入值限制在指定的范围内。
        # 具体来说,如果输入值大于最大值 max_val ,则输出 max_val ;如果输入值小于最小值 min_val ,则输出 min_val ;否则,输出输入值本身。
        # 这个函数的特点是计算效率高,因为它避免了Tanh函数中的指数运算,而是通过简单的比较和赋值来实现。这使得HardTanh在某些情况下比Tanh函数更快,尤其是在需要处理大量数据时。
        # 参数 :
        # input ( Tensor ):输入的张量。
        # min_val ( float ):线性区域的最小值,默认为-1。
        # max_val ( float ):线性区域的最大值,默认为1。
        # inplace ( bool ):是否在原地进行操作,默认为 False 。

        return x * F.hardtanh(x + 3, 0., 6.) / 6.  # for torchscript, CoreML and ONNX
# Hardswish 函数的数学表达式是 f(x) = x * (x + 3) / 6 ,当 x 的值在 [-3, 3] 范围内时,这个函数的输出接近于 x 的线性函数,而在该范围之外时,输出会饱和。
# 这种设计使得 Hardswish 在某些情况下比 Swish 更快,因为它避免了计算 sigmoid 函数,而 sigmoid 函数在深度学习中通常被认为是计算密集型的。
# 在这段代码中, F.hardtanh 是 PyTorch 中的一个函数,它实现了硬双曲正切函数(hardtanh),这个函数将输入值限制在指定的范围内。
# 在这个例子中, F.hardtanh(x + 3, 0., 6.) 将 x + 3 的值限制在 [0, 6] 范围内。然后,这个结果被除以 6,以匹配 Hardswish 函数的定义。
# 注释掉的代码行 # return x * F.hardsigmoid(x) 提供了另一种实现 Hardswish 的方式,使用 F.hardsigmoid 函数,它是 sigmoid 函数的一个近似,通常用于提高性能。
# 但是,由于注释中提到这是为了 torchscript 和 CoreML ,而当前的实现是为了 torchscript 、 CoreML 和 ONNX ,所以选择了当前的实现方式。

4.class MemoryEfficientSwish(nn.Module): 

# MemoryEfficientSwish 的激活函数的PyTorch模块。 MemoryEfficientSwish 是一个自定义的激活函数,它旨在提供一个计算上更高效的Swish激活函数的替代品。
# Swish函数是一种自门控的激活函数,其形式为 f(x) = x * sigmoid(x) ,其中 x 是输入, sigmoid 是Sigmoid函数。
# 在这个 MemoryEfficientSwish 类中,定义了一个内部类 F ,它继承自 torch.autograd.Function 。这个内部类重写了 forward 和 backward 两个静态方法,分别用于前向传播和反向传播。
class MemoryEfficientSwish(nn.Module):
    class F(torch.autograd.Function):
        @staticmethod
        def forward(ctx, x):
            # 保存输入 x 以便在反向传播时使用。
            ctx.save_for_backward(x)
            # 计算并返回 Swish 激活函数的前向结果。
            return x * torch.sigmoid(x)

        @staticmethod
        def backward(ctx, grad_output):
            # 从上下文中获取保存的输入 x 。
            x = ctx.saved_tensors[0]
            # 计算输入 x 的Sigmoid值。
            sx = torch.sigmoid(x)
            # 计算 Swish 激活函数的导数,这是根据 Swish 函数的导数定义计算的。导数的计算利用了链式法则和Sigmoid函数的性质。
            return grad_output * (sx * (1 + x * (1 - sx)))

    def forward(self, x):

        # F.apply()
        # 在PyTorch中, F.apply() 函数是一个特殊的函数,它允许用户自定义前向和反向传播的计算图。 F.apply() 通常用于实现自定义的自动微分函数,它是一个静态方法,属于 torch.autograd.Function 类。
        # 当你定义一个继承自 torch.autograd.Function 的类,并重写了 forward 和 backward 方法时,可以通过 apply 方法来调用这些自定义的操作。
        # 定义 :
        # 当你定义一个类继承自 torch.autograd.Function 时,你需要至少实现两个静态方法: forward 和 backward 。
        # @staticmethod
        # def forward(ctx, *args):
        # 这个方法定义了自定义操作的前向传播。
        # ctx :是一个上下文对象,用于保存在前向传播中需要的信息,以便在反向传播时使用。
        # *args :是传递给函数的输入参数。
        # @staticmethod
        # def backward(ctx, *grad_outputs):
        # 这个方法定义了自定义操作的反向传播。
        # ctx :是前向传播中保存的上下文对象。
        # *grad_outputs :是输出相对于梯度的梯度。
        # 使用 :
        # 在你的自定义类中,你可以通过 self.F.apply() 来调用这些自定义的操作。这里的 F 是自定义类的名字, apply 是 torch.autograd.Function 类的一个方法,它将输入传递给 forward 方法,并返回前向传播的结果。

        # 调用内部类 F 的 apply 方法来执行前向传播。
        return self.F.apply(x)

5.class Mish(nn.Module): 

# Mish https://github.com/digantamisra98/Mish --------------------------------------------------------------------------
# 这段代码定义了一个名为 Mish 的 PyTorch 模块,它实现了 Mish 激活函数。Mish 激活函数是一种在深度学习中使用的激活函数,它结合了软加(softplus)和双曲正切(tanh)函数。Mish 函数的定义如下:
# Mish(x) = x · tanh(log(1 + e^x)) 其中, tanh 是双曲正切函数, log(1 + e^x) 是软加函数,也称为平滑的ReLU。在这个 Mish 类中, forward 方法定义了 Mish 激活函数的前向传播:
class Mish(nn.Module):
    @staticmethod
    def forward(x):
        # F.softplus(x) :软加函数,计算 log(1 + e^x) 。
        # .tanh() :双曲正切函数,计算 tanh(softplus(x))
        # x * ... :将输入张量 x 与软加函数的结果的双曲正切相乘,得到最终的 Mish 激活函数的输出。
        return x * F.softplus(x).tanh()

6.class MemoryEfficientMish(nn.Module): 

# 这段代码定义了一个名为 MemoryEfficientMish 的 PyTorch 模块,它实现了 Mish 激活函数,并且是内存高效的,因为它使用了 PyTorch 的自动微分机制 torch.autograd.Function 来避免在前向传播中保存额外的中间变量。
# MemoryEfficientMish 类包含一个内部类 F ,该内部类继承自 torch.autograd.Function 并重写了 forward 和 backward 方法。
class MemoryEfficientMish(nn.Module):
    class F(torch.autograd.Function):
        @staticmethod
        # 1.ctx :是一个上下文对象,用于在前向传播中保存张量,以便在反向传播时使用。
        def forward(ctx, x):
            # 保存输入张量 x ,以便在反向传播中恢复。
            ctx.save_for_backward(x)
            # 计算 Mish 激活函数的前向传播。这里 F.softplus(x) 计算 ln(1 + exp(x)) , torch.tanh(...) 计算双曲正切,然后与输入 x 相乘。
            return x.mul(torch.tanh(F.softplus(x)))  # x * tanh(ln(1 + exp(x)))

        @staticmethod
        # 2.grad_output :是输出相对于梯度的梯度。
        def backward(ctx, grad_output):
            # x 是从上下文中恢复的输入张量。
            x = ctx.saved_tensors[0]
            # sx 计算 sigmoid(x)  。
            sx = torch.sigmoid(x)
            # fx 计算 Mish 激活函数的前向结果,即 F.softplus(x).tanh() 。
            fx = F.softplus(x).tanh()
            # 返回的梯度是 grad_output 乘以 Mish 激活函数的导数。Mish 函数的导数是 fx + x * sx * (1 - fx * fx) ,其中 fx 是 Mish 函数的输出, sx 是 sigmoid(x) 。
            return grad_output * (fx + x * sx * (1 - fx * fx))

    # MemoryEfficientMish 类的 forward 方法。
    def forward(self, x):
        # 调用内部类 F 的 apply 方法,执行前向传播。
        return self.F.apply(x)
# 这个 MemoryEfficientMish 类的实现使得 Mish 激活函数在计算梯度时更加内存高效,因为它避免了在前向传播中保存中间结果,而是在反向传播中重新计算它们。这种方法在处理大规模数据或深度网络时特别有用,因为它可以减少内存占用。

7.class FReLU(nn.Module): 

# FReLU https://arxiv.org/abs/2007.11824 -------------------------------------------------------------------------------
# 这段代码定义了一个名为 FReLU 的 PyTorch 模块,它实现了一种特殊的激活函数,称为 FReLU(Filter Rectified Linear Unit)。FReLU 结合了传统的 ReLU 激活函数和卷积操作,用于在通道维度上进行特征的竞争性选择。
class FReLU(nn.Module):
    # __init__   方法初始化 FReLU 模块。
    # c1 :参数表示输入通道数。
    # k :参数表示卷积核的大小,默认为 3。
    def __init__(self, c1, k=3):  # ch_in, kernel
        super().__init__()
        # 是一个深度卷积层( nn.Conv2d ),它使用 c1 个输入通道和输出通道,卷积核大小为 k ,步长为 1,填充为 1,分组卷积( groups=c1 )使得每个通道独立卷积,没有偏置项( bias=False )。
        self.conv = nn.Conv2d(c1, c1, k, 1, 1, groups=c1, bias=False)
        # 是一个批量归一化层( nn.BatchNorm2d ),用于归一化 c1 个通道。
        self.bn = nn.BatchNorm2d(c1)

    # x :是输入张量。
    def forward(self, x):
        # 首先对输入 x 应用深度卷积,然后应用批量归一化。
        # 计算输入张量 x 和卷积归一化结果之间的逐元素最大值,返回这个最大值。
        return torch.max(x, self.bn(self.conv(x)))
# 功能FReLU 的核心思想是在通道维度上进行竞争性选择。对于每个通道,它通过深度卷积和批量归一化处理输入,然后与原始输入进行逐元素比较,选择两者之间的最大值。这种方法可以增强特征的表达能力,因为它允许网络在每个通道上选择最有用的特征。

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

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

相关文章

量子计算及其在密码学中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 引言 量子计算概述 定义与原理 发展…

论文笔记:no pose,no problem-基于dust3r输出GS参数实现unpose稀疏重建

1.摘要 我们引入了 NoPoSplat,这是一种前馈模型,能够从未设置的稀疏多视图图像中重建由 3D 高斯参数化的 3D 场景。 我们的模型专门使用光度损失进行训练,在推理过程中实现了实时 3D 高斯重建。 为了消除重建过程中对准确pose的需要&#xff…

godot--自定义边框/选中时样式 StyleBoxTexture

前提知识: stylebox就像一个贴图,把图案贴到控件是。多个stylebox同时生效的话,那当然也有层级之分,上层覆盖下层(可以设置透明度来显示下层) 关于主题的概念: godot——主题、Theme、StyleB…

ReactPress 安装指南:从 MySQL 安装到项目启动

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress 是一个基于 React 的开源发布平台,适用于搭建博客、网站或内容管理系统(CMS)。本文将详细介绍如何安装 ReactPress,包括…

BMC运维管理:IPMI实现服务器远控制

IPMI实现服务器远控制 实操一、使用IPMI重置BMC用户密码实操二、使用IPMI配置BMC的静态IP实操三、IPMI实现BMC和主机控制操作实操四、ipmitool查看服务器基本信息实操五、ipmitool实现问题定位BMC(Baseboard Management Controller,基板管理控制器)是服务器硬件的一个独立管…

手机上用什么方法可以切换ip

手机上用什么方法可以切换IP?在某些特定情境下,用户可能需要切换手机的IP地址,以满足网络安全、隐私保护或绕过地域限制等需求。下面以华为手机为例,将详细介绍手机IP地址切换的几种方法,帮助用户轻松实现这一目标。 一…

鸿蒙多线程开发——并发模型对比(Actor与内存共享)

1、概 述 并发是指在同一时间段内,能够处理多个任务的能力。为了提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰,HarmonyOS系统提供了异步并发和多线程并发两种处理策略。 异步并发:指异步代码在执行到一定程度后会被…

【NLP】使用 PyTorch 从头构建自己的大型语言模型 (LLM)

读完这篇文章后,你会取得什么成就?你将能够自己构建和训练大型语言模型 (LLM),同时与我一起编写代码。虽然我们正在构建一个将任何给定文本从英语翻译成马来语的 LLM,但你可以轻松地修改此 LLM 架构以用于其他语言翻译任务。 LLM…

css:还是语法

emmet的使用 emmet是一个插件&#xff0c;Emmet 是 Zen Coding 的升级版&#xff0c;由 Zen Coding 的原作者进行开发&#xff0c;可以快速的编写 HTML、CSS 以及实现其他的功能。很多文本编辑器都支持&#xff0c;我们只是学会使用它&#xff1a; 生成html结构 <!-- emme…

YOLO即插即用---PConv

Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks 论文地址&#xff1a; 1. 论文解决的问题 2. 解决问题的方法 3. PConv 的适用范围 4. PConv 在目标检测中的应用 5. 评估方法 6. 潜在挑战 7. 未来研究方向 8.即插即用代码 论文地址&#xff1a; …

小白NAS磁盘规划实践:一次科学、高效的存储旅程

引言 如今,数字化生活正逐步渗透到我们生活的方方面面。从家庭影音到工作文件,从珍贵的照片到大型游戏库,数据的存储需求日益增加。许多朋友开始关注NAS(网络附加存储)设备。作为一个专为数据存储和管理设计的系统,NAS能为我们提供安全、高效的存储方案。但如何科学地规…

ADC前端控制与处理模块--AD7606_Module

总体框架 AD7606_Module主要由3个模块组成组成&#xff0c;AD7606_Data_Pkt和AD7606_Drive以及AD7606_ctrl。 1.AD7606_Data_Pkt主要作用是把AD芯片数据组好数据包&#xff0c;然后发送给上位机&#xff1b; 2.AD7606_Drive主要负责和芯片的交互部分 3.AD7606_ctrl控制模块的作…

注意力机制篇 | YOLO11改进 | 即插即用的高效多尺度注意力模块EMA

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。与传统的注意力机制相比&#xff0c;多尺度注意力机制引入了多个尺度的注意力权重&#xff0c;让模型能够更好地理解和处理复杂数据。这种机制通过在不同尺度上捕捉输入数据的特征&#xff0c;让模型同时关注局部细节和全局…

dell服务器安装ESXI8

1.下载镜像在官网 2.打开ipmi&#xff08;idrac&#xff09;&#xff0c;将esxi镜像挂载&#xff0c;然后服务器开机 3.进入bios设置cpu虚拟化开启&#xff0c;进入boot设置启动选项为映像方式 4..进入安装引导界面3.加载完配置进入安装 系统提示点击继 5.选择安装磁盘进行…

Linux -- 操作系统(软件)

目录 什么是操作系统&#xff1f; 计算机的层状结构 为什么要有操作系统 操作系统到底层硬件 驱动程序 操作系统如何管理硬件&#xff1f; 操作系统到用户 系统调用接口 库函数 回到问题 什么是操作系统&#xff1f; 操作系统&#xff08;Operating System&#xf…

【大数据算法】MapReduce算法概述之:MapReduce基础模型

MapReduce基础模型 1、引言2、MapReduce基础模型2.1 定义2.2 核心原理2.3 优点2.4 缺点2.5 局限性2.6 实例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;鱼哥&#xff0c; 不得了啊 小鱼&#xff1a;啥事情这么慌慌张张的 小屌丝&#xff1a;这不是慌张啊 小鱼&#x…

深入解析 Transformers 框架(四):Qwen2.5/GPT 分词流程与 BPE 分词算法技术细节详解

前面我们已经通过三篇文章&#xff0c;详细介绍了 Qwen2.5 大语言模型在 Transformers 框架中的技术细节&#xff0c;包括包和对象加载、模型初始化和分词器技术细节&#xff1a; 深入解析 Transformers 框架&#xff08;一&#xff09;&#xff1a;包和对象加载中的设计巧思与…

商品详情 API 接口的返回结果通常包含哪些信息?

商品详情 API 接口的返回结果通常包含以下几类信息&#xff1a; 一、商品基本信息&#xff1a; 商品 ID&#xff1a;唯一标识商品的编号&#xff0c;在电商平台的数据库中具有唯一性&#xff0c;用于区分不同的商品。商品标题&#xff1a;对商品的简要描述&#xff0c;通常包…

探索 Seata 分布式事务

Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff09;是阿里巴巴开源的一款分布式事务解决方案&#xff0c;旨在帮助开发者解决微服务架构下的分布式事务问题。它提供了高效且易于使用的分布式事务管理能力&#xff0c;支持多种事务模式&#…

AI写作(七)的核心技术探秘:情感分析与观点挖掘

一、AI 写作中的关键技术概述 情感分析与观点挖掘在 AI 写作中起着至关重要的作用。情感分析能够帮助 AI 理解文本中的情感倾向&#xff0c;无论是正面、负面还是中性。在当今信息时代&#xff0c;准确把握用户情绪对于提供个性化体验和做出明智决策至关重要。例如&#xff0c;…