import torch
from torch import nn
from d2l import torch as d2l
def pool2d(X,pool_size,mode='max'): # 本函数已保存在d2lzh包中方便以后使用
h, w = pool_size # 取出K的行数和列数
#print("h=",h,"w=",w)
Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))#生成输出特征图的大小并且初始化为0
#print("X.shape[0]",X.shape[0]) #X.shape[0]是X 3*3的行数 X.shape[1]是X 3*3的列数
#print("Y=",Y)
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
if mode=='max':
#print(X[i: i + h, j: j + w],"**")
Y[i, j] = (X[i: i + h, j: j + w] ).max()
#X[i: i + h, j: j + w]取出对应区域如下图
elif mode=='avg':
#print(X[i: i + h, j: j + w],"**")
Y[i, j] = (X[i: i + h, j: j + w] ).mean()
return Y
for下面的X[i: i + h, j: j + w]实现功能如下。框住后通过max()和mean()实现最大和平均池化
?
X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
#pool2d(X,(2,2),'max')
pool2d(X,(2,2),'avg')
结果
tensor([[2., 3.],
[5., 6.]])
池化窗口
pool2d=nn.MaxPool2d(3) #3*3池化窗口
pool2d(X)
在当前设置的池化窗口中每一次选中不可有重复部分
?输出结果为
tensor([[[[10.]]]])
手动设定步幅和填充。这里框可以有重合
pool2d=nn.MaxPool2d(3,padding=1,stride=2)
pool2d(X)
此时填充后为
结果为
tensor([[[[ 5., 7.],
[13., 15.]]]])
?设定一个任意大小的矩阵池化池窗口,并分别设定填充和步幅的高度和宽度
pool2d=nn.MaxPool2d((2,3),padding=(1,1),stride=(2,3))
pool2d(X)
?结果如下
tensor([[[[ 1., 3.],
[ 9., 11.],
[13., 15.]]]])
|