深度学习------------池化层

news2024/12/27 11:44:05

目录

  • 池化层
    • 二维最大池化
    • 填充、步幅和多个通道
    • 平均池化层
  • 总结
  • 池化层的代码部分
    • 实现池化层的正向传播
    • 验证二维最大池化层的输出
      • 该部分总代码
    • 验证平均池化层
      • 该部分总代码
    • 填充和步幅
    • 深度学习框架中的步幅与池化窗口的大小相同
      • 该部分总代码
    • 填充和步幅可以手动设定
      • 该部分总代码
    • 自定义池化窗口、填充、步幅
      • 该部分总代码
    • 多个通道
      • 该部分总代码
    • 池化后输出通道数量不变(输入=输出)
      • 该部分总代码
  • 小结
  • 问题

池化层

    ①二维卷积层可以帮助我们检测图像物体边缘

    ②无论是原始图片,还是经过卷积核处理的中间特征,都是基于像素的基础进行的数学运算。

    ③实际图像里,我们感兴趣的物体不会总出现在固定像素位置:即使我们用三脚架固定相机去连续拍摄同一个物体也极有可能出现像素位置上的偏移。

    ④绝大多数计算机视觉任务对图像处理终极目标识别图片内的物体,所以不需要细致到对每个像素进行检测,只需要找到图片中物体的大概轮廓就好了。

    ⑤池化层可以缓解卷积层对位置的过度敏感性



如下所示,例如1X2的卷积核[1,-1],会使得下图中Y输出的第二列为1,其他为0,如果像素偏移,会导致边缘检测的1在其他位置输出,所以说卷积对像素的位置是非常敏感的。

这里本质上讲的是池化层对于像素偏移的容忍性。

在这里插入图片描述




二维最大池化

2×2的池化窗口

在这里插入图片描述
跟卷积一样,用滑动窗口来计算输出,但没有进行求和而是其中的最大值
在这里插入图片描述

在这里插入图片描述


返回滑动窗口的最大值

输入:进行边缘检测
在这里插入图片描述
卷积输出

在这里插入图片描述
2×2最大池化(可容1像素移位)
在这里插入图片描述




填充、步幅和多个通道

    ①池化层与卷积层类似,都具有填充和步幅。(填充上下左右都是1)
    ②没有可学习的参数。
    ③在每个输入通道应用池化层以获得相应的输出通道(不像卷积一样可以融合多个通道)
    ④输出通道数=输入通道数




平均池化层

最大池化层:每个窗口中最强的模式信号。

平均池化层:将最大池化层中的“最大”操作替换“平均

在这里插入图片描述




总结

    ①池化层返回窗口中最大或平均值

    ②缓解卷积层对位置的敏感性

    ③同样有窗口大小、填充和步幅作为超参数




池化层的代码部分

实现池化层的正向传播

import torch
from torch import nn
from d2l import torch as d2l
# X:输入的特征图,pool_size:池化窗口的大小,以及mode(池化模式,默认为'max'
def pool2d(X, pool_size, mode='max'):
	# 池化窗口的高度和宽度
    p_h, p_w = pool_size
    # 根据输入特征图X的形状和池化窗口的大小计算得出Y的形状
    Y = torch.zeros((X.shape[0] - p_h + 1, X.shape[1] - p_w + 1))
    # 遍历输出特征图Y的每一个位置(i, j)
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            if mode == 'max':
            	# 判断池化模式是否为'max'。如果是,就在输入特征图X上对应的池化窗口内执行最大池化操作,并将最大值赋值给Y[i, j]
                Y[i, j] = X[i: i + p_h, j: j + p_w].max()
            elif mode == 'avg':
            	# 判断池化模式是否为'avg'。如果是,就在输入特征图X上对应的池化窗口内执行平均池化操作,并将平均值赋值给Y[i, j]。
                Y[i, j] = X[i: i + p_h, j: j + p_w].mean()
    return Y

解释一下:(X.shape[0] - p_h + 1, X.shape[1] - p_w + 1)
这是一个输入特征图,即X,它是4×5的形状
在这里插入图片描述
这里
    X.shape[0]=4
    X.shape[1]=5
    p_h=p_w=2

∴这里的Y的形状是3×4的形状,(然后代码中是对Y进行一个全零的初始化。)
在这里插入图片描述


验证二维最大池化层的输出

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

输出:
在这里插入图片描述


该部分总代码

import torch


# X:输入的特征图,pool_size:池化窗口的大小,以及mode(池化模式,默认为'max'
def pool2d(X, pool_size, mode='max'):
    # 池化窗口的高度和宽度
    p_h, p_w = pool_size
    # 根据输入特征图X的形状和池化窗口的大小计算得出Y的形状
    Y = torch.zeros((X.shape[0] - p_h + 1, X.shape[1] - p_w + 1))
    # 遍历输出特征图Y的每一个位置(i, j)
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            if mode == 'max':
                # 判断池化模式是否为'max'。如果是,就在输入特征图X上对应的池化窗口内执行最大池化操作,并将最大值赋值给Y[i, j]
                Y[i, j] = X[i: i + p_h, j: j + p_w].max()
            elif mode == 'avg':
                # 判断池化模式是否为'avg'。如果是,就在输入特征图X上对应的池化窗口内执行平均池化操作,并将平均值赋值给Y[i, j]。
                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(pool2d(X, (2, 2)))




验证平均池化层

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

输出:

在这里插入图片描述

该部分总代码

import torch


# X:输入的特征图,pool_size:池化窗口的大小,以及mode(池化模式,默认为'max'
def pool2d(X, pool_size, mode='max'):
    # 池化窗口的高度和宽度
    p_h, p_w = pool_size
    # 根据输入特征图X的形状和池化窗口的大小计算得出Y的形状
    Y = torch.zeros((X.shape[0] - p_h + 1, X.shape[1] - p_w + 1))
    # 遍历输出特征图Y的每一个位置(i, j)
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            if mode == 'max':
                # 判断池化模式是否为'max'。如果是,就在输入特征图X上对应的池化窗口内执行最大池化操作,并将最大值赋值给Y[i, j]
                Y[i, j] = X[i: i + p_h, j: j + p_w].max()
            elif mode == 'avg':
                # 判断池化模式是否为'avg'。如果是,就在输入特征图X上对应的池化窗口内执行平均池化操作,并将平均值赋值给Y[i, j]。
                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(pool2d(X, (2, 2), 'avg'))




填充和步幅

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

# 样本数和通道数都是1,高度和宽度都是4
X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4))
print(X)

输出:
在这里插入图片描述




深度学习框架中的步幅与池化窗口的大小相同

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

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

结果:

在这里插入图片描述

在这里插入图片描述

该部分总代码

import torch
from torch import nn

X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4))
pool2d = nn.MaxPool2d(3)
print(pool2d(X))



填充和步幅可以手动设定

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

结果:
在这里插入图片描述

该部分总代码

import torch
from torch import nn

X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4))
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
print(pool2d(X))



自定义池化窗口、填充、步幅

设定一个任意大小的矩形池化窗口,并分别设定填充步幅的高度和宽度

# 池化窗口的大小,高度为2,宽度为3
pool2d = nn.MaxPool2d((2, 3), padding=(1, 1), stride=(2, 3))
print(pool2d(X))

结果:
在这里插入图片描述

该部分总代码

import torch
from torch import nn

X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4))
# 池化窗口的大小,高度为2,宽度为3
pool2d = nn.MaxPool2d((2, 3), padding=(1, 1), stride=(2, 3))
print(pool2d(X))



多个通道

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

# 创建了一个与 X 形状相同的新张量X+1,将 X 和 X + 1 这两个张量沿着它们的第二个维度(索引为1的维度,记住索引是从0开始的)拼接起来。形成一个新的张量。
X = torch.cat((X, X + 1), 1)
print(X)

结果:
在这里插入图片描述

假设 X 是一个形状为 (N, C, H, W) 的四维张量
    N 是批量大小(batch size)
    C 是通道数(channel)
    H 是高度(height)
    W 是宽度(width)
执行 torch.cat((X, X + 1), 1) 后,结果张量的形状将是 (N, 2*C, H, W)。这是因为在第二个维度(即通道维度)上,我们将 X 和 X + 1 拼接了起来,所以通道数从 C 变成了 2×C。

stack是增加维度(即:stack是升维拼接)
cat是在当前维度上连接(cat是等维拼接)

该部分总代码

import torch

X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4))
X = torch.cat((X, X + 1), 1)
print(X)



池化后输出通道数量不变(输入=输出)

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

结果:
在这里插入图片描述

该部分总代码

import torch
from torch import nn

X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4))
X = torch.cat((X, X + 1), 1)
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
print(pool2d(X))




小结

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




问题

①池化层一般是放在卷积后面吗?
一般放在后面,因为使卷积层不那么对位置敏感。

②为什么Padding里面用的是一个元组?
因为Padding里面是有个高和宽的,是2D的形状。假设一个值的话,即它的高和宽都是这个值。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

adb查看当前运行的应用的包名和Activity(模拟器也可以)

adb查看当前运行的应用的包名和Activity(模拟器也可以) 在adb 中,输入命令:adb shell 进入adb模式 adb shell dumpsys window w |findstr / |findstr name 输入完成后会显示当前运行的应用的包名和Activity(模拟器也可以) 例如抖音 ** **

布隆过滤器--极致的速度

前言 上一篇博客提到了位图,位图是十分高效的数据结构,但可惜的是只支持整型,今天这篇博客的主角是布隆过滤器,他与位图有异曲同工之妙。(不了解位图可以点击下面这篇博客快速了解)位图(bitse…

【初阶数据结构】链表(附题)

目录 一、顺序表的问题及思考 二、单链表 2.1链表的概念及结构 2.2.单链表的实现 2.2.1.节点的定义 2.2.2.链表的打印 2.2.3.头部插入删除/尾部插入删除 a.创建节点 b.尾插 c.头插 d.尾删 e.头删 2.2.4.查找数据 2.2.5.在指定位置之前插入数据 2.2.6删除pos节点 …

rabbitmq镜像集群搭建

用到的ip地址 ip地址端口192.168.101.65(主)15672192.168.101.7515672192.168.101.8515672 安装erlang和rabbitmq 安装 安装三个包 yum install esl-erlang_23.0-1_centos_7_amd64.rpm -y yum install esl-erlang-compat-18.1-1.noarch.rpm -y rpm -…

联想电脑如何查看ip地址?详细介绍几种方法

随着互联网的普及和技术的飞速发展,IP地址已成为我们日常网络活动中不可或缺的一部分。无论是访问网站、远程办公还是进行网络游戏,IP地址都扮演着重要的角色。对于联想电脑用户来说,了解如何查看自己的IP地址是一项基本技能。虎观代理小二将…

leetcode 2221.数组的三角和

1.题目要求: 给你一个下标从 0 开始的整数数组 nums ,其中 nums[i] 是 0 到 9 之间(两者都包含)的一个数字。nums 的 三角和 是执行以下操作以后最后剩下元素的值:nums 初始包含 n 个元素。如果 n 1 ,终止 操作。否则…

拯救者杯OPENAIGC开发者大赛今日迎来决赛,现场179支参赛团队角逐AI桂冠

2024拯救者杯OPENAIGC开发者大赛于今日(8月17日)在上海中庚聚龙酒店迎来精彩决赛! 创未来AI应用赛 拯救姬AI创意赛 AI Agent极限挑战赛 三大赛道决战巅峰 37位行业大咖评审 企业&高校179支顶尖开发团队同台竞技 挑战赛33支团队现场…

golang(gin框架)结合前端h5用户注册(演示版)

1、在宝塔上软件商店安装:GO语言版本管理器; 2、把本地文件上传到服务器端; 3、 4、 Go 语言官方提供了一个适合中国大陆用户使用的模块代理 goproxy.cn。你可以配置 Go 使用这个代理,具体操作如下: 临时设置代理…

【Verilog-CBB】开发与验证(5)——RS后向打拍器

引言 接上篇,完成了RS前向打拍器的CBB设计。RS后向打拍器的设计则主要是为了缓解ready信号的时序问题。后向打拍器是对ready以及数据信号进行寄存。 RS后向打拍器的设计逻辑是这样的,复位时,ready缓存器(深度为1)对上…

栈与递归——385、341、394

385. 迷你语法分析器(中等) 给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger 。 列表中的每个元素只可能是整数或整数嵌套列表 示例 1: 输入:s "324", 输出:324 解释…

8个Python实用技巧,让你的代码效率飞起来

想要成为一名Python编程高手,不仅需要掌握语言的基础知识,还需要了解一些高效编程的技巧。 一、列表推导式 列表推导式是Python中一种快速生成列表的方法,相比传统的循环方式,代码更简洁、更高效。 # 使用列表推导式生成0到9的平…

vuex刷新数据丢失解决方式(插件)

1、下载插件 npm install vuex-persistedstate --save2、引入即可 import Vue from vue import Vuex from vuex import createPersistedState from vuex-persistedstate Vue.use(Vuex)const store new Vuex.Store({state: {login: null},mutations: {setlogin(state, login) …

总结HashMap, HashTable, ConcurrentHashMap 之间的区别

HashMap, HashTable, ConcurrentHashMap都是使用同一种数据结构(数组链表); HashMap多线程状态下是不安全的;HashTable和ConcurrentHashMap是在HashMap的基本的数据结构上进行优化,使他们在多线程下是安全的&#xff…

24/8/17算法笔记 AC算法

AC算法通常指的是Actor-Critic(演员-评论家)算法,它是强化学习中的一种算法框架,用于解决代理(agent)在环境中的决策问题。Actor-Critic方法结合了价值估计和策略优化,通常比纯粹的价值迭代或策…

Nginx 配置文件中 location、proxy_pass最后的斜杠/作用

1.搭建一个简单的sprigbootthymeleaf项目 写个controller RequestMapping("/login") public String toLogin() {return "login"; } 写一个login.html页面 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org"> <head&…

瑞吉外卖后续笔记

Git学习 下载地址 Githttps://git-scm.com/ 常用的git代码托管服务 git常用命令 Git 全局设置: git config --global user.name "刘某人" git config --global user.email "邮箱号" 查看配置 git config --list git add 文件名 添加到暂冲区 git a…

SpringBoot--05--整合WebSocket,实现全双工通信

文章目录 为什么需要websocket项目中使用websocket导入maven坐标编写配置类server代码前端代码和http请求URL区别 为什么需要websocket 传统的HTTP协议是单向通信的&#xff0c;支持客户端向服务器发送请求&#xff0c;服务器接收请求。但是服务器有时也要向客户端发送请求。 …

万能视频播放器PotPlayer

软件介绍 PotPlayer播放器是一款全能 多媒体 影音播放器,堪称Windows平台最强大的本地 视频播放器. PotPlayer最新版拥有强劲播放引擎加速,支持DXVA,CUDA,QuickSync,多媒体播放器支持蓝光3D,其内置强大的编码器及滤镜/分离器。 支持自定义添加解码器,对字幕的支持非常优秀,能…

基于CST的特征模天线设计

前言&#xff1a; 特征模理论是在矩量法基础上发展而来的适用于各种电磁辐射和散射问题分析的理论&#xff0c;它有效综合了这两类方法的长处且克服了它们的不足&#xff0c;不仅可以通过明确的物理含义来直观深刻地揭示天线的工作原理&#xff0c;而且能求解任意辐射结构的复…

谷粒商城实战笔记-193~194-商城业务-多线程-线程池

文章目录 一&#xff0c;193-商城业务-异步-异步复习1. 继承Thread类2. 实现Runnable接口3. 实现Callable接口结合FutureTask4. 使用线程池 二&#xff0c;194-商城业务-异步-线程池详解1&#xff0c;线程池七大参数2&#xff0c;面试题3&#xff0c;Executors能创建的4中线程池…