1 深层卷积神经网络概述

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

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 深层卷积神经网络实战

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

  1. 【Pytorch神经网络理论篇】 27 图神经网络DGL库:简介+安装+卸载+数据集+PYG库+NetWorkx库

    DGL库是由纽约大学和亚马逊联手推出的图神经网络框架,支持对异构图的处理,开源相关异构图神经网络的代码,在GCMC.RGCN等业内知名的模型实现上也取得了很好的效果. 1 DGL库 1.1 DGL库的 ...

  2. 图神经网络的池化操作

    图神经网络有两个层面的任务:一个是图层面(graph-level),一个是节点(node-level)层面,图层面任务就是对整个图进行分类或者回归(比如分子分类),节点层面就是对图中的节点进行分类回归 ...

  3. 【Pytorch神经网络理论篇】 25 基于谱域图神经网络GNN:基础知识+GNN功能+矩阵基础+图卷积神经网络+拉普拉斯矩阵

    图神经网络(Graph Neural Network,GNN)是一类能够从图结构数据中学习特征规律的神经网络,是解决图结构数据(非欧氏空间数据)机器学习问题的最重要的技术. 1 图神经网络的基础知识 ...

  4. 【Pytorch神经网络理论篇】 32 PNASNet模型:深层可分离卷积+组卷积+空洞卷积

    1 PNASNet模型简介 PNASNet模型是Google公司的AutoML架构自动搜索所产生的模型,它使用渐进式网络架构搜索技术,并通过迭代自学习的方式,来寻找最优网络结构.即用机器来设计机器学习 ...

  5. 【Pytorch神经网络理论篇】 12 卷积神经网络实现+卷积计算的图解

    1 卷积神经网络接口 1.1 卷积接口介绍 torch.nn.functional.conv1d:实现按照1个维度进行的卷积操作,常用于处理序列数据. torch.nn.functional.conv ...

  6. 【Pytorch神经网络理论篇】 11 卷积网络模型+Sobel算子原理

    1 视觉角度理解卷积神经网络 1.1 卷积神经网络与生物视觉系统的关系 卷积神经网络的工作流程与生物大脑的处理视觉信号的流程相似,即:将图像从基础像素到局部信息再到整体信息的转化.大脑在对图像进行分级 ...

  7. 【Pytorch神经网络理论篇】 22 自编码神经网络:概述+变分+条件变分自编码神经网络

    1 无监督学习模型的概述 在监督训练中,模型能根据预测结果与标签差值来计算损失,并向损失最小的方向进行收敛. 在无监督训练中,无法通过样本标签为模型权重指定收敛方向,这就要求模型必须有自我监督的功能. ...

  8. 【Pytorch神经网络理论篇】 35 GaitSet模型:步态识别思路+水平金字塔池化+三元损失

    代码: [Pytorch神经网络实战案例]28 GitSet模型进行步态与身份识别(CASIA-B数据集)_LiBiGor的博客-CSDN博客1 CASIA-B数据集本例使用的是预处理后的CASIA- ...

  9. 【Pytorch神经网络理论篇】 06 神经元+神经网络模型+全连接网络模型

    1 神经元 1.1 概述 1.1.1 神经网络 神经网络:一种人工模仿动物中枢系统的数学模型,用于对函数进行近似估计 1.1.2 神经元 神经网络的基本单位是神经元. 神经元是一种处理单元,是对人脑组 ...

最新文章

  1. Maven快速创建SpringMVC web(1)
  2. visual studio 2017插件安装qt
  3. css margin和border,Margin、Border、Padding属性的区别和联系
  4. doctrine find的对象转换成数组_「ES6基础」Array数组的新方法(上)
  5. java 获取工程编码格式_java 获取获取字符串编码格式
  6. showModalDialog模态对话框的使用以及浏览器兼容
  7. 远程注入利用远程线程直接注入
  8. PHP微信公众开发笔记(一)
  9. Jenkins配置Android自动打包传蒲公英功能
  10. python解析can报文_解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真
  11. 硬件工程师有没有35岁危机?
  12. ubuntu 通过ssh链接ARM板 及 IMX6使用调试串口通信
  13. android的补间动画一共包含,Android的四种补间动画
  14. DS18B20温度传感器单片机C语言驱动程序
  15. linux sub减法指令出错,sparc的指令的一些总结
  16. 随机梯度下降(SGD)
  17. 正则表达式字符串匹配和字符串提取
  18. C语言中long long的用法
  19. 追求最优选择的后果,往往是事与愿违,往往是善良的愿望,把人类带入了人间地狱
  20. 读心或成现实,OpenBCI要将脑波传感技术用于VR中

热门文章

  1. OSPF次末节区域配置 201
  2. mysql查询流程解析及重要知识总结
  3. 学成在线--3.CMS页面管理开发(自定义条件查询)
  4. 买电脑主要看什么配置_我的专业要买什么配置电脑可以用到毕业?
  5. 单例模式在JDK应用的源码分析
  6. ap模式和sta模式共存_AP+AC组网下的本地转发及集中转发
  7. python免费开源工具推荐_年薪200万的程序员,推荐这10大Python免费开源工具!
  8. java父子表_Java编程:将具有父子关系的数据库表数据转换为树形结构,支持无限层级...
  9. rabbitmq 安装 linux
  10. Linux进程的诞生和消亡