【扒代码】regression_head.py

ops/2024/9/24 21:24:01/
python">import torch
from torch import nnclass UpsamplingLayer(nn.Module):# 初始化 UpsamplingLayer 类def __init__(self, in_channels, out_channels, leaky=True):super(UpsamplingLayer, self).__init__()  # 调用基类的初始化方法# 初始化一个序列模型,包含卷积层、激活函数和上采样操作self.layer = nn.Sequential(# 卷积层,用于特征图的卷积操作# in_channels 表示输入通道数,out_channels 表示输出通道数# kernel_size=3 表示卷积核大小为 3x3# padding=1 表示边缘填充,保持特征图尺寸不变nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),# 根据参数 leaky 决定使用 LeakyReLU 激活函数还是 ReLU 激活函数# LeakyReLU 在正输入值上与 ReLU 相同,但在负输入值上允许一个小的梯度(由 leaky 参数控制)nn.LeakyReLU() if leaky else nn.ReLU(),# 上采样层,使用双线性插值方法放大特征图# scale_factor=2 表示将特征图的尺寸放大两倍nn.UpsamplingBilinear2d(scale_factor=2))# 前向传播方法,将输入 x 通过定义好的层进行处理def forward(self, x):return self.layer(x)

功能解释

  • UpsamplingLayer 类接收三个参数:in_channels(输入通道数),out_channels(输出通道数),和 leaky(一个布尔值,决定是否使用 LeakyReLU 激活函数)。
  • 类初始化方法 __init__ 中,使用 nn.Sequential 创建了一个序列模型,它将按照顺序应用里面的层。
  • nn.Conv2d 是一个二维卷积层,用于在卷积神经网络中进行卷积操作。
  • nn.LeakyReLU 是一种激活函数,当输入为正时,它的行为与 nn.ReLU 相同,当输入为负时,它允许一个非零的梯度(由 leaky 参数控制)。
  • nn.UpsamplingBilinear2d 是一个上采样层,使用双线性插值方法来放大特征图的尺寸。
  • forward 方法定义了模型的前向传播,它接收输入 x,并通过 self.layer 中定义的层进行处理,然后返回处理后的结果。

整体而言,UpsamplingLayer 类实现了一个简单的上采样模块,它首先通过卷积层提取特征,然后应用激活函数,最后通过上采样层放大特征图,这在图像分割、特征细化等任务中非常有用。(这个上采样)

python">import torch
from torch import nn
from .upsamplinglayer import UpsamplingLayer  # 假设 UpsamplingLayer 在当前包中定义class DensityMapRegressor(nn.Module):# 初始化 DensityMapRegressor 类def __init__(self, in_channels, reduction):super(DensityMapRegressor, self).__init__()  # 调用基类的初始化方法# 根据 reduction 参数的不同,构建不同的回归器结构if reduction == 8:self.regressor = nn.Sequential(# 上采样层,将输入通道数 in_channels 上采样到 128UpsamplingLayer(in_channels, 128),# 继续上采样到 64UpsamplingLayer(128, 64),# 再上采样到 32UpsamplingLayer(64, 32),# 最后通过一个 1x1 卷积层将通道数减少到 1,生成密度图nn.Conv2d(32, 1, kernel_size=1),# 使用 LeakyReLU 激活函数nn.LeakyReLU())elif reduction == 16:self.regressor = nn.Sequential(# 与 reduction == 8 类似,但是最后多一个上采样步骤到 16UpsamplingLayer(in_channels, 128),UpsamplingLayer(128, 64),UpsamplingLayer(64, 32),UpsamplingLayer(32, 16),nn.Conv2d(16, 1, kernel_size=1),nn.LeakyReLU())# 初始化模型参数self.reset_parameters()# 前向传播方法,将输入 x 通过回归器处理def forward(self, x):return self.regressor(x)# 参数重置方法,使用特定的初始化方法初始化模型的权重和偏置def reset_parameters(self):for module in self.modules():  # 遍历模型中所有的模块if isinstance(module, nn.Conv2d):  # 如果模块是二维卷积层# 初始化权重为标准正态分布nn.init.normal_(module.weight, std=0.01)# 如果存在偏置项,则初始化为常数 0if module.bias is not None:nn.init.constant_(module.bias, 0)

功能解释

  • DensityMapRegressor 类用于生成对象计数的密度图,它根据输入的特征图和指定的 reduction 参数来构建一个回归器网络。
  • in_channels 参数指定了输入特征图的通道数。
  • reduction 参数控制了网络中上采样层的数量和最终生成的密度图的分辨率。
  • self.regressor 是一个序列模型,根据 reduction 参数的值,它将构建不同数量的上采样层,最后通过一个 1x1 卷积层输出通道数为 1 的密度图。
  • forward 方法定义了模型的前向传播逻辑,它接收输入 x,并通过 self.regressor 进行处理,返回处理后的密度图。
  • reset_parameters 方法用于初始化模型的参数,这里使用正态分布初始化权重,偏置初始化为常数 0。这是为了在训练开始前给模型一个合理的初始状态。

整体而言,DensityMapRegressor 类实现了一个用于生成密度图的回归网络,它通过一系列上采样层逐步放大特征图的尺寸,并最终生成一个通道数为 1 的密度图,这个密度图可以用于表示图像中对象的分布密度。

什么是上采样?

上采样(Upsampling)是深度学习和计算机视觉中常用的一种技术,用于增加数据的空间分辨率,即增加图像的高度和宽度。上采样通常在特征图(feature maps)经过一系列卷积层后应用,以便恢复图像的空间尺寸或为后续的网络层提供合适尺寸的输入。

上采样的常见方法包括:

  1. 最近邻插值(Nearest Neighbor Interpolation)

    • 这是最简单的上采样方法,通过选择距离最近的像素点的值来填充新像素点。
  2. 双线性插值(Bilinear Interpolation)

    • 这种方法考虑了新像素点周围四个最近像素点的值,并通过线性方式进行插值。
  3. 双三次插值(Bicubic Interpolation)

    • 类似于双线性插值,但使用了更高阶的多项式来提供平滑的插值效果。
  4. 转置卷积(Transposed Convolution)

    • 也称为反卷积,通过卷积操作来增加图像的空间尺寸,同时学习如何填充新像素点的值。
  5. 像素 Shuffle(Pixel Shuffle)

    • 通过重新排列像素来增加图像的分辨率,通常与子像素卷积一起使用。

在这个例子中,新像素点的值是通过考虑周围现有像素点的值并进行加权平均得到的。

上采样在许多深度学习任务中都非常有用,例如在语义分割任务中恢复图像分辨率,或者在生成对抗网络(GANs)中生成高分辨率的图像。通过上采样,模型能够生成更精细的特征表示,有助于提高任务的性能。


http://www.ppmy.cn/ops/93006.html

相关文章

Spring中dbUtil的概念和搭建使用

目录 1、什么是dbUtil 2、lombok插件 3、dbUtil通过xml来实现 4、SpringJunit的作用和效果 (1)标记测试方法和配置方法的注解 5、dbUtil通过注释来实现 6、dbUtil通过config配置类来实现 7、dbUtil通过aop的XML的实现 (1&#xff09…

【WebRTC指南】对等连接

开始使用对等连接 点对点连接是 WebRTC 规范的一部分,该规范旨在对计算机上的两点应用进行连接,以使用点对点协议进行通信。对等设备之间的通信可以是视频、音频或任意二进制数据(适用于支持 RTCDataChannel API 的客户端)。为了发现两个对等端如何连接,两个客户端都需要…

Vue3详细介绍,正则采集器所用前端框架

Vue3 引入了一个全新的响应式系统,它是基于ES6的Proxy特性构建的。这个系统使得 Vue 能够更加高效地追踪数据的变化,并在数据发生变化时自动更新DOM。响应式系统的核心是"可观察",当数据变化时,视图会响应这些变化并重新…

(回溯) LeetCode 40. 组合总和II

原题链接 一. 题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1: 输入: …

SQL注入之二次,加解密,DNS注入

加解密注入 在注入的时候,对变量做了加密操作,比如说?id1正常显示,但是代码对1进行了加密,这个时候想用?id1 and 11去判断,就得把1 and 11整体按照网站的方式加密,再去注入 二次注入 无法通过手动注入…

BP创建客户报错(尚未将分组 Z000 分配给任何客户账户组)

项目场景: SAP中使用BP创建客户主数据的,并保存 问题描述 尚未将分组 Z000 分配给任何客户账户组 消息号 FSBP_ECC004 原因分析: 后台配置有异常 解决方案: 处理方法: 路径: IMG->SAP用户化实施指南-…

关于k8s集群Pod启动过程

目录 1.Pod启动阶段(相位 phase) 1.1 phase的可能状态 2.Pod故障排除步骤 3.总结 1.Pod启动阶段(相位 phase) Pod 创建完之后,一直到持久运行起来,中间有很多步骤,也就有很多出错的可能&…

【开端】使用JWTUtil工工具制作token

一、绪论 Java开发过程中,很多接口的访问需要进行权限校验,我们经常遇到的是在访问一个接口之前需要获取到系统的访问token,然后携带token继续访问业务接口、那么这个token是怎样的生成的。下面介绍通过JWTUtil工具生成的token和校验。 二、J…