前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【深度学习实验】卷积神经网络(四):自定义二维汇聚层:最大汇聚(max pooling)和平均汇聚(average pooling)

【深度学习实验】卷积神经网络(四):自定义二维汇聚层:最大汇聚(max pooling)和平均汇聚(average pooling)

作者头像
Qomolangma
发布2024-07-30 08:34:13
1350
发布2024-07-30 08:34:13
举报
文章被收录于专栏:深度学习

一、实验介绍

本实验实现了一个自定义的二维汇聚层(池化层),包括前向传播中进行最大池化、平均池化等操作。

二、实验环境

本系列实验使用了PyTorch深度学习框架,相关操作如下:

1. 配置虚拟环境

代码语言:javascript
复制
conda create -n DL python=3.7 
代码语言:javascript
复制
conda activate DL
代码语言:javascript
复制
pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
代码语言:javascript
复制
conda install matplotlib
代码语言:javascript
复制
 conda install scikit-learn

2. 库版本介绍

软件包

本实验版本

目前最新版

matplotlib

3.5.3

3.8.0

numpy

1.21.6

1.26.0

python

3.7.16

scikit-learn

0.22.1

1.3.0

torch

1.8.1+cu102

2.0.1

torchaudio

0.8.1

2.0.2

torchvision

0.9.1+cu102

0.15.2

三、实验内容

ChatGPT:

卷积神经网络(Convolutional Neural Network,简称CNN)是一种深度学习模型,广泛应用于图像识别、计算机视觉和模式识别等领域。它的设计灵感来自于生物学中视觉皮层的工作原理。 卷积神经网络通过多个卷积层、池化层全连接层组成。

  • 卷积层主要用于提取图像的局部特征,通过卷积操作和激活函数的处理,可以学习到图像的特征表示。
  • 池化层则用于降低特征图的维度,减少参数数量,同时保留主要的特征信息。
  • 全连接层则用于将提取到的特征映射到不同类别的概率上,进行分类或回归任务。

卷积神经网络在图像处理方面具有很强的优势,它能够自动学习到具有层次结构的特征表示,并且对平移、缩放和旋转等图像变换具有一定的不变性。这些特点使得卷积神经网络成为图像分类、目标检测、语义分割等任务的首选模型。除了图像处理,卷积神经网络也可以应用于其他领域,如自然语言处理和时间序列分析。通过将文本或时间序列数据转换成二维形式,可以利用卷积神经网络进行相关任务的处理。

0. 导入必要的工具包

代码语言:javascript
复制
import torch
from torch import nn
import torch.nn.functional as F

1. Conv2D(二维卷积层)

【深度学习实验】卷积神经网络(三):自定义二维卷积神经网络:步长和填充、输入输出通道_QomolangmaH的博客-CSDN博客

https://blog.csdn.net/m0_63834988/article/details/133313330?spm=1001.2014.3001.5501

2. Pool2D(二维汇聚层

理论知识

汇聚层池化层)是深度学习中常用的一种操作,其作用是进行特征选择,降低特征数量,从而减少参数数量。

卷积层虽然可以显著减少网络中连接的数量,但特征映射组中的神经元个数并没有显著减少。如果后面接一个分类器,分类器的输入维数依然很高,很容易出现过拟合。

在神经网络的卷积层之后通常会添加汇聚层。汇聚层通过将输入数据划分为不重叠的区域,并在每个区域中选择一个代表性的元素(例如最大值平均值)来减小空间尺寸。这样可以在保留重要信息的同时,减少冗余和噪声,并提高计算效率。汇聚层的操作是局部的,因此网络可以对图像的平移、旋转和缩放等变换具有一定的不变性。

常见的汇聚层有最大汇聚(max pooling)平均汇聚(average pooling)

  • 最大汇聚从输入区域中选择最大的元素作为输出;
  • 平均汇聚则计算输入区域的平均值作为输出;
  • 这些汇聚操作可以在卷积神经网络中的多个层级上进行,以逐渐减小特征图的空间尺寸。
代码语言:javascript
复制
class Pool2D(nn.Module):
    def __init__(self, size=(2,2), mode='max', stride=1):
        super().__init__()
        self.mode = mode
        self.h, self.w = size
        self.stride = stride
        
    def forward(self, x):
        output = torch.zeros((x.shape[0], x.shape[1], (x.shape[2] - self.h + 1)//self.stride, (x.shape[3] - self.w + 1)//self.stride))
        for i in range(output.shape[2]):
            for j in range(output.shape[3]):
                if self.mode == 'max':
                    output[:, :, i, j] = x[:, :, i*self.stride: i*self.stride + self.w, j*self.stride: j*self.stride + self.h].max()
        return output
a. 初始化
  • size参数用于指定池化窗口的大小,默认为(2, 2),表示池化窗口的高度和宽度都为2。
  • mode参数用于指定池化的模式,默认为'max',表示最大池化操作。也可以选择'average'来进行平均池化操作。
  • stride参数用于指定池化窗口的步幅,默认为1,表示窗口在输入上滑动的间距为1。
b. 前向传播(最大汇聚层)
  • 根据输入x的形状创建一个与池化后输出相同形状的零张量output
  • 使用两个嵌套的循环遍历output张量的每个空间位置(高度和宽度)。
    • 在每个位置上,根据池化模式选择不同的操作。
    • 如果self.mode为'max',则使用x张量切片操作获取对应池化窗口区域内的数据,并取最大值作为输出。
  • 最后,返回池化后的输出张量output
c. 前向传播(平均汇聚层)

只需在forward方法中将池化操作改为计算对应窗口区域内的平均值:

代码语言:javascript
复制
class Pool2D(nn.Module):
    def __init__(self, size=(2 ,2), mode='average', stride=1):
        super().__init__()
        self.mode = mode
        self.h, self.w = size
        self.stride = stride

    def forward(self, x):
        output = torch.zeros((x.shape[0], x.shape[1], (x.shape[2] - self.h + 1) // self.stride,
                              (x.shape[3] - self.w + 1) // self.stride))
        for i in range(output.shape[2]):
            for j in range(output.shape[3]):
                if self.mode == 'max':
                    output[:, :, i, j] = x[:, :, i* self.stride: i * self.stride + self.w,
                                         j * self.stride: j * self.stride + self.h].max()
                elif self.mode == 'average':
                    output[:, :, i, j] = x[:, :, i * self.stride: i * self.stride + self.w,
                                         j * self.stride: j * self.stride + self.h].mean()
        return output
d. 测试
代码语言:javascript
复制
fake_feature = torch.rand((3,2,5,5))
pool = Pool2D()
output = pool(fake_feature)
print(output.shape)

输出

代码语言:javascript
复制
torch.Size([3, 2, 4, 4])
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、实验介绍
  • 二、实验环境
    • 1. 配置虚拟环境
      • 2. 库版本介绍
      • 三、实验内容
        • 0. 导入必要的工具包
          • 1. Conv2D(二维卷积层)
            • 2. Pool2D(二维汇聚层)
              • 理论知识
              • a. 初始化
              • b. 前向传播(最大汇聚层)
              • c. 前向传播(平均汇聚层)
              • d. 测试
          相关产品与服务
          NLP 服务
          NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档