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

【深入浅出PyTorch】--上采样+下采样

我们来系统地介绍 上采样(Upsampling)下采样(Downsampling) 的概念、作用,以及在 PyTorch 中的实现方式

目录

1.下采样

1.1.nn.MaxPool2d

1.2.nn.AvgPool2d

1.3.nn.Conv2d

2.上采样

2.1.nn.Upsample

2.2.nn.ConvTranspose2d


1.下采样

🔹 定义

下采样 是指 降低特征图的空间尺寸(高度和宽度),通常用于减少计算量、扩大感受野、提取高层语义信息。

🔹 作用

  • 减少特征图大小,降低内存消耗

  • 扩大感受野(每个神经元“看到”的区域更大)

  • 提取更抽象的语义特征(如物体类别)

  • 常用于编码器(Encoder)中

🔹 常见方法

  1. 最大池化(Max Pooling)

  2. 平均池化(Average Pooling)

  3. 带步长的卷积(Strided Convolution)

1.1.nn.MaxPool2d

原理请看:https://blog.csdn.net/qq_58602552/article/details/148617896?spm=1001.2014.3001.5501

import torch.nn as nn
import torch
# 最大池化,窗口大小2x2,步长2
pool = nn.MaxPool2d(kernel_size=2, stride=2)x = torch.randn(1, 3, 224, 224)
x = pool(x)  # 输出尺寸减半print(x.shape)

1.2.nn.AvgPool2d

import torch.nn as nn
import torch
# 最大池化,窗口大小2x2,步长2x = torch.randn(1, 3, 224, 224)pool = nn.AvgPool2d(kernel_size=2, stride=2)
x = pool(x)print(x.shape)

1.3.nn.Conv2d

# 使用步长为2的卷积实现下采样
conv_down = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=2, padding=1)
x = conv_down(x)  # 尺寸减半,同时提取特征

2.上采样

🔹 定义:

上采样 是指 增大特征图的空间尺寸(高度和宽度),用于恢复空间分辨率,常用于解码器(Decoder)或分割任务中。

🔹 作用:

  • 恢复图像尺寸(如从 32×32 → 64×64)

  • 与跳跃连接(skip connection)结合,融合细节信息

  • 生成高分辨率输出(如语义分割图)

🔹 常见方法:

  1. 插值法(Interpolation):双线性、双三次等

  2. 转置卷积(Transposed Convolution):也叫反卷积(Deconvolution)

2.1.nn.Upsample

torch.nn.Upsample(size=None,scale_factor=None,mode='nearest',align_corners=None,recompute_scale_factor=None
)
参数名默认值说明可选值示例
sizeNone指定输出特征图的目标空间尺寸。可与 scale_factor 二选一或共用。64(128, 128)(32, 64, 64)(3D)
scale_factorNone指定每个空间维度的放大倍数。例如 2 表示放大 2 倍。21.5(2, 2)(2, 1.5)
mode'nearest'插值方法,决定如何“填补”放大后的像素值。不同模式影响输出平滑度。'nearest''bilinear''bicubic''trilinear'
align_cornersNone(等价于 False是否对齐输入和输出的角点像素。在分割任务中建议设为 TrueTrueFalse
recompute_scale_factorNone是否重新计算 scale_factor(避免插值误差)。如果 size 未指定且 scale_factor 为浮点数,建议设为 TrueTrueFalse
模式维度平滑性速度适用场景推荐指数
'nearest'(临近插值)1D/2D/3D❌ 粗糙,有锯齿⚡️ 极快快速原型、分类任务⭐⭐☆
'bilinear'(线性插值)2D✅ 平滑图像分割、重建、U-Net⭐⭐⭐⭐
'bicubic'()2D✅✅ 非常平滑较慢高质量图像放大⭐⭐⭐
'trilinear'3D✅ 平滑3D 医学图像分割(如 MRI)⭐⭐⭐⭐

推荐:在语义分割任务中,使用 'bilinear' + align_corners=True

>>> input = torch.arange(1, 5, dtype=torch.float32).view(1, 1, 2, 2)
>>> input
tensor([[[[ 1.,  2.],[ 3.,  4.]]]])>>> m = nn.Upsample(scale_factor=2, mode='nearest')
>>> m(input)
tensor([[[[ 1.,  1.,  2.,  2.],[ 1.,  1.,  2.,  2.],[ 3.,  3.,  4.,  4.],[ 3.,  3.,  4.,  4.]]]])>>> m = nn.Upsample(scale_factor=2, mode='bilinear')  # align_corners=False
>>> m(input)
tensor([[[[ 1.0000,  1.2500,  1.7500,  2.0000],[ 1.5000,  1.7500,  2.2500,  2.5000],[ 2.5000,  2.7500,  3.2500,  3.5000],[ 3.0000,  3.2500,  3.7500,  4.0000]]]])>>> m = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
>>> m(input)
tensor([[[[ 1.0000,  1.3333,  1.6667,  2.0000],[ 1.6667,  2.0000,  2.3333,  2.6667],[ 2.3333,  2.6667,  3.0000,  3.3333],[ 3.0000,  3.3333,  3.6667,  4.0000]]]])>>> # Try scaling the same data in a larger tensor
>>>
>>> input_3x3 = torch.zeros(3, 3).view(1, 1, 3, 3)
>>> input_3x3[:, :, :2, :2].copy_(input)
tensor([[[[ 1.,  2.],[ 3.,  4.]]]])
>>> input_3x3
tensor([[[[ 1.,  2.,  0.],[ 3.,  4.,  0.],[ 0.,  0.,  0.]]]])>>> m = nn.Upsample(scale_factor=2, mode='bilinear')  # align_corners=False
>>> # Notice that values in top left corner are the same with the small input (except at boundary)
>>> m(input_3x3)
tensor([[[[ 1.0000,  1.2500,  1.7500,  1.5000,  0.5000,  0.0000],[ 1.5000,  1.7500,  2.2500,  1.8750,  0.6250,  0.0000],[ 2.5000,  2.7500,  3.2500,  2.6250,  0.8750,  0.0000],[ 2.2500,  2.4375,  2.8125,  2.2500,  0.7500,  0.0000],[ 0.7500,  0.8125,  0.9375,  0.7500,  0.2500,  0.0000],[ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000]]]])>>> m = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
>>> # Notice that values in top left corner are now changed
>>> m(input_3x3)
tensor([[[[ 1.0000,  1.4000,  1.8000,  1.6000,  0.8000,  0.0000],[ 1.8000,  2.2000,  2.6000,  2.2400,  1.1200,  0.0000],[ 2.6000,  3.0000,  3.4000,  2.8800,  1.4400,  0.0000],[ 2.4000,  2.7200,  3.0400,  2.5600,  1.2800,  0.0000],[ 1.2000,  1.3600,  1.5200,  1.2800,  0.6400,  0.0000],[ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000]]]])

2.2.nn.ConvTranspose2d

具体原理:https://blog.csdn.net/qq_58602552/article/details/152280344?spm=1001.2014.3001.5501

(转置卷积)

转置卷积✅ 是可学习上采样模式可能出现棋盘伪影精确分割、生成任务
# 转置卷积:将特征图放大2倍,同时学习上采样方式
upconv = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2)
x = upconv(x)  # 输出尺寸 ×2
  • kernel_size=2stride=2:完美放大2倍
  • 可学习参数,比插值更灵活
  • 但可能产生“棋盘效应”(checkerboard artifacts)
http://www.dtcms.com/a/465255.html

相关文章:

  • 一个基于自适应图卷积神经微分方程(AGCNDE)的时空序列预测Matlab实现。这个模型结合了图卷积网络和神经微分方程,能够有效捕捉时空数据的动态演化规律
  • 笑话网站模板重庆品牌设计公司
  • (6)100天python从入门到拿捏《推导式》
  • 【数据结构】考研数据结构核心考点:AVL树插入操作深度解析——从理论到实践的旋转平衡实现
  • 遂宁网站建设哪家好网站诊断案例
  • Python访问数据库——使用SQLite
  • 一行配置解决claude code 2.0版本更新后 vscode 插件需要登录的问题
  • 问题:conda创建的虚拟环境打印中文在vscode中乱码
  • vscode 连接 wsl
  • 华为OD机试C卷 - 灰度图存储 - 矩阵 - (Java C++ JavaScript Python)
  • 资源采集网站如何做wap网站使用微信登陆
  • UNIX下C语言编程与实践58-UNIX TCP 连接处理:accept 函数与新套接字创建
  • wordpress博客站点云狄网站建设
  • 智能OCR助力企业办公更高效-发票识别接口-文字识别接口-文档识别接口
  • Spring Boot自动配置:原理、利弊与实践指南
  • HTTPS原理:从证书到加密的完整解析
  • CNN与ANN差异对比
  • 小迪web自用笔记61
  • Docker 公有仓库使用、Docker 私有仓库(Registry)使用总结
  • Comodo HTTPS 在工程中的部署与排查实战(证书链、兼容性与真机抓包策略)
  • 推广网站怎么做能增加咨询免费域名申请与解析
  • ES6开发实案例
  • 使用大模型技术构建机票分销领域人工智能客服助手
  • R语言 读取tsv的三种方法 ,带有注释的tsv文件
  • 淘宝数据网站开发查邮箱注册的网站
  • H200服务器维修服务体系构建:捷智算的全链条保障方案
  • Windows安装RabbitMQ保姆级教程
  • 申请网站服务器网络营销的特点和作用
  • Java-Spring入门指南(二十二)SSM整合前置基础
  • vim 中设置高亮