池化层(pooling)

目录

一、池化层

1、最大池化层

2、平均池化层

3、总结

二、代码实现

1、最大池化与平均池化

2、填充和步幅(padding和strides)

3、多个通道

4、总结


一、池化层

1、最大池化层

2、平均池化层

3、总结

  • 池化层返回窗口中最大或平均值
  • 环节卷积层对位置的敏感性
  • 同样有窗口大小、填充和步幅作为超参数

二、代码实现

       通常当我们处理图像时,我们希望逐渐降低隐藏表示的空间分辨率、聚集信息,这样随着我们在神经网络中层叠的上升,每个神经元对其敏感的感受野(输入)就越大。

       而我们的机器学习任务通常会跟全局图像的问题有关(例如,“图像是否包含一只猫呢?”),所以我们最后一层的神经元应该对整个输入的全局敏感。通过逐渐聚合信息,生成越来越粗糙的映射,最终实现学习全局表示的目标,同时将卷积图层的所有优势保留在中间层。

1、最大池化与平均池化

       在下面的代码中的`pool2d`函数,我们实现池化层的前向传播。然而,这里我们没有卷积核,输出为输入中每个区域的最大值或平均值。

import torch
from torch import nn
from d2l import torch as d2l
def pool2d(X, pool_size, mode='max'):
    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

       我们可以构建下图中的输入张量`X`,验证二维最大汇聚层的输出。

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))
tensor([[4., 5.],
        [7., 8.]])

       此外,我们还可以验证平均汇聚层。

pool2d(X, (2, 2), 'avg')
tensor([[2., 3.],
        [5., 6.]])

2、填充和步幅(padding和strides)

       与卷积层一样,池化层也可以改变输出形状,我们可以通过填充和步幅以获得所需的输出形状。下面,我们用深度学习框架中内置的二维最大池化层,来演示池化层中填充和步幅的使用。我们首先构造了一个输入张量`X`,它有四个维度,其中样本数和通道数都是1。

X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4)) # (样本数, 通道数, 高, 宽)
print(X)
tensor([[[[ 0.,  1.,  2.,  3.],
          [ 4.,  5.,  6.,  7.],
          [ 8.,  9., 10., 11.],
          [12., 13., 14., 15.]]]])

       默认情况下,深度学习框架中的步幅与池化窗口的大小相同。因此,如果我们使用形状为`(3, 3)`的汇聚窗口,那么默认情况下,我们得到的步幅形状为`(3, 3)`。

pool2d = nn.MaxPool2d(3)    # 使用形状为(3, 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), stride=(2, 3), padding=(0, 1))
pool2d(X)
tensor([[[[ 5.,  7.],
          [13., 15.]]]])

3、多个通道

       在处理多通道输入数据时,池化层在每个输入通道上单独运算,而不是像卷积层一样在通道上对输入进行汇总。这意味着池化层的输出通道数与输入通道数相同。下面,我们将在通道维度上连结张量`X`和`X + 1`,以构建具有2个通道的输入。

X = torch.cat((X, X + 1), 1)    # 在通道维度叠加,因此是1
print(X)
print(X.shape)
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.]]]])
torch.Size([1, 2, 4, 4])

       如下所示,池化后输出通道的数量仍然是2。

pool2d = nn.MaxPool2d(3, padding=1, stride=2)
print(pool2d(X))
print(X.shape)
tensor([[[[ 5.,  7.],
          [13., 15.]],

         [[ 6.,  8.],
          [14., 16.]]]])
torch.Size([1, 2, 4, 4])

4、总结

  • 最大池化层会输出该窗口内的最大值,平均池化层会输出该窗口内的平均值。
  • 池化层的主要优点之一是减轻卷积层对位置的过度敏感。
  • 我们可以指定池化层的填充和步幅。
  • 使用最大池化层以及大于1的步幅,可减少空间维度(如高度和宽度)。
  • 池化层的输出通道数与输入通道数相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/267794.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——LeetCode888

方法一 个人方法: 交换后要达到相同的数量,那么意味着这个相同的数量就是两个人总数的平均值,假设A总共有4个,B总共有8个,那么最后两个人都要达到6个,如果A的第一盒糖果只有1个,那么B就要给出6…

祝福各位CSDN的小伙伴圣诞快乐

1.源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>圣诞树&#x1f384;</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/n…

分布式事务2PC二阶段提交详解

文章目录 概述和概念执行过程和工作流程特点优劣势应用场景总结demo代码样例 概述和概念 二阶段提交&#xff08;2PC&#xff09;是一种用于确保在分布式系统中的所有节点在进行事务提交时保持一致性的算法 二阶段提交&#xff08;Two-Phase Commit&#xff0c;2PC&#xff09…

身为Java“搬砖”程序员,你掌握了多线程吗?

摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流量洪峰&#xff0c;背后都离不开多线程技术的支持。在数字化转型的过程中&#xff0c;高并发、高性能是衡量系统性能的核心指…

做到这两条,破解35岁中年危机

最近我在看吴军老师的《富足》这本书&#xff0c;其中有一篇文章讲的是如何破解35岁中年危机&#xff0c;我觉得讲清楚了这个问题的本质&#xff0c;我在这里分享给你&#xff0c;以下内容大部分摘抄自《破解35岁中年危机》一章。 35岁中年危机的原因 35岁中年危机的说法好像…

Navicat for mysql备份与恢复

文章目录 一、Navicat for mysql备份1.打开navicat&#xff0c;找到备份2.点击新建备份&#xff0c;直接点备份3.备份完成 二、恢复数据1.删除表2.点击备份&#xff0c;选中备份文件&#xff0c;点击还原备份3.还原完成 三、其他命令四、视频演示总结 一、Navicat for mysql备份…

ZLMediaKit中的RingBuffer

前面的文章讲到ZLMediaKit转流&#xff0c;提到过RingBuffer&#xff0c;它是比较核心的数据结构。这篇文章就来讲讲RingBuffer的用法。 RingBuffer的类体系 RingBuffer是由多个类组成&#xff0c;分为两大功能&#xff1a;存储和数据分发。 存储功能由类RingStorage实现&…

图形图像处理车牌识别系统设计matlab

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;车牌识别 获取完整源码源文件论文报告 一、 摘要: 随这图形图像技术的发展&#xff0c;现在的车牌识别技术准确率越来越高&#xff0c;识别速度越来越快。无论何种形式的车牌识别系统&#xff0c;它们都是由触发、图像采…

【JavaWeb学习笔记】15 - jQuery

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/jquery 目录 零、官方文档 一、jQuery基本介绍 1.基本介绍 2.原理图 二、JQuery入门使用 1.下载JQuery 2.jQuery快速入门 三、jQuery对象 1.什么是jQuery对象? 2.DOM对象转换成jQuery对象 …

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。…

2008-2021年商业银行数据(农商行、城商行、国有行、股份制银行)

2008-2021年商业银行数据&#xff08;农商行、城商行、国有行、股份制银行&#xff09; 1、时间&#xff1a;2008-2021年 2、范围&#xff1a;1700银行 3 、指标&#xff1a;证券简称、year、证券代码、资产总计、负债合计、所有者权益合计、利润总额、净利润、贷款总额、存…

【六大排序详解】中篇 :选择排序 与 堆排序

选择排序 与 堆排序 选择排序 选择排序 与 堆排序1 选择排序1.1 选择排序原理1.2 排序步骤1.3 代码实现 2 堆排序2.1 堆排序原理2.1.1 大堆与小堆2.1.2 向上调整算法2.1.3 向下调整算法 2.2 排序步骤2.3 代码实现 3 时间复杂度分析 Thanks♪(&#xff65;ω&#xff65;)&#…

你真的理解了阻塞和非阻塞、同步和异步吗?

阻塞和非阻塞是一种状态&#xff0c;关键要看调用线程有没有被挂起。以处理I/O为例&#xff0c;如果是调用线程处理阻塞型I/O&#xff0c;那么调用线程会被挂起&#xff0c;此时调用线程就是阻塞的&#xff1b;如果调用线程处理的是非阻塞I/O&#xff0c;调用线程开启了I/O之后…

【Spring】15 MessageSourceAware 接口

文章目录 1. 简介2. 功能3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 资源文件3.4 创建启动类3.5 启动 4. 应用场景总结 Spring 框架为开发者提供了丰富的扩展点&#xff0c;其中之一是 Bean 生命周期中的回调接口。本文将专注介绍一个与国际化相关的接口 MessageSourceAw…

运筹视角下,体系化学习机器学习算法原理的实践和总结

文章目录 引言目标设计目标实践文章汇总经验总结一则预告 引言 上两周总结了我在体系化学习运筹学基础知识方面的个人经验&#xff0c;看过那篇文章的人可能知道&#xff0c;今年我还花了很多时间学习机器学习中各种模型的算法原理。 在工业应用中&#xff0c;机器学习和运筹…

Spark中使用scala完成数据抽取任务 -- 总结

如题 任务二&#xff1a;离线数据处理&#xff0c;校赛题目需要使用spark框架将mysql数据库中ds_db01数据库的user_info表的内容抽取到Hive库的user_info表中&#xff0c;并且添加一个字段设置字段的格式 第二个任务和第一个的内容几乎一样。 在该任务中主要需要完成以下几个阶…

【python】python课设 天气预测数据分析及可视化(完整源码)

目录 1. 前言2. 项目结构3. 详细介绍3.1 main.py3.2 GetModel.py3.3 GetData.py3.4 ProcessData.py3.5天气网.html 4. 成果展示 1. 前言 本文介绍了天气预测数据分析及可视化的实现过程使用joblib导入模型和自定义模块GetModel获取模型&#xff0c;输出模型的MAE。使用pyechart…

鸿蒙应用开发 自定义下拉刷新动画

1 概述 属性动画&#xff0c;是最为基础的动画&#xff0c;其功能强大、使用场景多&#xff0c;应用范围较广。常用于如下场景中&#xff1a; 一、页面布局发生变化。例如添加、删除部分组件元素。二、页面元素的可见性和位置发生变化。例如显示或者隐藏部分元素&#xff0c;…

基于 Webpack 插件体系的 Mock 服务

背景 在软件研发流程中&#xff0c;对于前后端分离的架构体系而言&#xff0c;为了能够更快速、高效的实现功能的开发&#xff0c;研发团队通常来说会在产品原型阶段对前后端联调的数据接口进行结构设计及约定&#xff0c;进而可以分别同步进行对应功能的实现&#xff0c;提升研…

LINUX系统安装和管理

目录 一.应用程序 对比应用程序与系统命令的关系 典型应用程序的目录结构 常见的软件包装类型 二.RPM软件包管理 1.RPM是什么&#xff1f; 2.RPM命令的格式 查看已安装的软件包格式 查看未安装的软件包 3.RPM安装包从哪里来&#xff1f; 4.挂载的定义 挂载命令moun…