当前位置: 首页 > news >正文

【扒模块】DySample

逐行注释

import torch
import torch.nn as nn
import torch.nn.functional as F
import warnings# 忽略警告信息,这通常用于开发过程中,避免警告干扰输出结果
warnings.filterwarnings('ignore')# 定义一个函数,用于对神经网络模块的权重进行正态分布初始化
def normal_init(module, mean=0, std=1, bias=0):# 检查模块是否有权重属性,并且权重不为Noneif hasattr(module, 'weight') and module.weight is not None:# 使用正态分布初始化权重,均值为mean,标准差为stdnn.init.normal_(module.weight, mean, std)# 检查模块是否有偏置属性,并且偏置不为Noneif hasattr(module, 'bias') and module.bias is not None:# 将偏置初始化为bias指定的值nn.init.constant_(module.bias, bias)# 定义一个函数,用于将神经网络模块的权重初始化为一个常数值
def constant_init(module, val, bias=0):# 检查模块是否有权重属性,并且权重不为Noneif hasattr(module, 'weight') and module.weight is not None:# 将权重初始化为val指定的常数值nn.init.constant_(module.weight, val)# 检查模块是否有偏置属性,并且偏置不为Noneif hasattr(module, 'bias') and module.bias is not None:# 将偏置初始化为bias指定的值nn.init.constant_(module.bias, bias)

功能解释:

  • normal_init 函数用于对神经网络中的权重进行正态分布初始化。这通常用于初始化卷积层或线性层的权重,以引入小的随机性,帮助模型学习。函数接受三个参数:mean(均值,默认为0),std(标准差,默认为1),bias(偏置初始化值,默认为0)。
  • constant_init 函数用于将权重初始化为一个固定的常数值。这在某些特定情况下可能有用,例如,当需要将权重设置为特定值以实现某种特定的行为时。函数接受两个参数:val(权重的常数值),bias(偏置初始化值,默认为0)。
class DySample_UP(nn.Module):# 构造函数初始化DySample_UP模块def __init__(self, in_channels, scale=2, style='lp', groups=4, dyscope=False):super(DySample_UP, self).__init__()  # 调用基类的构造函数self.scale = scale  # 上采样的尺度因子,默认为2self.style = style  # 上采样的风格,可以是'lp'或'pl'self.groups = groups  # 组数,用于分组卷积# 确保上采样风格是有效的assert style in ['lp', 'pl']# 如果风格是'pl',则输入通道数必须是scale的平方,并且是scale的倍数if style == 'pl':assert in_channels >= scale ** 2 and in_channels % scale ** 2 == 0# 输入通道数必须至少等于组数,并且是组数的倍数assert in_channels >= groups and in_channels % groups == 0# 根据风格设置输入和输出通道数if style == 'pl':in_channels = in_channels // scale ** 2  # 对于'pl'风格,调整输入通道数out_channels = 2 * groups  # 输出通道数为组数的两倍else:out_channels = 2 * groups * scale ** 2  # 对于'lp'风格,输出通道数为组数乘以scale的平方# 定义一个卷积层用于生成偏移量self.offset = nn.Conv2d(in_channels, out_channels, 1)normal_init(self.offset, std=0.001)  # 使用标准差为0.001的正态分布初始化偏移量卷积层# 如果启用了dyscope(动态作用域),则添加一个额外的卷积层if dyscope:self.scope = nn.Conv2d(in_channels, out_channels, 1)constant_init(self.scope, val=0.)  # 使用常数0初始化作用域卷积层# 注册一个缓冲区init_pos,用于存储初始化的偏移位置self.register_buffer('init_pos', self._init_pos())# 初始化偏移位置的方法def _init_pos(self):# 使用arange生成一个从-self.scale/2到self.scale/2的序列,然后除以scale进行归一化h = torch.arange((-self.scale + 1) / 2, (self.scale - 1) / 2 + 1) / self.scale# 使用meshgrid生成网格,然后stack和transpose组合成一个2D偏移量矩阵return torch.stack(torch.meshgrid([h, h])).transpose(1, 2).repeat(1, self.groups, 1).reshape(1, -1, 1, 1)

功能解释:

  • DySample_UP 类是一个动态上采样模块,可以根据输入特征图动态地调整上采样的偏移量。
  • in_channels 参数指定了输入特征图的通道数。
  • scale 参数指定了上采样的尺度因子,默认为2,表示输出特征图的尺寸是输入的两倍。
  • style 参数定义了上采样的风格,可以是 'lp'(局部感知)或 'pl'(像素洗牌后局部感知)。
  • groups 参数用于分组卷积,可以增强特征图内的特征整合。
  • dyscope 参数是一个布尔值,用于确定是否使用动态作用域来调整偏移量。
  • self.offset 是一个卷积层,用于生成上采样的偏移量。
  • normal_init 函数用于初始化 self.offset 的权重。
  • self.scope 是一个可选的卷积层,仅在 dyscope 为 True 时使用,用于进一步调整偏移量。
  • _init_pos 方法生成了一个初始化的偏移位置矩阵,这个矩阵定义了上采样过程中每个像素点的参考位置。
class DySample_UP(nn.Module):# ...# sample 方法是上采样过程中对输入特征图 x 进行采样的核心函数def sample(self, x, offset):# 获取offset的尺寸,B是批次大小,H和W分别是特征图的高度和宽度B, _, H, W = offset.shape# 调整offset的视角,使其适用于后续的采样过程offset = offset.view(B, 2, -1, H, W)# 创建一个网格坐标,表示特征图中每个像素的位置coords_h = torch.arange(H) + 0.5coords_w = torch.arange(W) + 0.5coords = torch.stack(torch.meshgrid([coords_w, coords_h])).\transpose(1, 2).unsqueeze(1).unsqueeze(0).type(x.dtype).to(x.device)# 归一化网格坐标,使其范围在[-1, 1],这是F.grid_sample所需的坐标范围normalizer = torch.tensor([W, H], dtype=x.dtype, device=x.device).view(1, 2, 1, 1, 1)coords = 2 * (coords + offset) / normalizer - 1# 使用pixel_shuffle调整coords的维度,以匹配后续的采样操作coords = F.pixel_shuffle(coords.view(B, -1, H, W), self.scale).view(B, 2, -1, self.scale * H, self.scale * W).permute(0, 2, 3, 4, 1).contiguous().flatten(0, 1)# 使用grid_sample根据调整后的coords对x进行采样return F.grid_sample(x.reshape(B * self.groups, -1, H, W), coords, mode='bilinear',align_corners=False, padding_mode="border").view(B, -1, self.scale * H, self.scale * W)# forward_lp是局部感知(Local Perception)风格的上采样方法def forward_lp(self, x):# 如果定义了scope,则使用scope调整offsetif hasattr(self, 'scope'):offset = self.offset(x) * self.scope(x).sigmoid() * 0.5 + self.init_poselse:# 否则,直接使用offset并加上初始化偏移offset = self.offset(x) * 0.25 + self.init_pos# 调用sample方法进行上采样return self.sample(x, offset)# forward_pl是像素洗牌后局部感知(Pixel Shuffle then Local Perception)风格的上采样方法def forward_pl(self, x):# 首先使用pixel_shuffle对x进行像素洗牌x_ = F.pixel_shuffle(x, self.scale)# 如果定义了scope,则使用scope调整offsetif hasattr(self, 'scope'):offset = F.pixel_unshuffle(self.offset(x_) * self.scope(x_).sigmoid(), self.scale) * 0.5 + self.init_poselse:# 否则,直接使用offset并加上初始化偏移offset = F.pixel_unshuffle(self.offset(x_), self.scale) * 0.25 + self.init_pos# 调用sample方法进行上采样return self.sample(x, offset)

功能解释:

  • sample 方法是 DySample_UP 类的核心,它负责根据偏移量 offset 对输入特征图 x 进行采样。这个方法使用了 F.grid_sample 来实现上采样,通过调整采样坐标来实现动态上采样。
  • forward_lp 和 forward_pl 是两种不同的上采样风格。它们首先计算偏移量,然后调用 sample 方法来实现上采样。
  • 在 forward_lp 中,如果没有定义 scope,则偏移量是通过对 self.offset(x) 的输出进行缩放和加上初始化偏移量 self.init_pos 来得到的。
  • 在 forward_pl 中,首先对输入 x 使用 F.pixel_shuffle 进行像素洗牌,然后计算偏移量,再使用 F.pixel_unshuffle 对偏移量进行逆操作,以匹配像素洗牌后的维度。
  • 这两种方法都使用了 sample 方法来进行实际的上采样操作,其中 mode='bilinear' 指定了双线性插值作为采样方法,align_corners=False 和 padding_mode="border" 分别指定了坐标的对齐方式和填充模式。

通过这种方式,DySample_UP 类提供了一种灵活的动态上采样机制,可以根据不同的任务需求选择不同的上采样风格。

相关文章:

【扒模块】DySample

逐行注释 import torch import torch.nn as nn import torch.nn.functional as F import warnings# 忽略警告信息,这通常用于开发过程中,避免警告干扰输出结果 warnings.filterwarnings(ignore)# 定义一个函数,用于对神经网络模块的权重进行…...

数学建模之数据分析【四】:变量及其分析

文章目录 一、单变量数据1.1 单变量数据1.2 单变量分析的要点: 二、双变量数据2.1 双变量数据2.2 双变量分析的要点 三、多元数据3.1 多元数据3.2 多元分析的要点 四、单变量,双变量和多变量数据之间的区别 公众号/小红书: 快乐数模 CSDN: 清上尘 本文&a…...

iOS ------ UIKit相关

UIView和CALayer UIView UIView表示屏幕上的一块矩形区域,它是基本上iOS中所有可视化控件的父类。UIView可以管理矩形区域里的内容,处理矩形区域的事件,包括子视图的管理以及动画的实现。 UIKit相关类的继承关系 UIView继承自UIResponde…...

24/8/9算法笔记 随机森林

"极限森林"(Extremely Randomized Trees,简称ERT)是一种集成学习方法,它属于决策树的变体,通常被归类为随机森林(Random Forest)的一种。极限森林的核心思想是在构建决策树时引入极端…...

如何在前后端分离项目中,使用Spring Security

使用 WebSecurityConfigurationAdapter 在前后端分离的架构中,通常使用 Token 进行认证和授权是一种常见的做法。Token 可以是 JSON Web Token(JWT),用于在客户端和服务器之间传递身份信息和访问控制信息。下面我将详细介绍如何在…...

c#怎么折叠代码快捷

在C#中,‌你可以使用快捷键来折叠或展开代码,‌以便更好地管理和浏览代码。‌以下是一些常用的快捷键:‌ 折叠所有方法:‌使用Ctrl M O。‌折叠或展开当前方法:‌使用Ctrl M M。‌展开所有方法:‌使用…...

数据库篇--八股文学习第十七天| 什么是慢查询?原因是什么?可以怎么优化?;undo log、redo log、binlog 有什么用?

1、什么是慢查询?原因是什么?可以怎么优化? 答: 数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。 原因: 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询&…...

插件、cookie存储,json,ajax详解

1.插件 下载地址:http://github.com/carhartl/jquery-cookie/zipball/v1.4.1 使用文档:jquery-cookie(github.com) 2.存储 初学前端用的是localStorage和sessionStorage,后来又引入了cookie进行存储。 localStorage使用如下 sessionStor…...

快速上手Spring Boot

快速上手Spring Boot (qq.com)...

思路超清晰的 LVS-NAT 模式实验部署

目录 一、实验原理 1、实验基础配置图 2、实验原理 二、实验环境准备 1、准备四台红帽9的主机 2、四台主机的基础配置 (1)client 1)配置主机名:client 2)配置ip:172.25.254.200 (2)lv…...

Android实时通信:WebSocket与WebRTC的应用与优化

文章目录 一、WebSocket在Android中的应用1.1 简介1.2 示例 二、WebRTC在Android中的应用2.1 简介2.2 示例 三、Android实时通信的优化策略3.1 网络优化3.2 延迟降低 四、Android实时通信的安全问题五、实时通信协议的比较六、总结 在现代移动应用中,实时通信已经成…...

力扣刷题之3131.找出与数组相加的整数I

题干描述 给你两个长度相等的数组 nums1 和 nums2。 数组 nums1 中的每个元素都与变量 x 所表示的整数相加。如果 x 为负数,则表现为元素值的减少。 在与 x 相加后,nums1 和 nums2 相等 。当两个数组中包含相同的整数,并且这些整数出现的频…...

非线性表之堆的实际应用和二叉树的遍历

目录 前言:前一篇我已经介绍过了二叉树和堆的介绍和相关代码的实现 一、堆的实现 1.1堆向上调整算法 1.2堆向下调整算法 二、堆的应用 2.1堆的排序 2.2TOP-K问题 三、二叉树的遍历 3.1 二叉树的创建 3.2遍历介绍 3.3前序遍历 3.4中序遍历 3.5后序遍历 …...

os.path库学习之splitext函数

os.path库学习之splitext函数 一、简介 os.path.splitext 是 Python 标准库 os.path 模块中的一个函数,用于将文件名分割成两部分:文件名和扩展名。这个函数非常有用,特别是在处理文件路径和文件扩展名时。 二、语法和参数 语法: os.path…...

Python知识点:如何使用Sqlmap进行SQL注入测试

使用 Sqlmap 进行 SQL 注入测试是一个非常有效的方法,它可以帮助你自动化地检测和利用 SQL 注入漏洞。以下是使用 Sqlmap 进行 SQL 注入测试的详细步骤: 1. 安装 Sqlmap 首先,你需要安装 Sqlmap。Sqlmap 是一个 Python 工具,因此…...

Android Gradle开发与应用 (一) : Gradle基础

Gradle基础 Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建工具。它使用一种基于 Groovy 的特定领域语言(DSL)来声明项目设置,而不是传统的 XML。Gradle 提供了灵活的构建脚本和强大的依赖管理功能,使其成为…...

Linux驱动开发—设备树分析:GPIO,中断,时钟信息,CPU信息

书接上回:Linux驱动开发—设备树基本概念,语法详解-CSDN博客 文章目录 使用设备树描述中断使用设备树描述CPU节点CPU 节点缓存节点总结 使用设备树描述时钟总结 使用设备树描述GPIO示例设备树节点逐行解析GPIO 单元 使用设备树描述中断 在NXP 官方中截…...

Java全栈解密:从JVM内存管理到Spring框架,揭秘垃圾回收、类加载机制与Web开发精髓的全方位旅程

JVM内存划分 在JVM中,每个线程有自己的虚拟机栈,而整个JVM实例共享一些内存区域。JVM的内存划分主要包括四个部分:程序计数器、虚拟机栈、堆区和方法区(元数据区)。 程序计数器:程序计数器用于存储当前线程…...

【探索Linux】P.46(高级IO —— 五种IO模型简介 | IO重要概念)

阅读导航 引言一、五种IO模型1. 阻塞IO(1)定义(2)特点 2. 非阻塞IO(1)定义(2)特点 3. IO多路复用(1)定义(2)特点 4. 信号驱动IO&#…...

【MongoDB 】MongoDB 介绍及应用,设计到4个案例

MongoDB 介绍概述 基础概念 MongoDB 是非关系型数据库,也就是nosql,存储json数据格式会非常灵活,要比数据库mysql/MariaDB更好,同时也能为mysql/MariaDB分摊一部分的流量压力。 对于经常读写的数据他会存入内存,如此…...

golang循环变量捕获问题​​

在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下: 问题背景 看这个代码片段: fo…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...