一.手写池化
import torch
def pool(X,pool_size,mode='max'):#手写池化,这里mode参数用于表示是何种池化默认最大池化p_h,p_w=pool_size#poolsize表示池化窗口大小传入一个元组Y=torch.zeros((X.shape[0]-p_h+1,X.shape[1]-p_w+1))#构造输出for i in range(Y.shape[0]):for j in range(Y.shape[1]):if mode=='max':Y[i,j]=(X[i:i+p_h,j:j+p_w]).max()elif mode == 'min':Y[i, j] = (X[i:i + p_h, j:j + p_w]).min()elif mode=='avg':#平均池化Y[i, j] = (X[i:i + p_h, j:j + p_w]).mean()return Y
X=torch.tensor([[0.0,1.0,2.0],[3.0,4.0,5.0],[6.0,7.0,8.0]])
print(pool(X,(2,2)))
print(pool(X,(2,2),mode='min'))
print(pool(X,(2,2),mode='avg'))
二.调用库函数(以后用这个)
import torch
X=torch.tensor([[0.0,1.0,2.0],[3.0,4.0,5.0],[6.0,7.0,8.0]])
X=X.reshape((1,1,3,3))#批量,通道,高,宽,在pytorch里必须传入四维
#池化都在torch下的nn里,如果池化窗口宽高一样可写一个例如2等价于(2,2)
#填充padding=(行填充,列填充),步幅stride都可以自定义(超参数)
#默认在pytorch里窗口大小等于步幅大小
pool2d=torch.nn.MaxPool2d(2,stride=1)
print(pool2d(X))
三.多输入通道
在池化中输出通道数等于输入通道数
import torch
from torch import nn
X=torch.arange(16).reshape((1,1,4,4))#rand是随机数,arange是序列例如arange16指0-15整数
print(X)
X=torch.cat((X,X+1),1)#变成两个输入通道
print(X)
pool2d=nn.MaxPool2d(3,padding=1,stride=2)
print(pool2d(X))
对每个输入通道分别池化