池化

一.手写池化

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))

image

对每个输入通道分别池化

image

在 PyTorch 中,torch.nn.MaxPool2d 是用于 2D 最大池化操作的类,其构造函数可以传入以下主要参数:
  1. kernel_size:池化核的大小。
    • 可以是整数(如 kernel_size=3,表示 3x3 的池化核)
    • 也可以是元组(如 kernel_size=(2, 3),表示高度为 2、宽度为 3 的池化核)
  2. stride:步长,即池化核移动的距离。
    • 默认为 None,此时步长等于池化核大小
    • 可以是整数或元组,规则同 kernel_size
  3. padding:在输入的边缘添加的填充大小。
    • 默认为 0
    • 可以是整数(各边填充相同大小)或元组(分别指定高度和宽度方向的填充)
  4. dilation:池化核内部元素之间的间距(膨胀率)。
    • 默认为 1,即标准池化核
    • 用于实现空洞池化,增大感受野
  5. return_indices:是否返回最大值的索引。
    • 默认为 False
    • 设为 True 时,会同时返回池化结果和最大值的索引(可用于反池化操作)
  6. ceil_mode:是否使用向上取整来计算输出大小。
    • 默认为 False(使用向下取整)
    • 设为 True 时,当输入尺寸不能被步长整除时,会保留最后一个不完整的池化窗口
posted @ 2025-10-15 15:19  Annaprincess  阅读(12)  评论(0)    收藏  举报