百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

深度学习8. 池化的概念 池化运作是什么意思

ztj100 2024-12-18 18:20 55 浏览 0 评论

一、一些基本概念

1. 什么是池化

池化 (Pooling) 用来降低卷积神经网络(CNN)或循环神经网络(RNN)中的特征图(Feature Map)的维度。在卷积神经网络中,池化操作通常紧跟在卷积操作之后,用于降低特征图的空间大小。

池化操作的基本思想是将特征图划分为若干个子区域(一般为矩形),并对每个子区域进行统计汇总。池化操作的方式可以有很多种,比如最大池化(Max Pooling)、平均池化(Average Pooling)等。其中,最大池化操作会选取每个子区域内的最大值作为输出,而平均池化操作则会计算每个子区域内的平均值作为输出。

2. 池化的作用

通过池化操作,可以:

  1. 降低特征图的维度,减少网络中参数的数量,避免过拟合现象的发生,
  2. 提高模型的计算速度和运行效率。

3. 池化核大小

池化窗口的大小,在PyTorch里池化核大小可以是一个整数或者一个元组,例如 kernel_size=2 或者 kernel_size=(2, 3)。

  • 如果是一个整数,则表示高和宽方向上的池化窗口大小相同;
  • 如果是一个元组,则第一个元素表示高方向上的池化窗口大小,第二个元素表示宽方向上的池化窗口大小。

4. 步幅大小

用于指定池化窗口在高和宽方向上的步幅大小,可以是一个整数或者一个元组,例如 stride=2 或者 stride=(2, 3)。

  • 如果是一个整数,则表示高和宽方向上的步幅大小相同;
  • 如果是一个元组,则第一个元素表示高方向上的步幅大小,第二个元素表示宽方向上的步幅大小。

5. 填充

池化层的填充(padding)可以控制池化操作在特征图边缘的行为,使得池化后的输出特征图与输入特征图大小相同或相近。

在池化操作时,如果输入特征图的尺寸不能被池化窗口的大小整除,那么最后一列或者最后一行的部分像素就无法被包含在池化窗口中进行池化,因此池化后的输出特征图尺寸会减小。

通过在输入特征图的边缘添加填充,可以使得池化操作在边缘像素处进行池化,避免了信息的丢失,并且保持了输出特征图的大小与输入特征图相同或相近。同时,填充也可以增加模型的稳定性,减少过拟合的风险。

需要注意的是,池化层的填充和卷积层的填充有所不同:

  • 池化层的填充通常是指在输入特征图的边缘添加0值像素;
  • 卷积层的填充是指在输入特征图的边缘添加0值像素或者复制边缘像素。

PyTorch里的填充大小可以是一个整数或者一个元组,例如 padding=1 或者 padding=(1, 2)。

  • 如果是一个整数,则表示在高和宽方向上的填充大小相同;
  • 如果是一个元组,则第一个元素表示高方向上的填充大小,第二个元素表示宽方向上的填充大小。默认为 0,表示不进行填充。

二、最大池化

1. 最大池化运算示例

假设我们有一个 4×4 的原始数据矩阵:

现在要对其进行最大池化操作,则结果为:

其中6、8、14、16是原始矩阵中分子区域后每个子区域的最大值。类似的,平均池化就是每个子区域求平均值。

2. Python实现最大池化算法

import numpy as np


def max_pooling(data, pool_size):
    """
    Max pooling operation.

    Args:
        data: Original data matrix, shape (H, W).
        pool_size: Pooling kernel size, int or tuple of two ints.

    Returns:
        Pooled data matrix, shape (H', W').
    """
    # 判断池化核大小是否为整数,如果不是,则假设其为一个形如 (ph, pw) 的元组
    if isinstance(pool_size, int):
        pool_size = (pool_size, pool_size)
    h, w = data.shape
    ph, pw = pool_size
    oh = h // ph
    ow = w // pw
    # 计算池化后的矩阵大小,初始化一个全零矩阵 pooled
    pooled = np.zeros((oh, ow))
    # 遍历每个池化子区域,并对每个子区域取最大值,存入 pooled 矩阵中
    for i in range(oh):
        for j in range(ow):
            rstart, cstart = i * ph, j * pw
            rend, cend = rstart + ph, cstart + pw
            patch = data[rstart:rend, cstart:cend]
            pooled[i, j] = np.max(patch)
    return pooled


# 生成一个 4x4 的随机数据矩阵
data = np.random.rand(4, 4)
print("Original data:")
print(data)

# 对数据进行 2x2 的最大池化操作
pooled = max_pooling(data, 2)
print("Pooled data:")
print(pooled)

运行示例:

三、PyTorch中的池化函数

PyTorch中有多个池化函数,最常用的是: torch.nn.MaxPool2d,用于最大池化操作:

1. MaxPool2d参数

  • kernel_size:池化核大小;
  • stride:步幅大小;
  • padding:填充大小;
  • dilation:膨胀系数,用于指定池化核中各个元素之间的跨度,可以是一个整数或者一个元组,例如 dilation=2 或者 dilation=(2, 3)。如果是一个整数,则表示高和宽方向上的膨胀系数相同;如果是一个元组,则第一个元素表示高方向上的膨胀系数,第二个元素表示宽方向上的膨胀系数。默认为 1,表示不进行膨胀操作。
  • ceil_mode:是否使用 ceil 模式计算输出大小,如果设置为 True,则使用 ceil 模式计算输出大小;如果设置为 False,则使用 floor 模式计算输出大小。默认为 False。
  • return_indices:是否返回最大值的索引,如果设置为 True,则在输出张量中同时返回最大值的索引;如果设置为 False,则只返回最大值。默认为 False。
  • return_inverse:是否返回逆序操作,如果设置为 True,则在输出张量中同时返回逆序操作所需的索引;如果设置为 False,则不返回逆序操作所需的索引。默认为 False。

2. 简单调用示例

import torch

# 定义输入数据张量,大小为 (batch_size, channels, height, width)
input_tensor = torch.randn(2, 3, 16, 16)

# 定义最大池化层,kernel_size 为池化核大小,stride 为步幅
max_pool = torch.nn.MaxPool2d(kernel_size=2, stride=2)

# 对输入数据进行最大池化操作
output_tensor = max_pool(input_tensor)

# 输出池化后的结果张量大小
print(output_tensor.shape)

这个示例输入大小为 (2,3,16,16)的张量, 然后定义了一个最大池化层,池化操作以后,
最后输出的张量大小是: torch.Size([2, 3, 8, 8])

3. 对一个图片进行池化操作

下面代码使用前一节的卷积后的图片作为池化输入,代码示例:

import torch
from PIL import Image
from torchvision.transforms import ToTensor
from torchvision.transforms.functional import to_pil_image

# 读入示例图片并将其转换为 PyTorch 张量
img = Image.open('output.jpg')
img_tensor = ToTensor()(img)

# 定义 MaxPool2d 函数,进行池化操作
max_pool = torch.nn.MaxPool2d(kernel_size=2, stride=2)
img_pool = max_pool(img_tensor.unsqueeze(0)).squeeze(0)

# 将池化后的张量转换为 PIL 图像并保存
img_pool_pil = to_pil_image(img_pool)
img_pool_pil.save('example_pool.jpg')

读入示例图片:



最大池化后的结果:



池化后图形减少了很多。

4. 其它池化函数

1. AvgPool2d 平均池化函数

取池化窗口的平均值。

2. AdaptiveMaxPool2d

自适应最大池化函数,该函数可以根据输入的大小自动调整池化窗口的大小,输出指定大小的张量。

3. AdaptiveAvgPool2d

自适应平均池化函数。

相关推荐

SpringBoot整合SpringSecurity+JWT

作者|Sans_https://juejin.im/post/5da82f066fb9a04e2a73daec一.说明SpringSecurity是一个用于Java企业级应用程序的安全框架,主要包含...

「计算机毕设」一个精美的JAVA博客系统源码分享

前言大家好,我是程序员it分享师,今天给大家带来一个精美的博客系统源码!可以自己买一个便宜的云服务器,当自己的博客网站,记录一下自己学习的心得。开发技术博客系统源码基于SpringBoot,shiro...

springboot教务管理系统+微信小程序云开发附带源码

今天给大家分享的程序是基于springboot的管理,前端是小程序,系统非常的nice,不管是学习还是毕设都非常的靠谱。本系统主要分为pc端后台管理和微信小程序端,pc端有三个角色:管理员、学生、教师...

SpringBoot+LayUI后台管理系统开发脚手架

源码获取方式:关注,转发之后私信回复【源码】即可免费获取到!项目简介本项目本着避免重复造轮子的原则,建立一套快速开发JavaWEB项目(springboot-mini),能满足大部分后台管理系统基础开...

Spring Boot的Security安全控制——认识SpringSecurity!

SpringBoot的Security安全控制在Web项目开发中,安全控制是非常重要的,不同的人配置不同的权限,这样的系统才安全。最常见的权限框架有Shiro和SpringSecurity。Shi...

前同事2024年接私活已入百万,都是用这几个开源的SpringBoot项目

前言不得不佩服SpringBoot的生态如此强大,今天给大家推荐几款优秀的后台管理系统,小伙伴们再也不用从头到尾撸一个项目了。SmartAdmin...

值得学习的15 个优秀开源的 Spring Boot 学习项目

SpringBoot算是目前Java领域最火的技术栈了,除了书呢?当然就是开源项目了,今天整理15个开源领域非常不错的SpringBoot项目供大家学习,参考。高富帅的路上只能帮你到这里了,...

开发企业官网就用这个基于SpringBoot的CMS系统,真香

前言推荐这个项目是因为使用手册部署手册非常...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础...

jeecg-boot学习总结及使用心得(jeecgboot简单吗)

jeecg-boot学习总结及使用心得1.jeecg-boot是一个真正前后端分离的模版项目,便于二次开发,使用的都是较流行的新技术,后端技术主要有spring-boot2.x、shiro、Myb...

后勤集团原料管理系统springboot+Layui+MybatisPlus+Shiro源代码

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目描述后勤集团原料管理系统spr...

白卷开源SpringBoot+Vue的前后端分离入门项目

简介白卷是一个简单的前后端分离项目,主要采用Vue.js+SpringBoot技术栈开发。除了用作入门练习,作者还希望该项目可以作为一些常见Web项目的脚手架,帮助大家简化搭建网站的流程。...

Spring Security 自动踢掉前一个登录用户,一个配置搞定

登录成功后,自动踢掉前一个登录用户,松哥第一次见到这个功能,就是在扣扣里边见到的,当时觉得挺好玩的。自己做开发后,也遇到过一模一样的需求,正好最近的SpringSecurity系列正在连载,就结...

收藏起来!这款开源在线考试系统,我爱了

大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!今天小编推荐一款基于Spr...

Shiro框架:认证和授权原理(shiro权限认证流程)

优质文章,及时送达前言Shiro作为解决权限问题的常用框架,常用于解决认证、授权、加密、会话管理等场景。本文将对Shiro的认证和授权原理进行介绍:Shiro可以做什么?、Shiro是由什么组成的?举...

取消回复欢迎 发表评论: