相关文章
Pytorch学习笔记(一):torch.cat()模块的详解
Pytorch学习笔记(二):nn.Conv2d()函数详解
Pytorch学习笔记(三):nn.BatchNorm2d()函数详解
Pytorch学习笔记(四):nn.MaxPool2d()函数详解
Pytorch学习笔记(五):nn.AdaptiveAvgPool2d()函数详解
Pytorch学习笔记(六):view()和nn.Linear()函数详解
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️
1. 函数语法格式和作用➡️
1.1 作用➡️
nn.AdaptiveAvgPool2d
是 PyTorch 中一个非常有用的神经网络层,其核心作用是进行自适应平均池化操作。在深度学习领域,尤其是在处理图像数据时,不同的卷积神经网络层会生成不同尺寸的特征图。而这些特征图的尺寸可能会因为网络结构和输入数据的不同而有所差异。
自适应平均池化的关键特性在于,它能够根据指定的输出尺寸(H,W),对输入的特征图进行平均池化操作,使得无论输入特征图的尺寸如何变化,最终输出的特征图都具有固定的尺寸(H,W)。这种操作在很多情况下都非常重要。
一方面,在模型训练过程中,不同的网络层可能需要固定尺寸的输入。通过 nn.AdaptiveAvgPool2d
,可以将前面层输出的各种尺寸的特征图统一调整为所需的尺寸,方便后续网络层的处理。例如,在一些全连接层之前,通常需要将卷积层输出的特征图转换为固定大小的向量,自适应平均池化就可以帮助实现这一目的。
另一方面,它有助于减少模型对输入数据尺寸的敏感性,提高模型的泛化能力。在实际应用中,输入图像的大小可能会有所不同,但通过自适应平均池化,模型可以以统一的方式处理这些不同尺寸的图像,从而在不同的数据集上都能表现出较好的性能。
此外,平均池化操作本身还可以起到一定的特征压缩和去噪作用,通过对局部区域的特征进行平均,能够保留主要的特征信息,同时减少噪声和细节的干扰,使得模型更加鲁棒。
1.2 函数语言格式➡️
nn.AdaptiveAvgPool2d(output_size)
这里的 output_size
是一个关键参数,它用于指定经过自适应平均池化后输出特征图的尺寸。output_size
可以是一个整数,也可以是一个包含两个整数的元组。
当 output_size
为一个整数时,例如 nn.AdaptiveAvgPool2d(8)
,表示输出的特征图将是一个正方形,其高度和宽度都为 8。在这种情况下,自适应平均池化会根据输入特征图的尺寸,自动计算出合适的池化窗口大小和步长,以确保输出特征图的尺寸为 8×8。
当 output_size
为一个包含两个整数的元组时,比如 nn.AdaptiveAvgPool2d((4, 6))
,这就明确指定了输出特征图的高度为 4,宽度为 6。自适应平均池化会根据输入特征图的尺寸,分别在高度和宽度方向上进行计算,以得到指定尺寸的输出特征图。
以下是一个简单的使用示例:
import torch
import torch.nn as nn
# 创建一个随机的输入特征图,形状为 (1, 32, 16, 16),表示 1 个样本,32 个通道,16×16 的尺寸
input_tensor = torch.randn(1, 32, 16, 16)
# 创建一个自适应平均池化层,指定输出尺寸为 (4, 4)
adaptive_pool = nn.AdaptiveAvgPool2d((4, 4))
# 对输入特征图进行自适应平均池化操作
output_tensor = adaptive_pool(input_tensor)
print("输入特征图尺寸:", input_tensor.size())
print("输出特征图尺寸:", output_tensor.size())
在上述示例中,我们首先创建了一个随机的输入特征图,然后实例化了一个 nn.AdaptiveAvgPool2d
层,指定输出尺寸为 (4, 4)。最后,将输入特征图传入该层进行处理,得到输出特征图。通过打印输入和输出特征图的尺寸,可以直观地看到自适应平均池化的效果。
2.参数解释➡️
- output_size:指定输出固定尺寸
3.具体代码➡️
import torch
import torch.nn as nn
m = nn.AdaptiveAvgPool2d((5,1))
m1 = nn.AdaptiveAvgPool2d((None,5))
m2 = nn.AdaptiveAvgPool2d(1)
input = torch.randn(2, 64, 8, 9)
output = m(input)
output1 = m1(input)
output2 = m2(input)
print('nn.AdaptiveAvgPool2d((5,1)):',output.shape)
print('nn.AdaptiveAvgPool2d((None,5)):',output1.shape)
print('nn.AdaptiveAvgPool2d(1):',output2.shape)
结果:
✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️