文章目录
一、torch.nn.AvgPool2d():二维平均池化
1.1参数介绍
torch.nn.AvgPool2d( kernel_size , stride=None , padding=0 , ceil_mode=False , count_include_pad=True , divisor_override=None )
torch.nn.AvgPool2d()
用于在由多个平面组成的输入信号上应用二维平均池化操作,输入尺寸为
(
N
,
C
i
n
,
H
,
W
)
(N,C_{in},H,W)
(N,Cin,H,W),输出尺寸为
(
N
,
C
i
n
,
H
o
u
t
,
W
o
u
t
)
(N,C_{in},H_{out},W_{out})
(N,Cin,Hout,Wout)。输出特征图形状为:
其中,
H
i
n
、
W
i
n
H_{in}、W_{in}
Hin、Win分别表输入图像的高度与宽度,默认向下取整。
参数名 | 功能 |
---|---|
kernel_size | 池化核大小,整数或元组。 |
stride | 步幅,默认等于kernel_size,整数或元组。 |
padding | 填充,整数或元组。 |
ceil_mode | 设为True时,在计算输出形状的过程中采用向上取整的操作,否则,采用向下取整。 |
count_include_pad | 布尔类型,当为True时,将在平均池化计算中包括零填充,否则,不包括零填充。 |
divisor_override | 如果被指定,则除数会被代替成divisor_override。换句话说,如果不指定该变量,则平均池化的计算过程其实是在一个池化核内,将元素相加再除以池化核的大小,也就是divisor_override默认为池化核的高×宽;如果该变量被指定,则池化过程为将池化核内元素相加再除以divisor_override。 |
1.2代码案例
【一般用法】
import torch
from torch import nn
img=torch.arange(16).reshape(1,1,4,4)
# 池化核和池化步长均为2
pool=nn.AvgPool2d(2,stride=2)
img_2=pool(img)
print(img)
print(img_2)
【ceil_mode用法】
import torch
from torch import nn
img=torch.arange(20,dtype=torch.float).reshape(1,1,4,5)
pool_f=nn.AvgPool2d(2,stride=2,padding=0,ceil_mode=False)#向下取整
pool_t=nn.AvgPool2d(2,stride=2,padding=0,ceil_mode=True)#向上取整
img_1=pool_f(img)
img_2=pool_t(img)
print(img)
print(img_1)
print(img_2)
【padding用法】
import torch
from torch import nn
img=torch.arange(16,dtype=torch.float).reshape(1,1,4,4)
pool_t=nn.AvgPool2d(2,stride=2,padding=1)#填充后图像大小为(1,1,6,6),池化输出图像大小为(1,1,3,3)
pool_f=nn.AvgPool2d(2,stride=2)#图像大小为(1,1,4,4),池化输出图像大小为(1,1,2,2)
img_1=pool_t(img)
img_2=pool_f(img)
print(img)
print(img_1)
print(img_2)
【count_include_pad】
import torch
from torch import nn
img=torch.arange(16,dtype=torch.float).reshape(1,1,4,4)
pool_t=nn.AvgPool2d(2,stride=2,padding=1,count_include_pad=True)
pool_f=nn.AvgPool2d(2,stride=2,padding=1,count_include_pad=False)
img_1=pool_t(img)
img_2=pool_f(img)
print(img)
print(img_1)#用于填充的0被用于计算
print(img_2)#用于填充的0不用于计算
【divisor_override】
import torch
from torch import nn
img=torch.arange(16,dtype=torch.float).reshape(1,1,4,4)
pool_1=nn.AvgPool2d(2,stride=2)
pool_d1=nn.AvgPool2d(2,stride=2,divisor_override=2)
pool_d2=nn.AvgPool2d(2,stride=2,divisor_override=3)
img_1=pool_1(img)
img_2=pool_d1(img)
img_3=pool_d2(img)
print(img)
print(img_1)
print(img_2)
print(img_3)
二、torch.nn.AdaptiveAvgPool2d():自适应平均池化
torch.nn.AdaptiveAvgPool2d()
用于将输入特征图的高度和宽度调整到指定输出尺寸(不会改变通道数),并执行平均池化操作输出特征图。与torch.nn.AvgPool2d()
不同,torch.nn.AdaptiveAvgPool2d()
可处理任意大小的输入特征图,并将其调整为指定的输出尺寸,即,对于每个通道,AdaptiveAvgPool2d
会根据指定的输出大小将输入图像划分为分段网格,然后计算每个分段的平均值,这个平均值成为相应的输出像素。。
2.1参数介绍
torch.nn.AdaptiveAvgPool2d(output_size)
output_size
:指定输出特征图的高度和宽度。- 整数:输出特征图的高度和宽度相等。
- 元组:分别指定输出特征图的高度和宽度。
- None:输出特征图尺寸和输入保持一致。
torch.nn.AdaptiveAvgPool2d(output_size)
的输入数据尺寸仍为
(
N
,
C
,
H
,
W
)
(N,C,H,W)
(N,C,H,W),输出数据尺寸由参数决定,但
N
、
C
N、C
N、C不会改变。
2.2代码案例
【输出特征图大小为1x1】
import torch
import torch.nn as nn
# 定义自适应平均池化层,输出尺寸为 1x1
adaptive_pool = nn.AdaptiveAvgPool2d((1, 1))
# 输入特征图尺寸为 1x3x4x4
input_tensor = torch.randn(1, 3, 4, 4)
output_tensor = adaptive_pool(input_tensor)
print("输入:", input_tensor)
print("输出:", output_tensor)
【输出特征图宽、高不等】
import torch
import torch.nn as nn
# 定义自适应平均池化层,输出尺寸为 1x1
adaptive_pool = nn.AdaptiveAvgPool2d((3, 2))
# 输入特征图尺寸为 1x3x4x4
input_tensor = torch.randn(1, 3, 4, 4)
output_tensor = adaptive_pool(input_tensor)
print("输入:", input_tensor)
print("输出:", output_tensor)
2.3使用场景
AdaptiveAvgPool2d()
一般在卷积层和全连接层的交汇处使用,以便确定输出到Linear层的大小。下图为VGG中AdaptiveAvgPool2d()的使用: