pytorch之池化层

2023-05-16

·实际图像里,我们感兴趣的物体不会总出现在固定位置:即使我们连续拍摄同一个物体也极有可能出现像素位置上的偏移。这会导致同一个边缘对应的输出可能出现在卷积输出 Y中的不同位置,进而对后面的模式识别造成不便。
在本节中我们介绍池化(pooling)层,它的提出是为了缓解卷积层对位置的过度敏感性
 

 

二维最大池化层和平均池化层

同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出。不同于卷积层里计算输入和核的互相关性,池化层直接计算池化窗口内元素的最大值或者平均值。该运算也分别叫做最大池化或平均池化。在二维最大池化中,池化窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当池化窗口滑动到某一位置时,窗口中的输入子数组的最大值即输出数组中相应位置的元素

 下面把池化层的前向计算实现在pool2d函数里。它跟5.1节(二维卷积层)里corr2d函数非常类似,唯一的区别在计算输出Y

import torch
from torch import nn

def pool2d(X, pool_size, mode='max'):
    X = X.float()
    p_h, p_w = pool_size
    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 == 'avg':
                Y[i, j] = X[i: i + p_h, j: j + p_w].mean()       
    return Y

我们可以构造图5.6中的输入数组X来验证二维最大池化层的输出。

X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
pool2d(X, (2, 2))

输出:

tensor([[4., 5.],
        [7., 8.]])

同时我们实验一下平均池化层。

pool2d(X, (2, 2), 'avg')

输出:

tensor([[2., 3.],
        [5., 6.]])

2. 填充和步幅

同卷积层一样,池化层也可以在输入的高和宽两侧的填充并调整窗口的移动步幅来改变输出形状。池化层填充和步幅与卷积层填充和步幅的工作机制一样。我们将通过nn模块里的二维最大池化层MaxPool2d来演示池化层填充和步幅的工作机制。我们先构造一个形状为(1, 1, 4, 4)的输入数据,前两个维度分别是批量和通道。
 

X = torch.arange(16, dtype=torch.float).view((1, 1, 4, 4))
X

输出:

tensor([[[[ 0.,  1.,  2.,  3.],
          [ 4.,  5.,  6.,  7.],
          [ 8.,  9., 10., 11.],
          [12., 13., 14., 15.]]]])

默认情况下,MaxPool2d实例里步幅和池化窗口形状相同。下面使用形状为(3, 3)的池化窗口,默认获得形状为(3, 3)的步幅。

pool2d = nn.MaxPool2d(3)
pool2d(X) 

输出:

tensor([[[[10.]]]])

我们可以手动指定步幅和填充。

pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d(X)

输出;

tensor([[[[ 5.,  7.],
          [13., 15.]]]])

当然,我们也可以指定非正方形的池化窗口,并分别指定高和宽上的填充和步幅。


pool2d = nn.MaxPool2d((2, 4), padding=(1, 2), stride=(2, 3))
pool2d(X)

输出:

tensor([[[[ 1.,  3.],
          [ 9., 11.],
          [13., 15.]]]])

3. 多通道

在处理多通道输入数据时,池化层对每个输入通道分别池化,而不是像卷积层那样将各通道的输入按通道相加。这意味着池化层的输出通道数与输入通道数相等。下面将数组XX+1在通道维上连结来构造通道数为2的输入。

X = torch.cat((X, X + 1), dim=1)
X

输出:

tensor([[[[ 0.,  1.,  2.,  3.],
          [ 4.,  5.,  6.,  7.],
          [ 8.,  9., 10., 11.],
          [12., 13., 14., 15.]],

         [[ 1.,  2.,  3.,  4.],
          [ 5.,  6.,  7.,  8.],
          [ 9., 10., 11., 12.],
          [13., 14., 15., 16.]]]])

池化后,我们发现输出通道数仍然是2。

pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d(X)

输出:

tensor([[[[ 5.,  7.],
          [13., 15.]],

         [[ 6.,  8.],
          [14., 16.]]]])

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytorch之池化层 的相关文章

随机推荐

  • myeclipse2019 4.0配置tomcat9的两个问题

    myeclipse2019 4 0配置tomcat9的两个问题 问题一 xff1a myeclipse配置tomcat端口无效 图中提示Tomcat的一个或多个端口无效 xff08 并非占用 xff0c 端口占用看问题二 xff09 出现这
  • MySQL-约束(三)

    MySQL 约束 约束的定义常见的约束类型表级约束与列级约束例子非空约束 NOT NULL 唯一约束 UNIQUE 联合唯一约束 默认约束 DEFAULT 主键约束 PRIMARY KEY 复合主键约束复合主键与联合主键 外键约束 FORE
  • 双系统之kali

    双系统之kali 所用工具制作kali的引导盘硬盘分区安装kali设置启动引导设置root密码U盘恢复 下面文章多为图片形式 xff0c 每个图片中包含详细的步骤 所用工具 16G的U盘一个 xff0c 电脑一台 所有的软件均已上传至百度网
  • 连接GitHub提示远程主机关闭连接

    连接GitHub提示远程主机关闭连接 发现问题排查问题反思 错误代码 xff1a kex exchange identification Connection closed by remote host 发现问题 今天晚上使用git连接了G
  • Linux - Nginx安装

    Linux Nginx安装 下载 amp 配置启动优化nginx添加新模块 本文由于是学习 xff0c 所以使用tar包安装 xff0c Linux版本CentOS7 xff0c nginx 1 20 2 xff0c 本次安装路径为 usr
  • 异常记录-3

    异常记录 3 异常类名描述问题原因解决方案异常重现 异常类名 org springframework beans BeanInstantiationException 描述 Failed to instantiate javax servl
  • 异常记录-22

    异常记录 22 异常描述问题原因解决方案异常重现 异常 ssl SSLEOFError EOF occurred in violation of protocol ssl c 997 描述 urllib3 exceptions MaxRet
  • Linux - RabbitMQ部署

    Linux RabbitMQ部署 准备部署账户创建使用 准备 span class token function cat span etc redhat release 查看自己的服务器什么版本的 xff0c 本人使用的CentOS8 安装
  • Linux - MongoDB部署

    MongoDB部署 准备部署mongoDB部署 启动优化角色 参考 准备 MongoDB下载 官方下载 选择自己需要的版本 xff0c 以及服务器版本 xff0c 以及安装方式 xff0c 本篇文章我们安装6 0MongoDB使用CentO
  • 异常记录-23

    异常记录 23 异常描述问题原因解决方案异常重现 异常 64 WebFilter 描述 Java 过滤器 64 WebFilter不起作用 问题原因 64 WebFilter需要注册到Bean中 xff0c 只写注解不起作用的 解决方案 在
  • Vscode黑色主题很难看到鼠标

    Vscode黑色主题很难看到鼠标 xff0c 像瞎了一样 xff0c 找半天不知道鼠标在哪里 xff0c 解决办法 xff1a 控制面板 鼠标 指针 看 自定义 选择 文本选择 点击 浏览 选择 beam r xff0c 这个是光标周围带白
  • python中变量前面加单下划线和双下划线的区别&python的私有属性

    一 在py文件中 变量名字前面加单下划线和双下划线都是对变量的保护 xff0c 一种约定 xff0c 用来指定变量私有 程序员用来指定私有变量的一种方式 不能用from module import 导入 xff0c 其他方面和公有一样访问
  • APM、PIXHAWK、PX4的关系

  • QT小记:QT程序异常结束的可能原因

    一 问题 xff1a 程序异常结束 二 解决 1 解决思路 xff08 1 xff09 QT程序异常结束的原因之一可能引用了某个库 xff0c 但是某个库QT找不到 xff0c 就会出现崩溃的问题 解决 xff1a 1 检查pro文件是否正
  • C语言:十进制转换成十六进制字符串和数组

    1 十进制转换成十六进制字符串 include lt stdio h gt 函数 xff1a 将十进制数字转换为十六进制 xff0c 并将转换后的数字存储在字符串中并输出 void dec2hex int n char str 100 in
  • 【统计计算】课程总结笔记

    传统的主成分分析法 xff08 PCA xff09 缺陷在于 xff1a 对于 小样本问题 xff08 样本维数d远大于样本个数N xff09 xff0c 样本协方差矩阵规模 d d 太大了 xff0c 在后续求特征值问题中计算量较大 于是
  • ros --- 双目相机内参与外参标定

    ros 双目相机内参与外参标定 小觅相机直接获取参数手动重新标定1 双目相机内外参标定生成标定板录制 stereo calibra bag标定标定结果标定验证 2 双目 43 imu外参标定录制 stereo 43 imu calibra
  • RT-Thread之入门跑代码

    本文将讲述如何在window10中利用tensorflow跑代码 xff0c 并且编译成bin文件 xff0c 最后在k210中运行 一 在window上安装tensorflow框架 xff08 python3 7 xff09 1 安装An
  • keil5的基本使用

    项目文件后缀 硬件下载 1 编译 2 下载 软件仿真 一 基本知识 1 选择软件仿真选项 2 编译 3 启动软件仿真 4 运行代码 二 软件仿真的具体使用 1 我们想运行到 哪一步就在那一步添加断点 xff08 在左边的空白处左键点一下就可
  • pytorch之池化层

    实际图像里 xff0c 我们感兴趣的物体不会总出现在固定位置 xff1a 即使我们连续拍摄同一个物体也极有可能出现像素位置上的偏移 这会导致同一个边缘对应的输出可能出现在卷积输出 Y中的不同位置 xff0c 进而对后面的模式识别造成不便 在