【卷积神经网络】池化层【计算和python代码】

news2024/12/23 10:12:52

文章目录

  • 1、简介
  • 2、池化层计算
  • 3、Stride
  • 4、Padding
  • 5、多通道池化计算
  • 6、数学公式⭐
  • 7、PyTorch 池化 API 使用
    • 7.1、形状调整
    • 7.2、最大和平均池化
    • 7.3、调整stride步长
    • 7.4、padding填充
    • 7.5、多通道池化
    • 7.6、完整代码⭐
  • 8、小结

🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎人工智能和前端开发。
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹

1、简介

卷积层复习链接:https://xzl-tech.blog.csdn.net/article/details/140861325

池化层(Pooling Layer)是卷积神经网络(CNN)中的一种常用操作,用于减少特征图的尺寸,同时保留重要的空间信息。常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。
池化层的作用:

  1. 降维:通过池化操作,可以减少特征图的尺寸,从而降低计算量和存储需求。
  2. 防止过拟合:通过降维和降噪,池化层可以减少模型的复杂度,有助于防止过拟合。
  3. 不变性:池化操作可以引入平移不变性,即特征的位置轻微变化不会影响最终的分类结果。

最大池化和平均池化:

  • 最大池化(Max Pooling):从池化窗口中选择最大值。
  • 平均池化(Average Pooling):从池化窗口中计算平均值。

总结:

池化层 (Pooling) 降低维度,缩减模型大小,提高计算速度。
即:主要对卷积层学习到的特征图进行下采样(SubSampling)处理

2、池化层计算

image.png
最大池化:

  1. max(0, 1, 3, 4)
  2. max(1, 2, 4, 5)
  3. max(3, 4, 6, 7)
  4. max(4, 5, 7, 8)

image.png
平均池化:

  1. mean(0, 1, 3, 4)
  2. mean(1, 2, 4, 5)
  3. mean(3, 4, 6, 7)
  4. mean(4, 5, 7, 8)

3、Stride

image.png
最大池化:

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

image.png
平均池化:

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

4、Padding

image.png
最大池化:

  1. max(0, 0, 0, 0)
  2. max(0, 0, 0, 1)
  3. max(0, 0, 1, 2)
  4. max(0, 0, 2, 0)
  5. … 以此类推

image.png
平均池化:

  1. mean(0, 0, 0, 0)
  2. mean(0, 0, 0, 1)
  3. mean(0, 0, 1, 2)
  4. mean(0, 0, 2, 0)
  5. … 以此类推

5、多通道池化计算

在处理多通道输入数据时,池化层对每个输入通道分别池化,而不是像卷积层那样将各个通道的输入相加。这意味着池化层的输出和输入的通道数是相等。
image.png

6、数学公式⭐

池化层的计算涉及池化窗口的大小、步幅和填充方式。下面是池化层计算的公式和示例。
假设输入特征图的尺寸为 H × W H \times W H×W,池化窗口的大小为 F × F F \times F F×F,步幅为 S S S,填充为 P P P,则输出特征图的大小为 H out × W out H_{\text{out}} \times W_{\text{out}} Hout×Wout,计算公式如下:
H out = ⌊ H − F + 2 P S ⌋ + 1 H_{\text{out}} = \left\lfloor \frac{H - F + 2P}{S} \right\rfloor + 1 Hout=SHF+2P+1
W out = ⌊ W − F + 2 P S ⌋ + 1 W_{\text{out}} = \left\lfloor \frac{W - F + 2P}{S} \right\rfloor + 1 Wout=SWF+2P+1
示例:
假设输入特征图的大小为 6 × 6 6 \times 6 6×6,池化窗口的大小为 2 × 2 2 \times 2 2×2,步幅为 2 2 2,没有填充(即 P = 0 P=0 P=0)。则输出特征图的大小计算如下:
H out = ⌊ 6 − 2 + 2 ⋅ 0 2 ⌋ + 1 = ⌊ 4 2 ⌋ + 1 = 3 H_{\text{out}} = \left\lfloor \frac{6 - 2 + 2 \cdot 0}{2} \right\rfloor + 1 = \left\lfloor \frac{4}{2} \right\rfloor + 1 = 3 Hout=262+20+1=24+1=3
W out = ⌊ 6 − 2 + 2 ⋅ 0 2 ⌋ + 1 = ⌊ 4 2 ⌋ + 1 = 3 W_{\text{out}} = \left\lfloor \frac{6 - 2 + 2 \cdot 0}{2} \right\rfloor + 1 = \left\lfloor \frac{4}{2} \right\rfloor + 1 = 3 Wout=262+20+1=24+1=3
所以输出特征图的大小为 3 × 3 3 \times 3 3×3

7、PyTorch 池化 API 使用

7.1、形状调整

image.png
调整后的张量形状为 (N, C, H, W),其中:

  • N 表示批次大小(Batch Size),这里是 1。
  • C 表示通道数(Channels),这里是 1。
  • H 表示高度(Height),这里是 3。
  • W 表示宽度(Width),这里是 3。

为什么要进行这些调整?
在深度学习中,卷积层和池化层通常期望输入的张量形状为 (N, C, H, W),以便能够处理批次和通道。
因此,我们需要将输入张量调整为适当的形状,以便将其输入到卷积层或池化层中进行处理。

7.2、最大和平均池化

代码:
image.png
输出:

"C:\Program Files\Python39\python.exe" D:\Python\AI\神经网络\14、池化层.py 
tensor([[[[4., 5.],
          [7., 8.]]]])
tensor([[[[2., 3.],
          [5., 6.]]]])

Process finished with exit code 0

7.3、调整stride步长

代码:
image.png
输出:

"C:\Program Files\Python39\python.exe" D:\Python\AI\神经网络\14、池化层.py 
tensor([[[[ 5.,  7.],
          [13., 15.]]]])
tensor([[[[ 2.5000,  4.5000],
          [10.5000, 12.5000]]]])

Process finished with exit code 0

7.4、padding填充

代码:
image.png
输出:

"C:\Program Files\Python39\python.exe" D:\Python\AI\神经网络\14、池化层.py 
tensor([[[[0., 1., 2., 2.],
          [3., 4., 5., 5.],
          [6., 7., 8., 8.],
          [6., 7., 8., 8.]]]])
tensor([[[[0.0000, 0.2500, 0.7500, 0.5000],
          [0.7500, 2.0000, 3.0000, 1.7500],
          [2.2500, 5.0000, 6.0000, 3.2500],
          [1.5000, 3.2500, 3.7500, 2.0000]]]])

Process finished with exit code 0

7.5、多通道池化

代码:
image.png
输出:

"C:\Program Files\Python39\python.exe" D:\Python\AI\神经网络\14、池化层.py 
tensor([[[[ 4.,  5.],
          [ 7.,  8.]],

         [[50., 60.],
          [80., 90.]],

         [[55., 66.],
          [88., 99.]]]])

Process finished with exit code 0

7.6、完整代码⭐

代码即注释:

# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/8/2 3:42
import torch  # 导入 PyTorch 库,用于深度学习
import torch.nn as nn  # 导入 PyTorch 的神经网络模块


# 1. API 基本使用
def test01():
    # TODO 创建一个 3x3 的张量并转换为浮点类型
    inputs = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]).float()
    # TODO 调整张量形状为 (N, C, H, W),即 (1, 1, 3, 3)
    inputs = inputs.unsqueeze(0).unsqueeze(0)
    # TODO 1. 最大池化
    # 定义一个最大池化层,池化窗口大小为 2x2,步幅为 1,没有填充
    polling = nn.MaxPool2d(kernel_size=2, stride=1, padding=0)
    # 执行最大池化操作
    output = polling(inputs)
    # 输出池化结果
    print(output)
    # TODO 2. 平均池化
    # 定义一个平均池化层,池化窗口大小为 2x2,步幅为 1,没有填充
    polling = nn.AvgPool2d(kernel_size=2, stride=1, padding=0)
    # 执行平均池化操作
    output = polling(inputs)
    # 输出池化结果
    print(output)


# 2. stride 步长
def test02():
    # TODO 创建一个 4x4 的张量并转换为浮点类型
    inputs = torch.tensor([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]).float()
    # TODO 调整张量形状为 (N, C, H, W),即 (1, 1, 4, 4)
    inputs = inputs.unsqueeze(0).unsqueeze(0)
    # TODO 1. 最大池化
    # 定义一个最大池化层,池化窗口大小为 2x2,步幅为 2,没有填充
    polling = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
    # 执行最大池化操作
    output = polling(inputs)
    # 输出池化结果
    print(output)
    # TODO 2. 平均池化
    # 定义一个平均池化层,池化窗口大小为 2x2,步幅为 2,没有填充
    polling = nn.AvgPool2d(kernel_size=2, stride=2, padding=0)
    # 执行平均池化操作
    output = polling(inputs)
    # 输出池化结果
    print(output)


# 3. padding 填充
def test03():
    # TODO 创建一个 3x3 的张量并转换为浮点类型
    inputs = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]).float()
    # TODO 调整张量形状为 (N, C, H, W),即 (1, 1, 3, 3)
    inputs = inputs.unsqueeze(0).unsqueeze(0)
    # TODO 1. 最大池化
    # 定义一个最大池化层,池化窗口大小为 2x2,步幅为 1,填充为 1
    polling = nn.MaxPool2d(kernel_size=2, stride=1, padding=1)
    # 执行最大池化操作
    output = polling(inputs)
    # 输出池化结果
    print(output)
    # TODO 2. 平均池化
    # 定义一个平均池化层,池化窗口大小为 2x2,步幅为 1,填充为 1
    polling = nn.AvgPool2d(kernel_size=2, stride=1, padding=1)
    # 执行平均池化操作
    output = polling(inputs)
    # 输出池化结果
    print(output)


# 4. 多通道池化
def test04():
    # TODO 创建一个 3x3x3 的张量并转换为浮点类型
    inputs = torch.tensor([[[0, 1, 2], [3, 4, 5], [6, 7, 8]],
                           [[10, 20, 30], [40, 50, 60], [70, 80, 90]],
                           [[11, 22, 33], [44, 55, 66], [77, 88, 99]]]).float()
    # TODO 调整张量形状为 (N, C, H, W),即 (1, 3, 3, 3)
    inputs = inputs.unsqueeze(0)
    # TODO 最大池化
    # 定义一个最大池化层,池化窗口大小为 2x2,步幅为 1,没有填充
    polling = nn.MaxPool2d(kernel_size=2, stride=1, padding=0)
    # 执行最大池化操作
    output = polling(inputs)
    # 输出池化结果
    print(output)


# 主程序入口
if __name__ == '__main__':
    test01()  # 运行最大池化测试
    test02()  # 运行平均池化测试
    test03()  # 运行填充测试
    test04()  # 运行多通道池化测试

8、小结

池化层主要用于减少数据的维度。
其主要分为:最大池化、平均池化
我们在进行图像分类任务时,可以使用最大池化

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

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

相关文章

[Docker][Docker NetWork][上]详细讲解

目录 1.为什么需要网络管理2.Docker 网络架构简介0.铺垫说明1.CNM2.Libnetwork3.驱动 3.常见网络类型1.bridge 网络2.host 网络3.container 网络4.none 网络5.overlay 网络 1.为什么需要网络管理 容器的网络默认与宿主机及其他容器都是相互隔离, 但同时也要考虑以下…

Node污染 (Node.js)

🎼个人主页:金灰 😎作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 🍊易编橙终身成长社群&#…

C语言指针(Pointer)

指针与底层硬件联系紧密,使用指针可操作数据的地址,实现数据的间接访问 问题:这好好的一个变量,我定义完之后为啥不用它名字直接访问呢?我非要用间接访问,这不没事找事吗? 为什么需要指针? …

18.C语言函数相关练习题2

函数相关练习题2 1.不同班级的平均分2.二维数组和函数的概念3.外部变量和全局变量4.全局变量的例子5.输入10个数&#xff0c;找出最大数及最大数的下标 1.不同班级的平均分 #include <stdio.h>void inityarry(int arr[],int len){int i;for(i0;i<len;i){printf("…

【第八天】DNS及其查询过程

DNS及其查询过程 什么是DNS&#xff1f; 一般我们的主机&#xff0c;服务器都有一个ip地址&#xff0c;例如10.10.10.1。在计算机层面&#xff0c;如果我们要发送请求的话&#xff0c;首先就要知道我们的目标&#xff0c;也就是对方的ip地址。而IP地址很难记&#xff0c;比如…

初学者编程指南:方法与资源推荐

一、引言 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&#xff1f;编程不仅是技术领域的一项基本技能&#…

H.264编码中的16x16宏块分析

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…

快速索引alarm添加

快速索引alarm添加 添加预警alarm 文件夹和 temp_led.c , temp_led.h , humi_led.c, humi_led.h (1)点击品字, 添加alarm, 然后增加文件, 点进Source文件夹 (2)点击新建文件夹, 然后新建alarm文件夹 (3)把文件类型切换为all, 方便后续右键添加上述四个文件名字. (4)空白处, 右…

社区团购的全流程解析与开源AI智能名片S2B2C商城小程序的应用探索

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;社区团购作为一种新兴的电商模式&#xff0c;凭借其高效、便捷、低成本的优势迅速崛起。本文旨在深入探讨社区团购的交易全流程&#xff0c;并以开源AI智能名片S2B2C商城小程序为例&#xff0c;分析其在社区团购中的创新应…

Nginx进阶-常见配置

一、nginx Proxy 反向代理 1、代理原理 反向代理产生的背景&#xff1a; 在计算机世界里&#xff0c;由于单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当用户的接入请求蜂拥而入时&#xff0c;会造成服务器忙不过来的局面&#xff0c…

计算机毕业设计选题推荐-预制菜平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

传输限速的方案那么多,却都没有这一个全面

在很多行业和领域&#xff0c;传输速度并不是无限制地越快越好&#xff0c;反而基于很多原因&#xff0c;在很多情况下&#xff0c;需要对传输的速度进行限制&#xff0c;原因如下&#xff1a; 带宽分配&#xff1a;在有限的网络资源下&#xff0c;对传输进行限速可以确保关键…

MIT-离散数学笔记

离散数学 PropositionEx 1:Ex 2:Ex 3:Ex 4:Ex 5:Ex 6:Ex 7:Ex 8: Proposition In mathematics, we have a mathematical proof is a verification of a proposition by a chain of logical deductions from a set of axioms. 在数学中&#xff0c;数学证明是通过一组公理的一系…

强化学习-alphazero 算法理论

一、算法简介 简单地说&#xff0c;AlphazeroMCTS SL(策略网络价值网络) Selfplay resnet。 其中MCTS指的是蒙特卡洛树搜索&#xff0c;主要用于记录所有访问过的棋盘状态的各种属性&#xff0c;包括该状态访问次数&#xff0c;对该状平均评价分数等。 SL指监督学习算法&…

PCDN技术如何提高数据传输的可靠性?

PCDN技术通过以下方式提高数据传输的可靠性: 1.负载均衡与故障转移: PCDN系统具备负载均衡的能力&#xff0c;可以根据节点的负载情况动态分配请求&#xff0c;避免单点故障和过载情况。此外&#xff0c;当某个节点发生故障时&#xff0c;PCDN可以迅速将流量转移到其他可用节…

OpenAI推出GPT-4o长输出版版本

&#x1f989; AI新闻 &#x1f680; OpenAI推出GPT-4o长输出版版本 摘要&#xff1a;OpenAI宣布正在测试每次请求可输出最多64K tokens的GPT-4o长输出版版本&#xff0c;目前仅Alpha测试参与者可使用。该版本推理成本较高&#xff0c;定价每百万tokens输入6美元&#xff0c;…

从微架构到向量化--CPU性能优化指北

引入 定位程序性能问题&#xff0c;相信大家都有很多很好的办法&#xff0c;比如用top/uptime观察负载和CPU使用率&#xff0c;用dstat/iostat观察io情况&#xff0c;ptrace/meminfo/vmstat观察内存、上下文切换和软硬中断等等&#xff0c;但是如果具体到CPU问题&#xff0c;我…

用于跟踪个人图书馆的BookLogr

什么是 BookLogr &#xff1f; BookLogr 是一款网络应用&#xff0c;旨在帮助您轻松管理个人图书馆。这项自托管服务可确保您完全控制数据&#xff0c;提供安全且私密的方式来跟踪您拥有、阅读或希望阅读的所有书籍。您也可以选择向公众自豪地展示您的图书馆&#xff0c;与您的…

申请流量卡不通过,这是什么原因呢,又该如何解决?

在申请流量卡时&#xff0c;有些人会出现被拒绝的情况&#xff0c;你知道这是怎么回事吗&#xff1f;申请流量卡被拒绝又该如何解决呢&#xff1f;下面这些问题都给你整理下了&#xff01; ​ 常见原因&#xff1a; 1.信息有误&#xff1a;收件人/办卡人&#xff1a;必须是同一…