当前位置: 首页 > news >正文

深度学习入门-10

基于小土堆学习

池化层学习

池化层(Pooling Layer)是卷积神经网络(CNN)中的一种重要组件,它的主要作用是逐步减小数据的空间尺寸(即高度和宽度),以减少网络中参数的数量和计算量,同时也有助于提取主要特征并减少过拟合的风险。

池化操作通常有以下几种类型:

  • 最大池化(Max Pooling):在输入数据的局部区域中取最大值作为该区域的池化结果。这种方法能够有效地提取出纹理等特征。

  • 平均池化(Average Pooling):计算输入数据局部区域的平均值,并将其作为该区域的池化结果。这种方法对于背景信息的保留较为有利。

  • 随机池化(Stochastic Pooling):按照数值大小赋予概率,再按照概率进行亚采样。这种方法在一定程度上能够避免过拟合。

  • 全局平均池化(Global Average Pooling):对于特征图的每个通道,都计算其所有像素的平均值,通常用于网络的最后几层,以将特征图转换为向量形式进行分类或其他任务。

池化层的主要优点包括:

  • 特征不变性:池化操作使得模型更加关注于特征是否存在,而不是特征的具体位置,这有助于提高模型的鲁棒性。
  • 特征降维:通过减小数据的空间尺寸,池化层能够显著降低后续网络层的计算量。
  • 防止过拟合:池化操作有助于减少模型参数的数量,从而降低过拟合的风险。
    总的来说,池化层在卷积神经网络中扮演着重要的角色,它不仅能够提高计算效率,还有助于提取更加鲁棒和有用的特征。

PyTorch框架中nn模块下的各种池化层(Pooling Layers)

列出了PyTorch框架中nn模块下的各种池化层(Pooling Layers)。这些池化层可以对输入信号进行不同维度的池化操作,包括一维(1D)、二维(2D)和三维(3D)的池化。每种池化层都有其特定的应用场景和优势。

  • nn.MaxPool1d、nn.MaxPool2d、nn.MaxPool3d:
    这些层分别应用一维、二维和三维的最大池化操作。最大池化是在局部区域中取最大值,有助于提取纹理等特征。nn.MaxPool2d最常用的。
  • nn.MaxUnpool1d、nn.MaxUnpool2d、nn.MaxUnpool3d:
    这些层分别计算一维、二维和三维最大池化的部分逆操作。它们通常用于需要恢复原始尺寸或进行特定类型特征提取的场景。
  • nn.AvgPool1d、nn.AvgPool2d、nn.AvgPool3d:
    这些层分别应用一维、二维和三维的平均池化操作。平均池化计算局部区域的平均值,有助于保留背景信息。
  • nn.FractionalMaxPool2d、nn.FractionalMaxPool3d:
    这些层分别应用二维和三维的分数最大池化操作。分数池化是一种更灵活的池化方式,可以在不减少特征图尺寸的情况下进行池化。
  • nn.LPPool1d、nn.LPPool2d、nn.LPPool3d:
    这些层分别应用一维、二维和三维的幂平均池化操作。幂平均池化是一种介于最大池化和平均池化之间的池化方式,通过调整幂参数可以控制池化的行为。
  • nn.AdaptiveMaxPool1d、nn.AdaptiveMaxPool2d、nn.AdaptiveMaxPool3d:
    这些层分别应用一维、二维和三维的自适应最大池化操作。自适应池化可以根据输出尺寸自动调整池化区域的大小。
  • nn.AdaptiveAvgPool1d、nn.AdaptiveAvgPool2d、nn.AdaptiveAvgPool3d:
    这些层分别应用一维、二维和三维的自适应平均池化操作。与自适应最大池化类似,自适应平均池化也可以根据输出尺寸自动调整池化区域的大小。
    总的来说,这些池化层提供了丰富的池化操作选项,可以根据不同的应用场景和需求选择合适的池化层。

MaxPool2d

在这里插入图片描述
torch.nn.MaxPool2d 是 PyTorch 中的一个类,用于对二维输入(例如图像)执行最大池化操作。这个类有多个参数,可以控制池化操作的具体行为。下面是对这些参数的详细解释:

  • kernel_size:池化窗口的大小。可以是一个整数,表示窗口的高度和宽度都是这个值;也可以是一个 (height, width) 元组,分别指定窗口的高度和宽度。

  • stride:池化窗口的步长。如果设置为 None,则默认步长等于窗口的大小。也可以是一个整数或 (height_stride, width_stride) 元组,分别指定窗口在垂直和水平方向上的步长。

  • padding:输入数据的填充大小。如果设置为 0,则不进行填充。也可以是一个整数或 (height_pad, width_pad) 元组,分别指定在输入数据的高度和宽度方向上的填充大小。

  • dilation:池化窗口的扩张大小。如果设置为 1,则表示窗口的相邻元素之间没有空隙。如果设置为大于 1 的整数,则表示窗口的相邻元素之间有扩张的空隙。卷卷积核中间有空洞。
    在这里插入图片描述

  • return_indices:如果设置为 True,则除了返回池化后的输出,还会返回每个最大值的索引。这对于某些特定的应用(如最大池化的逆操作)可能是有用的。

  • ceil_mode:如果设置为 True,则计算输出信号的大小时,会使用向上取整的方式,而不是默认的向下取整。这可能会影响输出的尺寸。
    torch.nn.MaxPool2d 类通常用于卷积神经网络中,以减少数据的空间尺寸,同时保留重要的特征。通过调整这些参数,可以控制池化操作的具体行为,以适应不同的应用场景和需求。
    在这里插入图片描述
    在这里插入图片描述
    最大池化,就是取卷积核覆盖区域的最大值
    第一个像元以2为最终值
    在这里插入图片描述
    kernel_size=3,所下一步
    在这里插入图片描述
    因为多出来了一步,所以ceil_mode=Ture的时候,就要保留,如果是false就不保留,现在为Ture
    在这里插入图片描述
    在这里插入图片描述
    所以ceil_mode=Ture的时候,代码如下所示:

import torch
from torch import nn
from torch.nn import MaxPool2dinput = torch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],[5,2,3,1,1],[2,1,0,1,1]])
input = torch.reshape(input,(-1,1,5,5))
print("input.shape",input.shape)class Test(nn.Module):def __init__(self):super(Test,self).__init__()self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)def forward(self,input):output = self.maxpool1(input)return output
test = Test()
output = test(input)
print(output)

输出结果为

C:\Anaconda3\envs\pytorch_test\python.exe H:\Python\Test\01test\nn_maxpool.py 
input.shape torch.Size([1, 1, 5, 5])
tensor([[[[2, 3],[5, 1]]]])进程已结束,退出代码0

所以ceil_mode=False的时候,代码如下所示:

import torch
from torch import nn
from torch.nn import MaxPool2dinput = torch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],[5,2,3,1,1],[2,1,0,1,1]])
input = torch.reshape(input,(-1,1,5,5))
print("input.shape",input.shape)class Test(nn.Module):def __init__(self):super(Test,self).__init__()self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)def forward(self,input):output = self.maxpool1(input)return output
test = Test()
output = test(input)
print(output)

输出结果为:

C:\Anaconda3\envs\pytorch_test\python.exe H:\Python\Test\01test\nn_maxpool.py 
input.shape torch.Size([1, 1, 5, 5])
tensor([[[[2]]]])进程已结束,退出代码0

为什么要进行最大池化,就是在保留输入特征的时候,同时减少参数,这样可以加快计算速度。例如输入的1080影像,经过池化后可能缩小成720p

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 金融知识普及月答题活动
  • Spring 源码解读:实现Bean的初始化与销毁机制
  • node.js使用express框架实现api接口开发(从零开始,超简单可直接复制)
  • MMGPL: 基于图提示学习的多模态医学数据分析 文献速递-大模型与多模态诊断阿尔茨海默症与帕金森疾病应用
  • 数字化转型升级探索(三)
  • C语言 ——— 文件指针以及文件的相关操作
  • QT C++ 判断字符串是否是一个数字
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • 在手机在线预览3D模型,是如何实现的?
  • 【STM32】写Keil程序的注意事项
  • JSON数据格式介绍及如何在java中解析、转换、使用(fastjson工具类和hutools工具类使用教程)
  • 干部画像要包括什么
  • 大模型实战-FinGLM解析金融财报做RAG经验参考篇
  • 8月29日wpf
  • Spring Boot项目中集成Geth与以太坊区块链进行交互操作实例
  • Angular6错误 Service: No provider for Renderer2
  • Electron入门介绍
  • httpie使用详解
  • Odoo domain写法及运用
  • React-flux杂记
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • VuePress 静态网站生成
  • XForms - 更强大的Form
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 为视图添加丝滑的水波纹
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #100天计划# 2013年9月29日
  • $.ajax中的eval及dataType
  • (4) PIVOT 和 UPIVOT 的使用
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .net core控制台应用程序初识
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET处理HTTP请求
  • .net开发时的诡异问题,button的onclick事件无效
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [\u4e00-\u9fa5] //匹配中文字符
  • [20150321]索引空块的问题.txt
  • [AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [C#]winform部署yolov9的onnx模型
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [Erlang 0129] Erlang 杂记 VI 2014年10月28日