【Pytorch神经网络理论篇】 13 深层卷积神经网络介绍+池化操作+深层卷积神经网络实战

简介: ceil_mode - 如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作

同学你好!本文章于2021年末编写,获得广泛的好评!


故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现


Pytorch深度学习·理论篇(2023版)目录地址为:


CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录

本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲解与分析,通过将深度学习知识与Pytorch的高效结合,帮助各位新入门的读者理解深度学习各个模板之间的关系,这些均是在Pytorch上实现的,可以有效的结合当前各位研究生的研究方向,设计人工智能的各个领域,是经过一年时间打磨的精品专栏!

https://v9999.blog.csdn.net/article/details/127587345


欢迎大家订阅(2023版)理论篇

以下为2021版原文~~~~

337677ca2abf4daa98266947ae274366.png


1 深层卷积神经网络概述


1.1 深层卷积神经网络模型结构图


20180529153922235.png


1.1.1 深层卷积神经网络的正向结构构成剖析


  • 输入层,将每个像素作为一个特征节点输入网络。


  • 卷积层:由多个滤波器组合而成。


  • 池化层:将卷积结果降维,对卷积后的特征图进行降维处理,得到更为显著的特征,池化层会对特征图中的数据作最大值/均值处理,在保留特征图原有的特征的基础上,减少后续运算量。


  • 全局平均池化层:对生成的特征图取全局平均值,该层可以用全连接网络代替。


  • 输出层:网络需要将数据分成几类,该层就有几个输出节点,每个输出节点代表属于当前样本的该类型的概率。


1.2 卷积神经网络的反向传播的步骤


(1)将误差传到前面一层,对卷积操作的反向求导时、需要先将生成的特征图做一次padding,再与转置后的卷积核做一次卷积操作,即得到输入端的误美,丛而实现了误差的反向传递。


(2)根据当前的误差对应的学习参数表达式来算出其需要更新的差值,与全连接网络中的反向求导是一样的,仍然是使用链式求县法则,找到使误差最小化的横度,再配合学习率算出更新的差值。


2 池化操作


2.1 池化操作的概述


2.1.1 池化操作的作用


主要目的降维,使得保持原有的特征基础上最大限度的降低数组大小。


2.1.2 池化与卷积对比


池化:只关心滤波器的尺寸,主要将滤波器映射区内的像素点取平均值或者最大值。


卷积:对应位置上的像素点的乘积。


2.2 池化操作的分类


2.2.1 均值池化


在图片上的对应出滤波器大小的区域,对于其所有像素点取均值,对背景信息更敏感。


2.2.2 最大池化


在图片上的对应出滤波器大小的区域,对于其所有像素点取最大值,对纹理特征更敏感。


2.2 池化函数接口


2.2.1 平均池化函数


nn.AvgPool2d——二维平均池化操作

https://blog.csdn.net/qq_50001789/article/details/120537858

torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)


  • kernel_size:池化核的尺寸大小


  • stride:窗口的移动步幅,默认与kernel_size大小一致


  • padding:在两侧的零填充宽度大小


  • ceil_mode:设为True时,在计算输出形状的过程中采用向上取整的操作,否则,采用向下取整


  • count_include_pad:布尔类型,当为True时,将在平均池化计算中包括零填充,否则,不包括零填充


  • divisor_override:如果被指定,则除数会被代替成divisor_override。换句话说,如果不指定该变量,则平均池化的计算过程其实是在一个池化核内,将元素相加再除以池化核的大小,也就是divisor_override默认为池化核的高×宽;如果该变量被指定,则池化过程为将池化核内元素相加再除以divisor_override。


2.2.2 最大池化函数


class torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)


  • kernel_size(int or tuple) - max pooling的窗口大小


  • stride(int or tuple, optional) - max pooling的窗口移动的步长。默认值是kernel_size


  • padding(int or tuple, optional) - 输入的每一条边补充0的层数


  • dilation(int or tuple, optional) – 一个控制窗口中元素步幅的参数


  • return_indices - 如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助


  • ceil_mode - 如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作


torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)


  • kernel_size(int or tuple) - max pooling的窗口大小


  • stride(int or tuple, optional) - max pooling的窗口移动的步长。默认值是kernel_size


  • padding(int or tuple, optional) - 输入的每一条边补充0的层数


  • dilation(int or tuple, optional) – 一个控制窗口中元素步幅的参数


  • return_indices - 如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助


  • ceil_mode - 如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作


2.3 池化函数的实战


2.3.1 定义输入变量 --- pool2d.py(第1部分)


import torch
### 1.1 定义输入变量
img = torch.tensor([
    [[0.0,0.0,0.0,0.0],[1.0,1.0,1.0,1.0],[2.0,2.0,2.0,2.0],[3.0,3.0,3.0,3.0]],
    [[4.0,4.0,4.0,4.0],[5.0,5.0,5.0,5.0],[6.0,6.0,6.0,6.0],[7.0,7.0,7.0,7.0]]
]).reshape([1,2,4,4]) # 定义张量,模拟输入图像
print(img) # 输出结果
print(img[0][0]) # 输出第1通道的内容


# 输出:
# tensor([[0, 0, 0, 0],
#         [1, 1, 1, 1],
#         [2, 2, 2, 2],
#         [3, 3, 3, 3]])
print(img[0][1]) # 输出第2通道的内容
# 输出:
# tensor([[4, 4, 4, 4],
#         [5, 5, 5, 5],
#         [6, 6, 6, 6],
#         [7, 7, 7, 7]])


2.3.2 定义池化操作并计算 --- pool2d.py(第2部分)


### 定义池化操作
pooling = torch.nn.functional.max_pool2d(img,kernel_size=2)
print("pooling :",pooling) # 输出最大池化结果(池化区域为2,步长为2),
pooling1 = torch.nn.functional.max_pool2d(img,kernel_size=2,stride=1) # 不补0
print("pooling1 :",pooling1) #  不补0,输出最大池化结果(池化区域为2X2,步长为1),生成3X3的矩阵
pooling2 = torch.nn.functional.avg_pool2d(img,kernel_size=2,stride=1,padding=1)# 先执行补0,再进行池化
print("pooling2 :",pooling2) # 先执行补0,输出平均池化结果(池化区域为4X4,步长为1),生成3X3的矩阵
# 全局池化操作,使用一个与原来输入相同尺寸的池化区域来进行池化操作,一般在最后一层用于图像表达
pooling3 = torch.nn.functional.avg_pool2d(img,kernel_size=4)
print("pooling3 :",pooling3) # 输出平均池化结果(池化区域为4,步长为4)
# 对于输入的张量计算两次均值,可得平均池化结果
m1 = img.mean(3)
print("第1次均值结果",m1)
print("第2次均值结果",m1.mean(2))
### 对于输入数据进行两次平均值操作时,可以看到在输入数据进行两次平均值计算的结果与pooling3的数值是一直的,即为等价


pooling : tensor([[[[1., 1.],
          [3., 3.]],
         [[5., 5.],
          [7., 7.]]]])
pooling1 : tensor([[[[1., 1., 1.],
          [2., 2., 2.],
          [3., 3., 3.]],
         [[5., 5., 5.],
          [6., 6., 6.],
          [7., 7., 7.]]]])
pooling2 : tensor([[[[0.0000, 0.0000, 0.0000, 0.0000, 0.0000],
          [0.2500, 0.5000, 0.5000, 0.5000, 0.2500],
          [0.7500, 1.5000, 1.5000, 1.5000, 0.7500],
          [1.2500, 2.5000, 2.5000, 2.5000, 1.2500],
          [0.7500, 1.5000, 1.5000, 1.5000, 0.7500]],
         [[1.0000, 2.0000, 2.0000, 2.0000, 1.0000],
          [2.2500, 4.5000, 4.5000, 4.5000, 2.2500],
          [2.7500, 5.5000, 5.5000, 5.5000, 2.7500],
          [3.2500, 6.5000, 6.5000, 6.5000, 3.2500],
          [1.7500, 3.5000, 3.5000, 3.5000, 1.7500]]]])
pooling3 : tensor([[[[1.5000]], [[5.5000]]]])
第1次均值结果 tensor([[[0., 1., 2., 3.],
         [4., 5., 6., 7.]]])
第2次均值结果 tensor([[1.5000, 5.5000]])


2.3.3 代码总览 --- pool2d.py


import torch
### 1.1 定义输入变量
img = torch.tensor([
    [[0.0,0.0,0.0,0.0],[1.0,1.0,1.0,1.0],[2.0,2.0,2.0,2.0],[3.0,3.0,3.0,3.0]],
    [[4.0,4.0,4.0,4.0],[5.0,5.0,5.0,5.0],[6.0,6.0,6.0,6.0],[7.0,7.0,7.0,7.0]]
]).reshape([1,2,4,4]) # 定义张量,模拟输入图像
print(img) # 输出结果
print(img[0][0]) # 输出第1通道的内容
# 输出:
# tensor([[0, 0, 0, 0],
#         [1, 1, 1, 1],
#         [2, 2, 2, 2],
#         [3, 3, 3, 3]])
print(img[0][1]) # 输出第2通道的内容
# 输出:
# tensor([[4, 4, 4, 4],
#         [5, 5, 5, 5],
#         [6, 6, 6, 6],
#         [7, 7, 7, 7]])
### 定义池化操作
pooling = torch.nn.functional.max_pool2d(img,kernel_size=2)
print("pooling :",pooling) # 输出最大池化结果(池化区域为2,步长为2),
pooling1 = torch.nn.functional.max_pool2d(img,kernel_size=2,stride=1) # 不补0
print("pooling1 :",pooling1) #  不补0,输出最大池化结果(池化区域为2X2,步长为1),生成3X3的矩阵
pooling2 = torch.nn.functional.avg_pool2d(img,kernel_size=2,stride=1,padding=1)# 先执行补0,再进行池化
print("pooling2 :",pooling2) # 先执行补0,输出平均池化结果(池化区域为4X4,步长为1),生成3X3的矩阵
# 全局池化操作,使用一个与原来输入相同尺寸的池化区域来进行池化操作,一般在最后一层用于图像表达
pooling3 = torch.nn.functional.avg_pool2d(img,kernel_size=4)
print("pooling3 :",pooling3) # 输出平均池化结果(池化区域为4,步长为4)
# 对于输入的张量计算两次均值,可得平均池化结果
m1 = img.mean(3)
print("第1次均值结果",m1)
print("第2次均值结果",m1.mean(2))
### 对于输入数据进行两次平均值操作时,可以看到在输入数据进行两次平均值计算的结果与pooling3的数值是一直的,即为等价


3 深层卷积神经网络实战

目录
相关文章
|
1天前
|
机器学习/深度学习 编解码 计算机视觉
【YOLOv8改进- Backbone主干】BoTNet:基于Transformer,结合自注意力机制和卷积神经网络的骨干网络
【YOLOv8改进- Backbone主干】BoTNet:基于Transformer,结合自注意力机制和卷积神经网络的骨干网络
|
1天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于CNN卷积神经网络的MQAM调制识别matlab仿真
**理论**: 利用CNN自动识别MQAM调制信号,通过学习星座图特征区分16QAM, 64QAM等。CNN从原始数据提取高级特征,优于传统方法。 - **CNN结构**: 自动特征学习机制,适配多种MQAM类型。 - **优化**: 损失函数指导网络参数调整,提升识别准确度。 - **流程**: 大量样本训练+独立测试评估,确保模型泛化能力。 - **展望**: CNN强化无线通信信号处理,未来应用前景广阔。
|
6天前
|
计算机视觉 网络架构
【YOLOv8改进 - 卷积Conv】DWRSeg:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测
YOLO目标检测专栏探讨了YOLO的创新改进,如多尺度特征提取的DWRSeg网络。该网络通过区域残差化和语义残差化提升效率,使用DWR和SIR模块优化高层和低层特征。DWRSeg在Cityscapes和CamVid数据集上表现优秀,速度与准确性兼备。论文和代码已公开。核心代码展示了一个包含DWR模块的卷积层。更多配置详情见相关链接。
|
6天前
|
机器学习/深度学习 计算机视觉 网络架构
【YOLOv8改进- Backbone主干】YOLOv8 更换主干网络之 PP-LCNet,轻量级CPU卷积神经网络,降低参数量
YOLO目标检测专栏介绍了PP-LCNet,一种基于MKLDNN加速的轻量级CPU网络,提升了模型在多任务中的性能。PP-LCNet利用H-Swish、大核卷积、SE模块和全局平均池化后的全连接层,实现低延迟下的高准确性。代码和预训练模型可在PaddlePaddle的PaddleClas找到。文章提供了网络结构、核心代码及性能提升的详细信息。更多实战案例和YOLO改进见相关链接。
|
3天前
|
SQL 安全 网络安全
网络安全与信息安全:漏洞、加密技术与安全意识的深度剖析
在数字化时代,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文将深入探讨网络安全中常见的漏洞类型,介绍加密技术如何保护信息免受未授权访问,并强调培养安全意识的重要性。我们将通过具体案例和统计数据来展示网络攻击的实际影响,分析加密技术的工作原理及其面临的挑战,并提供实用的建议来提高个人和组织的安全意识。文章旨在为读者提供全面的网络安全知识,帮助他们在日益复杂的网络环境中保护自己的信息资产。
|
2天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【7月更文挑战第23天】在数字化时代,网络安全和信息安全已成为全球关注的焦点。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性。我们将了解不同类型的网络攻击和漏洞,并讨论如何通过加密技术和提高安全意识来保护个人和组织的数据。文章还将介绍一些实用的工具和策略,以帮助读者更好地保护自己的网络安全。
|
1天前
|
存储 弹性计算 安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的深度探讨
【7月更文挑战第24天】本文旨在深入探讨云计算与网络安全之间的关系,包括云服务、网络安全、信息安全等技术领域。我们将从云计算的基本概念出发,分析其对网络安全的影响,以及如何通过技术手段保障云计算环境下的网络安全。同时,我们还将探讨网络安全在云计算环境下的重要性,以及如何通过信息安全技术保护用户数据和隐私。最后,我们将展望云计算与网络安全领域的未来发展趋势,为读者提供一些启示和建议。
|
1天前
|
SQL 安全 算法
网络安全与信息安全:漏洞、加密与安全意识的交汇点
【7月更文挑战第24天】在数字时代的浪潮中,网络安全与信息安全成为了维护个人隐私和企业机密的基石。本文将深入探讨网络安全漏洞的类型及其产生的原因,分析当前主流的加密技术如何保护数据安全,并强调提升安全意识在防范网络攻击中的重要性。文章旨在为读者提供实用的知识分享,帮助他们构建更加坚固的网络防御体系。
9 4
|
1天前
|
安全 网络安全 数据安全/隐私保护
网络安全漏洞与信息安全的加密技术
在数字化时代,网络安全和信息安全的重要性不断上升。本文将探讨网络安全漏洞的类型、原因及影响,介绍加密技术在保护信息安全中的作用,并强调安全意识的培养对于防范网络威胁的必要性。通过分析具体案例,本文旨在提供关于如何通过技术和非技术手段加强网络安全防护的知识分享。
9 1
|
1天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:漏洞、加密技术与安全意识的交汇
在数字化时代,网络安全和信息安全成为维护数据完整性和保障用户隐私的关键。本文将深入探讨网络安全中的常见漏洞,分析加密技术如何作为防御工具被应用,并强调安全意识在防范网络威胁中的重要性。文章通过具体案例和统计数据,揭示了网络安全的脆弱点和加强措施的必要性。

热门文章

最新文章