自学内容网 自学内容网

关于上采样&下采样

上采样有nn.Upsample() ,但是没有对应的下采样。因为下采样实现的方式有很多的,通常,下采样任务是通过池化层(如 nn.MaxPool2dnn.AvgPool2d)或者卷积层(如 nn.Conv2d with stride > 1)来实现的。 不过就是这两种方法的计算方式是一样的

为什么 PyTorch 没有提供 nn.Downsample ?

Downsample 是一个概念性的操作,因为在深度学习中,下采样往往是带有特定目标的。例如,卷积下采样可以提取特征,池化下采样则关注特定模式,AvgPool2d 更适合平滑特征图,而 MaxPool2d更适合保留显著特征。因此,PyTorch 提供的下采样操作方法较为灵活多样,而没有提供单一的 nn.Downsample

在实践中:

  • 池化层 适合简单降维,没有引入学习参数。不会增加特征学习的能力,因此适合在下游卷积层或特征提取层前使用
  • 卷积层下采样时还能学习特征,适合增强模型的表达能力,但是会引入学习参数

总的来说,PyTorch选择不提供 Downsample,是因为池化和卷积已经涵盖了常用的下采样需求,同时允许用户有更大的控制和灵活性

那请问nn.Upsample是怎么做到的上采样的呢?

nn.Upsample 是 PyTorch 中用于上采样的层,能够将较小的特征图放大到更高的分辨率。它通过插值来实现上采样,可以选择不同的插值方法来填充新生成的像素值,常见的方法包括 nearest(最近邻插值)和 bilinear(双线性插值)。

具体有以下几种常用的模式:

  • nearest(最近邻插值):简单复制最近的像素值。这种方式计算快,但生成的图像会比较“块状”。
    不会增加计算开销,也不会增加新的参数,适合生成粗略的上采样结果。
  • bilinear(双线性插值):通过周围 2x2 的像素值加权平均来计算新像素值,使上采样后的图像更平滑。适合处理需要平滑过渡的图像,但会稍微增加计算量。
  • bicubic(双三次插值)(仅支持 4D 输入):使用更复杂的插值公式,基于周围 4x4 像素加权计算新像素,能生成更平滑的图像。这种方式更耗时,通常用于生成高质量图像。
  • trilinear(三线性插值)(适用于 5D 张量):用于 3D 特征图的上采样,可以在体素数据(3D volume data)处理中使用。

使用 nn.Upsample

在使用时,可以设置 scale_factor 参数(指定放大的倍数)或 size 参数(直接指定目标大小)。

import torch
import torch.nn as nn

# 假设输入张量的形状为 [3, 4, 8, 8]
input_tensor = torch.randn(3, 4, 8, 8)

# 创建一个上采样层,将尺寸放大 2 倍
upsample = nn.Upsample(scale_factor=2, mode='bilinear')
output_tensor = upsample(input_tensor)
print(output_tensor.shape)  # 输出为 [3, 4, 16, 16]

在此示例中,我们将 scale_factor=2,上采样方式为 bilinear,因此尺寸从 [8, 8] 放大到了 [16, 16] 。

nn.Upsample 的应用场景

生成对称网络:在编码-解码结构(如 U-Net)中,用于将下采样的特征图恢复到更高分辨率。
生成对抗网络(GANs):用于生成高清晰度图像。

总结: nn.Upsample 是一种不增加参数的上采样方法,适合特征图的放大需求,通过不同的插值方式控制上采样质量,具体选择取决于计算效率和精度的平衡。


原文地址:https://blog.csdn.net/qq_43701910/article/details/143650504

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!