关于CNN卷积神经网络与Conv2D标准卷积的重要概念

温故而知新,可以为师矣!

一、参考资料

深入解读卷积网络的工作原理(附实现代码)
深入解读反卷积网络(附实现代码)
Wavelet U-net进行微光图像处理
卷积知识点
CNN网络的设计论:NAS vs Handcraft

二、卷积神经网络(CNN)相关介绍

1. CNN网络简介

1.1 CNN特征提取

学习输入到输出的映射,并对映射关系加以训练,训练好的模型也具备了这种映射能力。浅层网络一般学习的是边缘、颜色、亮度等,较深层网络学习的是纹理,而更深层的网络学习的是具有一些辨识度的特征,所以卷积神经网络学习的特征逐渐抽象到更高级别。

1.2 CNN网络优点

  1. 参数共享。对输入图像进行卷积操作时,对不同的区域都会共享同一个卷积核,即共享同一组参数,使得网络的参数量才会大大减少;

  2. 稀疏性连接。进行卷积操作之后,输出图像的任何一个区域只跟输入图像的一部分有关。

2. CNN网络结构

CNN网络一般由输入层、卷积层(convolution layer)、激活层、 池化层(pooling layer)和全连接层(fully-connected layer,FC layer)五部分组成。其中,最核心的层包括:

  • convolution layer:提取spacial information
  • pooling layer:降低图像或特征图分辨率,减少运算量并获得semantic information
  • FC layer:回归目标。

注意:随着时代的改变,虽然pooling layer时常被较大stride的convolution取代,global average pooling 与1x1 convolution也时不时代替了 FC layer,这个大思路依然是大致没变的。

3. 卷积层

如果没有特殊说明,卷积指的是标准卷积(Conv2D),卷积操作指的是标准卷积的正向卷积过程

卷积层功能:一张图像在计算机中自动识别为一个二维矩阵。卷积层对输入图像进行特征提取,其内部是由多个卷积核组成的,多个卷积核构成滤波器。

卷积层参数:卷积核大小、步长和填充方式。

卷积层重要特性:权值共享。对于任意一张图像,用一个滤波器按照先横后竖的顺序去覆盖这张图,因为这张图像的每个区域都是被同一个滤波器覆盖,所以各个 区域的权重一样。

多卷积层:一层卷积学到的特征往往是局部的,而卷积层数越多,学到的特征就越全局化。实际应用中,往往使用多层卷积,然后再使用全连接层进行训练。

3.1 卷积核(kernel/filters)

kernel称为卷积核,filters称为滤波器,多个kernel构成filters。卷积核的数量,也就是卷积核通道数。例如,卷积核的尺寸为: K ∗ K ∗ 3 ∗ M K*K*3*M KK3M,单个卷积核尺寸为: K ∗ K ∗ 3 K*K*3 KK3,卷积核的数量为: M M M,即表示通道数。

在TensorFlow中叫filters,在keras中叫kernel,不同文献有不同的叫法,在这里统一叫做卷积核kernel,一般kernel的大小(height*width)为1X1,3X3,5X5,7X7。

卷积核与特征(特征图)的关系:不同的卷积核可以提取不同的特征,一个卷积核只能提取一种特征,32个卷积核就可以提取32种特征。通过卷积操作,一个卷积核对应输出一维特征图,多个卷积核对应输出多维特征图,维度也称为特征图的深度,即对应特征图通道数
在这里插入图片描述

3.2 卷积操作

卷积操作是基于卷积的数学运算,可以将卷积核看成 一个二维数字矩阵,输入图像与卷积核进行卷积后就得到了特征图。先在输入图 像的某一个区域覆盖卷积核,然后将卷积核中的每一个数值与输入图像相应位置像素的数值相乘,把乘积累加起来,得到的和便是输出图像对应位置中目标像素 的数值,多次重复此操作直到输入图像中所有区域被卷积核覆盖完整。
在这里插入图片描述

3.3 卷积操作的数学原理

定义一个尺寸为 4×4 的输入矩阵 input
i n p u t = [ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 x 13 x 14 x 15 x 16 ] \left.input=\left[\begin{array}{cccc}x_1&x_2&x_3&x_4\\x_5&x_6&x_7&x_8\\x_9&x_{10}&x_{11}&x_{12}\\x_{13}&x_{14}&x_{15}&x_{16}\end{array}\right.\right] input= x1x5x9x13x2x6x10x14x3x7x11x15x4x8x12x16
一个尺寸为3×3 的标准卷积核 kernel
k e r n e l = [ w 0 , 0 w 0 , 1 w 0 , 2 w 1 , 0 w 1 , 1 w 1 , 2 w 2 , 0 w 2 , 1 w 2 , 2 ] kernel=\begin{bmatrix}w_{0,0}&w_{0,1}&w_{0,2}\\w_{1,0}&w_{1,1}&w_{1,2}\\w_{2,0}&w_{2,1}&w_{2,2}\end{bmatrix} kernel= w0,0w1,0w2,0w0,1w1,1w2,1w0,2w1,2w2,2
令步长 s t r i d e s = 1 strides=1 strides=1,填充 p a d d i n g = 0 padding=0 padding=0 ,即 i = 4 , k = 3 , s = 1 , p = 0 i=4,k=3,s=1,p=0 i=4,k=3,s=1,p=0 ,则按照 公式 ( 1 ) 公式(1) 公式(1) 计算可得尺寸为 2×2的输出矩阵 o u t p u t output output
o u t p u t = [ y 0 y 1 y 2 y 3 ] output=\begin{bmatrix}y_0&y_1\\y_2&y_3\end{bmatrix} output=[y0y2y1y3]
这里,我们换一个表达方式,我们将输入矩阵 input 和输出矩阵 output 展开成列向量 X 和列向量 Y ,那么向量 X 和向量 Y 的尺寸就分别是 16×14×1,可以分别用如下公式表示:

把输入矩阵 input 展开成一个16×1列向量 X X X
X = [ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 x 13 x 14 x 15 x 16 ] T \begin{array}{llllllllllll}X=[x_{1}&x_{2}&x_{3}&x_{4}&x_{5}&x_{6}&x_{7}&x_{8}&x_{9}&x_{10}&x_{11}&x_{12}&x_{13}&x_{14}&x_{15}&x_{16}]^T\end{array} X=[x1x2x3x4x5x6x7x8x9x10x11x12x13x14x15x16]T
把输出矩阵 o u t p u t output output 展开成一个 4×1列向量 Y Y Y
Y = [ y 1 y 2 y 3 y 4 ] T Y=\begin{bmatrix}y_1&y_2&y_3&y_4\end{bmatrix}^T Y=[y1y2y3y4]T
再用矩阵运算来描述标准卷积运算,这里使用矩阵 C 来表示标准卷积核矩阵:
Y = C X Y=CX Y=CX
经过推导,我们可以得到这个稀疏矩阵 C 的尺寸为 4×16
C = [ u 0 , 0 w 0 , 1 w 0 , 2 0 w 1 , 0 w 1 , 1 w 1 , 2 0 w 2 , 0 w 2 , 1 w 2 , 3 0 0 0 0 0 0 w 0 , 0 w 0 , 1 w 0 , 2 0 w 1 , 0 w 1 , 1 w 1 , 2 0 w 2 , 0 w 2 , 1 w 2 , 2 0 0 0 0 0 0 0 0 w 0 , 0 w 0 , 1 w 0 , 2 0 w 1 , 0 w 1 , 1 w 1 , 2 0 w 2 , 0 w 2 , 1 w 2 , 2 0 0 0 0 0 0 w 0 , 0 w 0 , 1 w 0 , 2 0 w 1 , 0 w 1 , 1 w 1 , 2 0 w 2 , 0 w 2 , 1 w 2 , 2 ] C=\begin{bmatrix}u_{0,0}&w_{0,1}&w_{0,2}&0&w_{1,0}&w_{1,1}&w_{1,2}&0&w_{2,0}&w_{2,1}&w_{2,3}&0&0&0&0&0\\0&w_{0,0}&w_{0,1}&w_{0,2}&0&w_{1,0}&w_{1,1}&w_{1,2}&0&w_{2,0}&w_{2,1}&w_{2,2}&0&0&0&0\\0&0&0&0&w_{0,0}&w_{0,1}&w_{0,2}&0&w_{1,0}&w_{1,1}&w_{1,2}&0&w_{2,0}&w_{2,1}&w_{2,2}&0\\0&0&0&0&0&w_{0,0}&w_{0,1}&w_{0,2}&0&w_{1,0}&w_{1,1}&w_{1,2}&0&w_{2,0}&w_{2,1}&w_{2,2}\end{bmatrix} C= u0,0000w0,1w0,000w0,2w0,1000w0,200w1,00w0,00w1,1w1,0w0,1w0,0w1,2w1,1w0,2w0,10w1,20w0,2w2,00w1,00w2,1w2,0w1,1w1,0w2,3w2,1w1,2w1,10w2,20w1,200w2,0000w2,1w2,000w2,2w2,1000w2,2
上述矩阵运算如下图所示:
在这里插入图片描述

3.4 卷积计算公式

卷积计算的输入输出特征图尺寸的对应关系如下:
o = ⌊ i + 2 p − k s ⌋ + 1 i = size of input o = size of output p = p a d d i n g k = size of kernel s = s t r i d e s ( 1 ) o=\left\lfloor\frac{i+2p-k}{s}\right\rfloor+1 \quad \begin{array}{l} \\i=\textit{size of input}\\o=\textit{size of output}\\p=padding\\k=\textit{size of kernel}\\s=strides\end{array}\quad (1) o=si+2pk+1i=size of inputo=size of outputp=paddingk=size of kernels=strides(1)

其中, ⌊ ⋅ ⌋ \left\lfloor\cdot\right\rfloor 表示向下取整符号。

3.5 卷积参数量和计算量

卷积的三种模式:full, same, valid
卷积中参数量和计算量
卷积神经网络中的参数计算
理解分组卷积和深度可分离卷积如何降低参数量
网络解析(一):LeNet-5详解
图像识别-AlexNet网络结构详解
抽丝剥茧,带你理解转置卷积(反卷积)
深度学习中不同类型卷积的综合介绍:2D卷积、3D卷积、转置卷积、扩张卷积、可分离卷积、扁平卷积、分组卷积、随机分组卷积、逐点分组卷积等pytorch代码实现和解析。

//TODO

参数量(神经元数量)的概念:参与计算的参数个数,占用内存空间。
计算量,运算量(连接数):包括乘法和加法计算。

3.6 1x1卷积

一般来说,1x1的卷积对神经网络特征的学习作用不大,通常用来做shape的调整,即升维和降维。

3.7 1x1特征图

当输入特征图的widthheigth为1时,此时输出将由卷积核大小唯一决定,即卷积核若为nxn,则输出特征图大小也为nxn,后续计算可在此基础上继续套用卷积计算公式。

4. 池化层

4.1 引言

一个96x96的图像,如果用一个8x8大小的卷积核,每个特征的维度为(96-8+1)x(96-8+1)(假设padding使用VALID,步长strides为1)。定义400个特征(通道),最后的维度即为7921x400=3168400 大小的向量。最后再使用全连接进行分类的话,最后是三百万的卷积特征输入,由于维度太高十分容易出现过拟合。这时就需要用到池化。

4.2 池化层作用

池化又称作下采样,池化层通常在卷积层和激活层之后。池化层没有相应的参数,它往往存在于连续的卷积层之间。通过卷积和池化分别进行特征提取以及降维的目的。池化在图像识别中应用较多,但在一些网络模型的应用比如图像重建等并没有采用池化。

池化层是对不同位置的特征进行聚合统计。例如可以计算一个区域上某个特定特征的平均值(average_pooling),或者最大值(max_pooling)。最大值池化是最经常使用的池化方式,选取区域的最大值能够很好地保持原图的特征。在这一步操作过后不仅能够得到低得多的维度,还会增强泛化性能。

池化层是对卷积层提取到的特征再一次压缩。一方面,卷积输出中包含的大部分信息是冗余的,通过池化操作获得更主要的特征,防止出现过拟合现象;另一方面,通过池化操作减小输入的大小,减少输出中相似值的数量,从而减少参数的数量来简化网络计算的复杂性,提高网络模型的鲁棒性、容错性和运行效率。

4.3 池化层分类

  1. 最大池化(Max Pooling)。选择图像某一区域像素的最大值作为该区域池化操作后的数值。

  2. 平均池化(Average Pooling)。选择图像某一区域像素的平均值作为该区域池化操作后的数值。

4.4 池化计算公式

池化的计算与卷积计算类似,只是将stride步长设置为2,使得输出大小减半。
o = ⌊ i + 2 p − k 2 ⌋ + 1 i = size of input o = size of output p = p a d d i n g k = size of kernel s = s t r i d e s ( 2 ) o=\left\lfloor\frac{i+2p-k}{2}\right\rfloor+1 \quad \begin{array}{l} \\i=\textit{size of input}\\o=\textit{size of output}\\p=padding\\k=\textit{size of kernel}\\s=strides\end{array}\quad (2) o=2i+2pk+1i=size of inputo=size of outputp=paddingk=size of kernels=strides(2)

其中, ⌊ ⋅ ⌋ \left\lfloor\cdot\right\rfloor 表示向下取整符号。

5. 全连接层

全连接层常常出现在整个卷积神经网络的末尾处,将所有的局部特征连接起来。如果说卷积层是用来提取局部特征,那么全连接层就是把所有的局部特征通过权值矩阵进行整合,并进行归一化操作,最后对各种分类情况都输出一个概率值。全连接层的输出是一个一维向量,一方面可以起到维度变换的作用,特别是可以将高维度转变为低维度,同时把有用的信息保留下来;另一方面可以起到“分类器”的作用,根据全连接得到的概率完成对特征的分类。

6. 常用CNN网络架构

常见的CNN网络架构可以被切成三个部分:

Stem: 将输入图像用少量的 convolution 扫过,并调整分辨率度。

Body: 网络的主要部分,又可分为多个stage,通常每个stage执行一次下采样(降低分辨率)的操作,其内部则为一个或多个building block (如residual bottleneck)的重复组合。

Head: 使用stem与body提取的feature,执行目标任务的预测。
在这里插入图片描述

除此之外,Building block也是一个很常被使用的术语,指的是那些被不断重复使用的小网络组合,比如说ResNet中的 residual blockresidual bottleneck block,又或是MobileNet中的depthwise convolution blockreverted bottleneck block

7. 关于CNN网络的深度/宽度/分辨率

在不大幅改动主架构的情况下,一般调整的参数有以下三种:

7.1 深度D(depth)

深度是指从输入到输出,堆叠的 building blockconvolution layer 的数量。在深度方面,越深的网络可以捕捉越复杂的特征,并且带来更好的泛化 (generalization) 能力。然而,过深的网络即使使用 skip connectionbatch normalization,仍然容易因梯度消失 (gradient vanishing) 导致不易训练。

7.2 宽度W (width)

宽度是指 building blockconvolution layer 输出 feature map的宽度 (channels或filters数)。在宽度方面,一般来说越宽的网络可以捕捉到更细节 (fine-grained) 的信息,并且容易训练。然而,宽而浅的网络却是难以捕捉复杂的特征。

7.3 分辨率R(resolution)

分辨率是指 building blockconvolution layer输出 feature map 张量的长与宽。在分辨率方面,高分辨率无庸置疑的可以得到更多细节信息,在大多的论文中基本上都是提升performance的好法宝。显而易见的缺点就是运算量,然后在localization问题需要调整、匹配的receptive field

7.4 总结

以下是EfficentNet论文提供单独增加深度、宽度与分辨率上的实验。从实验上可以看出,单独增强其中一项对效能的提升都是有效的,但是很快这个效果就会饱和
在这里插入图片描述

基于单一强化的实验,EfficientNet的作者认为应该要一起考虑强化深度、宽度与分辨率三项。然而,在一定的运算量设定下,如何决定调整这三项之间的调整比例则是一个开放的问题。

同时提高深度、宽度与分辨率,其运算量翻倍增加 (例如,增加两倍深度,会增加两倍运算量;增加宽度或分辨率度两倍,则会增加运算量四倍)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/602599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Gitee每次push都需要输入用户名和密码

其实很简单,只需要使用命令 git config --global credential.helper store 在你下次push时只需要再输入一次用户名和密码,电脑就会保存下来,之后就无需进行输入了。

OpenHarmony底座升级指南(3.2升级4.0)

前言 本文旨在帮助开发者完成底座升级,文中主要以OpenHarmony 3.2 release 升级至OpenHarmony 4.0 release为模板描述。 一、流程概览: 1.1 准备工作 在准备阶段,需要完整收集所有的定制化修改,明确修改人;并且要将…

嵌入式项目——平衡小车(1)

焊接 驱动板需要焊接的如上图。 陀螺仪8pin排母电机两路排线插口。(个别同学需要焊接)两个电池仓,注意电池仓分正反。 安装 底部电池板 4个 双通尼龙柱M3*224个 尼龙螺钉M3*6电机驱动板

【算法笔记】深入理解dfs(两道dp题)

DFS过程的概述 一个一个节点的搜,如果是树状结构的话,先找到最左边那一条分支搜到最后一个节点,这个时候最后一个节点(假设是b)的数据会被更新(具体看题目的要求),然后返回到上一个…

【计算机图形学】NAP: Neural 3D Articulation Prior

文章目录 1. 这篇论文做了什么事,有什么贡献?2. Related Work铰接物体建模3D中的Diffusion model扩散模型 3. Pipeline铰接树参数化基于Diffusion的铰接树生成去噪网络 4. 实验评价铰接物体生成——以往做法与本文提出的新指标NAP捕捉到的铰接物体分布质…

玩转Mysql 四(MySQL逻辑架构与数据引擎)

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 一、MySQL逻辑架构 1、从Oracle收购MySQL后,MySQL逻辑架构受Oracle影响,MySQL8版本中逻辑架构受Oracle的影响逐步完善查询缓存,O…

数据结构:树详解

创建二叉树 给出了完整的先序遍历序列,子树为空用’#’表示,所以这样我们在通过先序遍历序列创建二叉树时我们直到先序遍历序列是先进行根结点,然后左子树最后右子树的顺序进行遍历的,所以对于完整的先序遍历序列我们可以直到先序…

VS code的使用介绍

VS code的使用介绍 简介下载和安装常用的插件使用教程快捷键 集成Git未找到 Git。请安装 Git,或在 "git.path" 设置中配置。操作步骤打开文件夹初始化仓库文件版本控制状态提交文件到git打开git操作栏位 好用的插件ChineseDraw.io Integration实体关系 Gi…

Windows电脑无法睡眠解决办法

原因 电脑无法休眠的原因,是打开离开模式策略后,windows内核会持续调用CPU资源,导致系统一直在运行而无法关闭。关闭后就好了。 解决步骤 修改注册表 操作步骤如下: 按winR,输入regedit,打开注册表编辑页面。输入如下…

YOLOv5+混合注意力机制再涨4.3%,Transformer混合设计依旧可以卷

在工业生产过程中,由于低效率、不统一的评估、高成本以及缺乏实时数据,传统的手动检测焊接缺陷不再被应用。 为了解决表面贴装技术中焊接缺陷检测的低准确率、高误检率和计算成本问题,提出了一种新方法。该方法是一种专门针对焊接缺陷检测算法…

STM32入门教程-2023版【3-2】STM32如何使用库函数及几种方法

关注 点赞 不错过精彩内容 大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 五、库函数的使用方法 (1)第一种 想使用库函数,可以先打开.h文件&…

Nginx快速入门:worker、master进程的作用和热部署原理(十)

0. 引言 我们通过查询nginx进程,可以发现nginx有两个进程:worker和master。一个程序启动了两个进程,那么这两个进程的作用和区别是什么呢?nginx又是如何利用这两个进程进行工作的呢?nginx不停机热部署又是如何实现的&…

12月笔记

#pragma once 防止多次引用头文件,保证同一个(物理意义上)文件被多次包含,内容相同的两个文件同样会被包含。 头文件.h与无.h的文件: iostream是C的头文件,iostream.h是C的头文件,即标准的C头文…

一个H3C交换机周期性断网并自动恢复的排查案例

一个朋友发我一个H3C日志,这个交换机是汇聚层交换机,1和2口是trunk口,其它接口是access接口,17-21口据说接的都是监控、终端。日志里面看到大量的拓朴改变,好几个网口up、down的日志,怀疑是环路&#xff0c…

Linux操作系统基础 – 管理目录

Linux操作系统基础 – 管理目录 Linux Essentials – Manage Directories By JacksonML 本文简要介绍在Linux系统中如何管理目录的方法及实例,希望对您有所帮助。 1. Linux目录 一个目录,是一个存储文件名及相关信息的单独工作的文件。所有的文件&am…

SpringBoot学习(七)-SpringBoot集成Swagger

集成Swagger终极版 学习目标: 了解Swagger的概念及作用掌握在项目中集成Swagger自动生成API文档 Swagger简介 前后端分离 前端 -> 前端控制层、视图层后端 -> 后端控制层、服务层、数据访问层前后端通过API进行交互前后端相对独立且松耦合 产生的问题 前…

Qt——TCP UDP网络编程

目录 前言正文一、TCP二、UDP1、基本流程2、必备知识 三、代码层级1、UDP服务端 END、总结的知识与问题1、如何获取QByteArray中某一字节的数据,并将其转为十进制?2、如何以本年本月本日为基础,获取时间戳,而不以1970为基础&#…

Docker-Compose部署Redis(v7.2)分片集群(含主从)

文章目录 一、前提准备1. 文件夹结构 二、配置文件1. redis.conf2. docker-compose文件 三、构建集群1. 自动分配主从关系2.1 构建3 master集群2.2 手动配置从节点 四、测试1. 集群结构2. 分片测试 环境 docker desktop for windows 4.23.0redis 7.2 目标 搭建如下图分片主从…

基于Kettle开发的web版数据集成开源工具(data-integration)-应用篇

目录 📚第一章 基本流程梳理📗页面基本操作📗对应后台服务流程 📚第二章 二开思路📗前端📗后端📗后续补充:[Kettle Local引擎源码使用记录](https://renxiaozhao.blog.csdn.net/arti…

简单工厂模式、工厂方法、抽象工厂模式

下面例子中鼠标,键盘,耳麦为产品,惠普,戴尔为工厂。 简单工厂模式 简单工厂模式不是 23 种里的一种,简而言之,就是有一个专门生产某个产品的类。 比如下图中的鼠标工厂,专业生产鼠标&#xf…