神经网络基础部件-卷积层详解
前言
在全连接层构成的多层感知机网络中,我们要通过将图像数据展平成一维向量来送入模型,但这会忽略了每个图像的空间结构信息。理想的策略应该是要利用相近像素之间的相互关联性,将图像数据二维矩阵送给模型中学习。
卷积神经网络(convolutional neural network,CNN
)正是一类强大的、专为处理图像数据(多维矩阵)而设计的神经网络,CNN
的设计是深度学习中的一个里程碑式的技术。在 Transformer
应用到 CV
领域之前,基于卷积神经网络架构的模型在计算机视觉领域中占主导地位,几乎所有的图像识别、目标检测、语义分割、3D目标检测、视频理解等任务都是以 CNN
方法为基础。
卷积神经网络核心网络层是卷积层,其使用了卷积(convolution)这种数学运算,卷积是一种特殊的线性运算。另外,通常来说,卷积神经网络中用到的卷积运算和其他领域(例如工程领域以及纯数学领域)中的定义并不完全一致。
一,卷积
在理解卷积层之前,我们首先得理解什么是卷积操作。
卷积与傅里叶变换有着密切的关系。例如两函数的傅里叶变换的乘积等于它们卷积后的傅里叶变换,利用此一性质,能简化傅里叶分析中的许多问题。
operation 视语境有时译作“操作”,有时译作“运算”,本文不做区分。
1.1,卷积运算定义
为了给出卷积的定义, 这里从现实世界会用到函数的例子出发。
假设我们正在用激光传感器追踪一艘宇宙飞船的位置。我们的激光传感器给出 一个单独的输出 x(t)x(t)x(t),表示宇宙飞船在时刻 ttt 的位置。xxx 和 ttt 都是实值的,这意味着我们可以在任意时刻从传感器中读出飞船的位置。
现在假设我们的传感器受到一定程度的噪声干扰。为了得到飞船位置的低噪声估计,我们对得到的测量结果进行平均。显然,时间上越近的测量结果越相关,所 以我们采用一种加权平均的方法,对于最近的测量结果赋予更高的权重。我们可以采用一个加权函数 w(a)w(a)w(a) 来实现,其中 aaa 表示测量结果距当前时刻的时间间隔。如果我们对任意时刻都采用这种加权平均的操作,就得到了一个新的对于飞船位置的平滑估计函数 sss :
s(t)=∫x(a)w(t−a)das(t) = \int x(a)w(t-a )da s(t)=∫x(a)w(t−a)da
这种运算就叫做卷积(convolution
)。更一般的,卷积运算的数学公式定义如下:
连续定义:h(x)=(f∗g)(x)=∫−∞∞f(t)g(x−t)dt(1)连续定义: \; h(x)=(f*g)(x) = \int_{-\infty}^{\infty} f(t)g(x-t)dt \tag{1} 连续定义:h(x)=(f∗g)(x)=∫−∞∞f(t)g(x−t)dt(1)
离散定义:h(x)=(f∗g)(x)=∑t=−∞∞f(t)g(x−t)(2)离散定义: \; h(x) = (f*g)(x) = \sum^{\infty}_{t=-\infty} f(t)g(x-t) \tag{2} 离散定义:h(x)=(f∗g)(x)=t=−∞∑∞f(t)g(x−t)(2)
以上卷积计算公式可以这样理解:
- 先对函数 g(t)g(t)g(t) 进行反转(
reverse
),相当于在数轴上把 g(t)g(t)g(t) 函数从右边褶到左边去,也就是卷积的“卷”的由来。 - 然后再把 g(t)g(t)g(t) 函数向左平移 xxx 个单位,在这个位置对两个函数的对应点相乘,然后相加,这个过程是卷积的“积”的过程。
1.2,卷积的意义
对卷积这个名词,可以这样理解:所谓两个函数的卷积(f∗gf*gf∗g),本质上就是先将一个函数翻转,然后进行滑动叠加。在连续情况下,叠加指的是对两个函数的乘积求积分,在离散情况下就是加权求和,为简单起见就统一称为叠加。
因此,卷积运算整体来看就是这么一个过程:
翻转—>滑动—>叠加—>滑动—>叠加—>滑动—>叠加…
多次滑动得到的一系列叠加值,构成了卷积函数。
这里多次滑动过程对应的是 ttt 的变化过程。
那么,卷积的意义是什么呢?可以从卷积的典型应用场景-图像处理来理解:
- 为什么要进行“卷”?进行“卷”(翻转)的目的其实是施加一种约束,它指定了在“积”的时候以什么为参照。在空间分析的场景,它指定了在哪个位置的周边进行累积处理。
- 在图像处理的中,卷积处理的结果,其实就是把每个像素周边的,甚至是整个图像的像素都考虑进来,对当前像素进行某种加权处理。因此,“积”是全局概念,或者说是一种“混合”,把两个函数进行时间(信号分析)或空间(图像处理)上进行混合。
卷积意义的理解来自知乎问答,有所删减和优化。
1.3,从实例理解卷积
一维卷积的实例有 “丢骰子” 等经典实例,这里不做展开描述,本文从二维卷积用于图像处理的实例来理解。
一般,数字图像可以表示为如下所示矩阵:
本节图片摘自知乎用户马同学的文章。
而卷积核 ggg 也可以用一个矩阵来表示,如:
g=[b−1,−1b−1,0b−1,1b0,−1b0,0b0,1b1,−1b1,0b1,1]g = \begin{bmatrix} &b_{-1,-1} &b_{-1,0} &b_{-1,1} \\ &b_{0,-1} &b_{0,0} &b_{0,1} \\ &b_{1,-1} &b_{1,0} &b_{1,1} \end{bmatrix} g=b−1,−1b0,−1b1,−1b−1,0b0,0b1,0b−1,1b0,1b1,1
按照卷积公式的定义,则目标图片的第 (u,v)(u, v)(u,v) 个像素的二维卷积值为:
(f∗g)(u,v)=∑i∑jf(i,j)g(u−i,v−j)=∑i∑jai,jbu−i,v−j(f * g)(u, v)=\sum_{i} \sum_{j} f(i, j)g(u-i, v-j)=\sum_{i} \sum_{j} a_{i,j} b_{u-i,v-j} (f∗g)(u,v)=i∑j∑f(i,j)g(u−i,v−j)=i∑j∑ai,jbu−i,v−j
展开来分析二维卷积计算过程就是,首先得到原始图像矩阵中 (u,v)(u, v)(u,v) 处的矩阵:
f=[au−1,v−1au−1,vau−1,v+1au,v−1au,vau,v+1au+1,v−1au+1,vau+1,v+1]f=\begin{bmatrix} &a_{u-1,v-1} &a_{u-1,v} &a_{u-1,v+1}\\ &a_{u,v-1} &a_{u,v} &a_{u,v+1} \\ &a_{u+1,v-1} &a_{u+1,v} &a_{u+1,v+1} \end{bmatrix} f=au−1,v−1au,v−1au+1,v−1au−1,vau,vau+1,vau−1,v+1au,v+1au+1,v+1
然后将图像处理矩阵翻转(两种方法,结果等效),如先沿 xxx 轴翻转,再沿 yyy 轴翻转(相当于将矩阵 ggg 旋转 180 度):
g=[b−1,−1b−1,0b−1,1b0,−1b0,0b0,1b1,−1b1,0b1,1]=>[b1,−1b1,0b1,1b0,−1b0,0b0,1b−1,−1b−1,0b−1,1]=[b1,1b1,0b1,−1b0,1b0,0b0,−1b−1,1b−1,0b−1,−1]=g′\begin{aligned} g &= \begin{bmatrix} &b_{-1,-1} &b_{-1,0} &b_{-1,1}\\ &b_{0,-1} &b_{0,0} &b_{0,1} \\ &b_{1,-1} &b_{1,0} &b_{1,1} \end{bmatrix} => \begin{bmatrix} &b_{1,-1} &b_{1,0} &b_{1,1}\\ &b_{0,-1} &b_{0,0} &b_{0,1} \\ &b_{-1,-1} &b_{-1,0} &b_{-1,1} \end{bmatrix} \\ &= \begin{bmatrix} &b_{1,1} &b_{1,0} &b_{1,-1}\\ &b_{0,1} &b_{0,0} &b_{0,-1} \\ &b_{-1,1} &b_{-1,0} &b_{-1,-1} \end{bmatrix} = g^{'} \end{aligned} g=b−1,−1b0,−1b1,−1b−1,0b0,0b1,0b−1,1b0,1b1,1=>b1,−1b0,−1b−1,−1b1,0b0,0b−1,0b1,1b0,1b−1,1=b1,1b0,1b−1,1b1,0b0,0b−1,0b1,−1b0,−1b−1,−1=g′
最后,计算卷积时,就可以用 fff 和 g′g′g′ 的内积:
f∗g(u,v)=au−1,v−1×b1,1+au−1,v×b1,0+au−1,v+1×b1,−1+au,v−1×b0,1+au,v×b0,0+au,v+1×b0,−1+au+1,v−1×b−1,1+au+1,v×b−1,0+au+1,v+1×b−1,−1\begin{aligned} f * g(u,v) &= a_{u-1,v-1} \times b_{1,1} + a_{u-1,v} \times b_{1,0} + a_{u-1,v+1} \times b_{1,-1} \\ &+ a_{u,v-1} \times b_{0,1} + a_{u,v} \times b_{0,0} + a_{u,v+1} \times b_{0,-1} \\ &+ a_{u+1,v-1} \times b_{-1,1} + a_{u+1,v} \times b_{-1,0} + a_{u+1,v+1} \times b_{-1,-1} \end{aligned} f∗g(u,v)=au−1,v−1×b1,1+au−1,v×b1,0+au−1,v+1×b1,−1+au,v−1×b0,1+au,v×b0,0+au,v+1×b0,−1+au+1,v−1×b−1,1+au+1,v×b−1,0+au+1,v+1×b−1,−1
计算过程可视化如下动图所示,注意动图给出的是 ggg 不是 g′g'g′。
以上公式有一个特点,做乘法的两个对应变量 a,ba, ba,b 的下标之和都是 (u,v)(u,v)(u,v),其目的是对这种加权求和进行一种约束,这也是要将矩阵 ggg 进行翻转的原因。上述计算比较麻烦,实际计算的时候,都是用翻转以后的矩阵,直接求矩阵内积就可以了。
1.4,图像卷积(二维卷积)
在机器学习和图像处理领域,卷积的主要功能是在一个图像(或某种特征) 上滑动一个卷积核(即滤波器),通过卷积操作得到一组新的特征。一幅图像在经过卷积操作后得到结果称为特征映射(Feature Map
)。如果把图像矩阵简写为 III,把卷积核 Kernal
简写为 KKK,则目标图片的第 (i,j)(i,j)(i,j) 个像素的卷积值为:
h(i,j)=(I∗K)(i,j)=∑m∑nI(m,n)K(i−m,j−n)(3)h(i,j) = (I*K)(i,j)=\sum_m \sum_n I(m,n)K(i-m,j-n) \tag{3} h(i,j)=(I∗K)(i,j)=m∑n∑I(m,n)K(i−m,j−n)(3)
可以看出,这和一维情况下的卷积公式 2 是一致的。因为卷积的可交换性,我们也可以把公式 3 等价地写作:
h(i,j)=(I∗K)(i,j)=∑m∑nI(i−m,j−n)K(m,n)(4)h(i,j) = (I*K)(i,j)=\sum_m \sum_n I(i-m,j-n)K(m,n) \tag{4} h(i,j)=(I∗K)(i,j)=m∑n∑I(i−m,j−n)K(m,n)(4)
通常,下面的公式在机器学习库中实现更为简单,因为 mmm 和 nnn 的有效取值范围相对较小。
卷积运算可交换性的出现是因为我们将核相对输入进行了翻转(flip
),从 mmm 增 大的角度来看,输入的索引在增大,但是卷积核的索引在减小。我们将卷积核翻转的唯一目 的是实现可交换性。尽管可交换性在证明时很有用,但在神经网络的应用中却不是一个重要的性质。相反,许多神经网络库会实现一个互相关函数(corresponding function
),它与卷积相同但没有翻转核:
h(i,j)=(I∗K)(i,j)=∑m∑nI(i+m,j+n)K(m,n)(5)h(i,j) = (I*K)(i,j)=\sum_m \sum_n I(i+m,j+n)K(m,n) \tag{5} h(i,j)=(I∗K)(i,j)=m∑n∑I(i+m,j+n)K(m,n)(5)
互相关函数的运算,是两个序列滑动相乘,两个序列都不翻转。卷积运算也是滑动相乘,但是其中一个序列需要先翻转,再相乘。
1.5,互相关和卷积
互相关和卷积运算的关系,可以通过下述公式理解:
Y=W⊗X=rot180(W)∗X\begin{aligned} Y &= W\otimes X \\ &= \text{rot180}(W) * X \end{aligned} Y=W⊗X=rot180(W)∗X
其中 ⊗\otimes⊗ 表示互相关运算,∗*∗ 表示卷积运算,rot180(⋅)\text{rot180(⋅)}rot180(⋅) 表示旋转 180
度,YYY 为输出矩阵。从上式可以看出,互相关和卷积的区别仅仅在于卷积核是否进行翻转。因此互相关也可以称为不翻转卷积.
离散卷积可以看作矩阵的乘法,然而,这个矩阵的一些元素被限制为必须和另外一些元素相等。
在神经网络中使用卷积是为了进行特征抽取,卷积核是否进行翻转和其特征抽取的能力无关(特别是当卷积核是可学习的参数时),因此卷积和互相关在能力上是等价的。事实上,很多深度学习工具中卷积操作其实都是互相关操作,用来减少一些不必要的操作或开销(不反转 Kernal)。
总的来说,
- 我们实现的卷积操作不是原始数学含义的卷积,而是工程上的卷积,但一般也简称为卷积。
- 在实现卷积操作时,并不会反转卷积核。
二,卷积层
在传统图像处理中,线性空间滤波的原理实质上是指指图像 fff 与滤波器核 www 进行乘积之和(卷积)运算。核是一个矩阵,其大小定义了运算的邻域,其系数决定了该滤波器(也称模板、窗口滤波器)的性质,并通过设计不同核系数(卷积核)来实现低通滤波(平滑)和高通滤波(锐化)功能,因此我们可以认为卷积是利用某些设计好的参数组合(卷积核)去提取图像空域上相邻的信息。
2.1,卷积层定义
在全连接前馈神经网络中,如果第 lll 层有 MlM_lMl 个神经元,第 l−1l-1l−1 层有 Ml−1M_{l-1}Ml−1 个 神经元,连接边有 Ml×Ml−1M_{l}\times M_{l-1}Ml×Ml−1 个,也就是权重矩阵有 Ml×Ml−1M_{l}\times M_{l-1}Ml×Ml−1 个参数。当 MlM_lMl 和 Ml−1M_{l-1}Ml−1 都很大时,权重矩阵的参数就会非常多,训练的效率也会非常低。
如果采用卷积来代替全连接,第 lll 层的净输入 z(l)z^{(l)}z(l) 为第 l−1l-1l−1 层激活值 a(l−1)a^{(l−1)}a(l−1) 和卷积核 w(l)∈RKw^{(l)}\in \mathbb{R}^Kw(l)∈RK 的卷积,即
z(l)=w(l)⊗a(l−1)+b(l)z^{(l)} = w^{(l)}\otimes a^{(l−1)} + b^{(l)} z(l)=w(l)⊗a(l−1)+b(l)
其中 b(l)∈Rb^{(l)}\in \mathbb{R}b(l)∈R 为可学习的偏置。
上述卷积层公式也可以写成这样的形式:Z=W∗A+bZ = W*A+bZ=W∗A+b
根据卷积层的定义,卷积层有两个很重要的性质:
- 局部连接:在卷积层(假设是第 lll 层)中的每一个神经元都只和下一层(第 l−1l − 1l−1 层)中某个局部窗口内的神经元相连,构成一个局部连接网络。
- 权重共享:作为参数的卷积核 w(𝑙)w^{(𝑙)}w(l) 对于第 lll 层的所有的神经元都是相同的。权重共享可以理解为一个卷积核只捕捉输入数据中的一种特定的局部特征.因此,如果要提取多种特征就需要使用多个不同的卷积核。
总而言之,卷积层的作用是提取一个局部区域的特征,不同的卷积核(滤波器)相当于不同的特征提取器。为了提高卷积网络的表示能力,可以在每一层使用多个不同的特征映射,即增加卷积核(滤波器)的数量,以更好地提取图像的特征。
2.2,卷积层理解
前面章节内容中,卷积的输出形状只取决于输入形状和卷积核的形状。而神经网络中的卷积层,在卷积的标准定义基础上,还引入了卷积核的滑动步长和零填充来增加卷积的多样性,从而可以更灵活地进行特征抽取。
- 步长(Stride):指卷积核每次滑动的距离
- 零填充(Zero Padding):在输入图像的边界填充元素(通常填充元素是0)
卷积层定义:每个卷积核(Kernel
)在输入矩阵上滑动,并通过下述过程实现卷积计算:
- 在来自卷积核的元素和输入特征图子矩阵的元素之间进行乘法以获得输出感受野。
- 然后将相乘的值与添加的偏差相加以获得输出矩阵中的值。
卷积层数值计算过程可视化如下图 1 所示:
来源论文 Improvement of Damage Segmentation Based on Pixel-Level Data Balance Using VGG-Unet。
注意,卷积层的输出 Feature map
的大小取决于输入的大小、Pad 数、卷积核大小和步长。在 Pytorch
框架中,图片(feature map
)经卷积 Conv2D
后输出大小计算公式如下:⌊N=W−F+2PS+1⌋\left \lfloor N = \frac{W-F+2P}{S}+1 \right \rfloor⌊N=SW−F+2P+1⌋。
其中 ⌊⌋\lfloor \rfloor⌊⌋ 是向下取整符号,用于结果不是整数时进行向下取整(Pytorch
的 Conv2d
卷积函数的默认参数 ceil_mode = False
,即默认向下取整, dilation = 1
),其他符号解释如下:
- 输入图片大小
W×W
(默认输入尺寸为正方形) Filter
大小F×F
- 步长
S
- padding的像素数
P
- 输出特征图大小
N×N
上图1侧重于解释数值计算过程,而下图2则侧重于解释卷积层的五个核心概念的关系:
- 输入 Input Channel
- 卷积核组 WeightsBias
- 过滤器 Filter
- 卷积核 kernal
- 输出 Feature Map
上图是三通道经过两组过滤器的卷积过程,在这个例子中,输入是三维数据 3×32×323\times 32 \times323×32×32,经过权重参数尺寸为 2×3×5×52\times 3\times 5\times 52×3×5×5 的卷积层后,输出为三维 2×28×282\times 28\times 282×28×28,维数并没有变化,只是每一维内部的尺寸有了变化,一般都是要向更小的尺寸变化,以便于简化计算。
假设三维卷积(也叫滤波器)尺寸为 (cin,k,k)(c_{in}, k, k)(cin,k,k),一共有 coutc_{out}cout 个滤波器,即卷积层参数尺寸为 (cout,cin,k,k)(c_{out}, c_{in}, k, k)(cout,cin,k,k) ,则标准卷积层有以下特点:
- 输出的
feature map
的数量等于滤波器数量 coutc_{out}cout,即卷积层参数值确定后,feature map 的数量也确定,而不是根据前向计算自动计算出来; - 对于每个输出,都有一个对应的过滤器 Filter,图例中 Feature Map-1 对应 Filter-1;
- 每个 Filter 内都有一个或多个卷积核 Kernal,对应每个输入通道(Input Channel),图例为 3,对应输入的红绿蓝三个通道;
- 每个 Filter 只有一个 Bias 值,图例中 Filter-1 对应 b1;
- 卷积核 Kernal 的大小一般是奇数如:1×11\times 11×1,3×33\times 33×3。
注意,以上内容都描述的是标准卷积,随着技术的发展,后续陆续提出了分组卷积、深度可分离卷积、空洞卷积等。详情可参考我之前的文章-MobileNetv1论文详解。
2.3,卷积层 api
Pytorch
框架中对应的卷积层 api 如下:
class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
主要参数解释:
in_channels
(int
) – 输入信号的通道。out_channels
(int
) – 卷积产生的通道。kerner_size
(int or tuple
) - 卷积核的尺寸。stride
(int or tuple
,optional
) - 卷积步长,默认值为1
。padding
(int or tuple
,optional
) - 输入的每一条边补充0
的层数,默认不填充。dilation
(int or tuple
,optional
) – 卷积核元素之间的间距,默认取值1
。groups
(int
,optional
) – 从输入通道到输出通道的阻塞连接数。bias
(bool
,optional
) - 如果bias=True
,添加偏置。
示例代码:
###### Pytorch卷积层输出大小验证
import torch
import torch.nn as nn
import torch.autograd as autograd
# With square kernels and equal stride
# output_shape: height = (50-3)/2+1 = 24.5,卷积向下取整,所以 height=24.
m = nn.Conv2d(16, 33, 3, stride=2)
# # non-square kernels and unequal stride and with padding
# m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2)) # 输出shape: torch.Size([20, 33, 28, 100])
# # non-square kernels and unequal stride and with padding and dilation
# m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2), dilation=(3, 1)) # 输出shape: torch.Size([20, 33, 26, 100])
input = autograd.Variable(torch.randn(20, 16, 50, 100))
output = m(input)print(output.shape) # 输出shape: torch.Size([20, 16, 24, 49])
三,卷积神经网络
卷积神经网络一般由卷积层、汇聚层和全连接层构成。
3.1,汇聚层
通常当我们处理图像时,我们希望逐渐降低隐藏表示的空间分辨率、聚集信息,这样随着我们在神经网络中层叠的上升,每个神经元对其敏感的感受野(输入)就越大。
汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用不仅是进降低卷积层对位置的敏感性,同时降低对空间降采样表示的敏感性。
与卷积层类似,汇聚层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为汇聚窗口)遍历的每个位置计算一个输出。然而,不同于卷积层中的输入与卷积核之间的互相关计算,汇聚层不包含参数。相反,池运算是确定性的,我们通常计算汇聚窗口中所有元素的最大值或平均值。这些操作分别称为最大汇聚层(maximum pooling)和平均汇聚层(average pooling)。
在这两种情况下,与互相关运算符一样,汇聚窗口从输入张量的左上⻆开始,从左往右、从上往下的在输入张量内滑动。在汇聚窗口到达的每个位置,它计算该窗口中输入子张量的最大值或平均值。计算最大值或平均值是取决于使用了最大汇聚层还是平均汇聚层。
值得注意的是,与卷积层一样,汇聚层也可以通过改变填充和步幅以获得所需的输出形状。
3.2.,汇聚层 api
Pytorch
框架中对应的聚合层 api 如下:
class 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
,即不填充像素。输入的每一条边补充0
的层数。dilation
:滑动窗中各元素之间的距离。ceil_mode
:默认值为False
,即上述公式默认向下取整,如果设为True
,计算输出信号大小的时候,公式会使用向上取整。
Pytorch
中池化层默认ceil mode = false
,而Caffe
只实现了ceil mode= true
的计算方式。
示例代码:
import torch
import torch.nn as nn
import torch.autograd as autograd
# 大小为3,步幅为2的正方形窗口池
m = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
# pool of non-square window
input = autograd.Variable(torch.randn(20, 16, 50, 32))
output = m(input)
print(output.shape) # torch.Size([20, 16, 25, 16])
四,卷积神经网络结构
一个典型的卷积网络结构是由卷积层、汇聚层、全连接层交叉堆叠而成。如下图所示:
一个简单的 CNN
网络连接图如下所示。
经典
CNN
网络的总结,可参考我之前写的文章-经典 backbone 网络总结。
目前,卷积网络的整体结构趋向于使用更小的卷积核(比如 1×11 \times 11×1 和 3×33 \times 33×3) 以及更深的结构(比如层数大于 50)。另外,由于卷积层的操作性越来越灵活(同样可完成减少特征图分辨率),汇聚层的作用越来越小,因此目前的卷积神经网络逐渐趋向于全卷积网络。
另外,可通过这个网站可视化 cnn
的全部过程。
参考资料
- AI EDU-17.3 卷积的反向传播原理
- Visualizing the Feature Maps and Filters by Convolutional Neural Networks
- 《神经网络与深度学习》-第5章
- 《动手学深度学习》-第6章
- https://www.zhihu.com/question/22298352
相关文章:
神经网络基础部件-卷积层详解
前言 在全连接层构成的多层感知机网络中,我们要通过将图像数据展平成一维向量来送入模型,但这会忽略了每个图像的空间结构信息。理想的策略应该是要利用相近像素之间的相互关联性,将图像数据二维矩阵送给模型中学习。 卷积神经网络(convolu…...
【计算机网络】HTTPS协议原理
文章目录一、认识HTTPS协议二、为什么要发明HTTPS三、HTTP与HTTPS的区别四、常见的加密方式1. 对称加密2. 非对称加密3. 数据摘要4. 数字签名五、HTTPS的原理探究方案1:只使用对称加密方案2:只使用非对称加密方案3:双方都使用非对称加密方案4…...
21岁,华科博士在读,我的赛事Top经验
Datawhale干货 作者:vaew,华中科技大学,博士二年级在读简介笔者vaew,21岁,现为华中科技大学机械科学与工程学院陶波教授课题组博士二年级学生。主要研究方向是基于视触融合的机器人灵巧操作。学业之余的研究兴趣包括图…...
基于ThinkPHP6.0+Vue+uni-app的多商户商城系统好用吗?
likeshop多商户商城系统适用于B2B2C、多商户、商家入驻、平台商城场景。完美契合平台自营联营加盟等多种经营方式使用,系统拥有丰富的营销玩法,强大的分销能力,支持官方旗舰店,商家入驻,平台抽佣商家独立结算ÿ…...
Linux中断
文章目录 前言一、Linux 中断介绍二、中断上文和中断下文三、中断相关函数1 获取中断号相关函数2.申请中断3.释放中断4.中断处理函数四.中断下文之 tasklet1.概念2.Linux 内核中的 tasklet 结构体:3.使用步骤4.相关函数a.初始化 tasklet结构体b.调度 taskletc.杀死 tasklet总结…...
Excel+SQL实战项目 - 餐饮业日销售情况分析仪
目录1、要完成的任务2、认识数据3、SQL数据加工4、excel形成分析仪1、要完成的任务 目标:结合SQL和excel实现餐饮业日销售情况分析仪,如下表: 认识分析仪: 切片器:店面 分为四部分:KPI 、组合图、饼图、数…...
电商导购CPS,京东联盟如何跟单实现用户和订单绑定
前言 大家好,我是小悟 做过自媒体的小伙伴都知道,不管是发图文还是发短视频,直播也好,可以带货。在你的内容里面挂上商品,你自己都不需要囤货,如果用户通过这个商品下单成交了,自媒体平台就会…...
Redis学习【6】之BitMap、HyperLogLog、Geospatial操作命令 (1)
文章目录前言BitMap 操作命令1.1 BitMap 简介1.2 setbit1.3 getbit1.4 bitcount1.5 bitpos[pos:position]1.6 bitop1.7 应用场景二 HyperLogLog 操作命令2.1 HyperLogLog 简介2.2 pfadd2.3 pfcount2.4 pfmerge2.5 应用场景三 Geospatial【地理空间】操作命令3. 1 Geospatial 简…...
JAVA实现心跳检测【长连接】
文章目录1、心跳机制简介2、心跳机制实现方式3、客户端4 、服务端5、代码实现5.1 KeepAlive.java5.2 MyClient.java5.3 MyServer5.4 测试结果1、心跳机制简介 在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点…...
python3.9安装和pandas安装踩坑处理
0、先决条件:系统内最好先安装有gcc、libffi-devel等 1、安装包下载 https://www.python.org/downloads/source/ 2、解压安装包并上传到/usr/local/python3.9 3、打开shell cd /usr/local/python3.9要先把python3.9的所有文件复制到/usr/local/python3.9才会成功…...
2023.2.15每日一题——867. 转置矩阵
每日一题题目描述解题核心解法一:二维表示 模拟解法二:一维表示 模拟题目描述 题目链接:867. 转置矩阵 给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。 矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵…...
【人脸识别】Partial-FC:让你在一台机器上训练1000万个id人脸数据集成为可能!
论文题目:”Killing Two Birds with One Stone: Efficient and Robust Training of Face Recognition CNNs by Partial FC“ -CVPR 2022 代码地址:https://arxiv.org/pdf/2203.15565.pdf 代码地址:https://github.com/deepinsight/insightfac…...
递归方法读取任意深度的 JSON 对象的键值
有以下json字符串 {"name":"John","age":30,"address":{"city":"New York","state":"NY","zip":"10001","coordinates":{"latitude":40.712776,&q…...
黑马redis学习记录:分布式锁
一、基本原理和实现方式对比 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行…...
对React-Fiber的理解,它解决了什么问题?
对React-Fiber的理解,它解决了什么问题?Fiber用来解决什么问题?Fiber是什么?Fiber是如何解决问题的?Fiber用来解决什么问题? JavaScript引擎和页面渲染引擎两个线程是互斥的,当其中一个线程执行…...
【Linux】初学Linux你需要掌握这些基本指令(二)
目录 1.man指令 2.cp指令 3.mv指令 4.tree指令 5.echo指令 6.more指令 7.less指令(重要) 8.head与tail指令 9.date指令 显示时间常用参数: 设置时间常用参数: 10.cal指令 11.find & whereis & which指令 …...
Linux中VI/VIM 编辑器
1、概述所有Linux系统都会内置vi文本编辑器vim是vi的升级版,可以主动以字体颜色分辨语法的正确性,代码补完和编译,错误跳转等功能。2、vi和vim的三种模式基本上 vi/vim 共分为三种模式,分别是一般模式、编辑模式、命令模式2.1、一…...
PDF怎么转换成Word?两种PDF免费转Word方法推荐
不知道你们有没有发现,我们在网上下载的很多资料都是PDF格式的,尽管PDF文件也可以通过专门的PDF编辑器来编辑,但是PDF文档作为版式文档,编辑起来还是存在很多局限性,所有当我们需要大量编辑修改文档的时候,…...
极兔一面:Dockerfile如何优化?注意:千万不要只说减少层数
说在前面 在40岁老架构师 尼恩的读者交流群(50)中,面试题是一个非常、非常高频的交流话题。 最近,有小伙伴面试极兔时,遇到一个面试题: 如果优化 Dockerfile? 小伙伴没有回答好,只是提到了减少镜像层数。…...
SpringBoot+Vue实现酒店客房管理系统
文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏…...
自适应多因素认证:构建不可破解的企业安全防线|身份云研究院
打开本文意味着你理解信息安全的重要性,并且希望获取行业最佳实践来保护你所在组织的信息安全。本文将带你了解多因素认证(MFA:Multi-Factor-Authentication)对于企业信息安全的重要性以及实施方法。 多因素认证(MFA&…...
阶段二8_集合ArrayList_学生管理系统_详细步骤
一.学生管理系统案例 1.需求: 针对目前我们的所学内容,完成一个综合案例:学生管理系统! 该系统主要功能如下: 1.添加学生:通过键盘录入学生信息,添加到集合中 2.删除学生:通过键盘录…...
一篇解决Linux 中的负载高低和 CPU 开销并不完全对应
负载是查看 Linux 服务器运行状态时很常用的一个性能指标。在观察线上服务器运行状况的时候,我们也是经常把负载找出来看一看。在线上请求压力过大的时候,经常是也伴随着负载的飙高。 但是负载的原理你真的理解了吗?我来列举几个问题&#x…...
关于IDM下载器,提示:一个假冒的序列号被用来注册……idea项目文件路径报红
关于IDM下载器,提示:一个假冒的序列号被用来注册……到C:\Windows\System32\drivers\etc 修改目录下面的hosts文件(如果没有修改的权限就右键属性hosts文件修改user的权限为完全控制),在hosts里面增加以下内容…...
JVM - 高效并发
目录 Java内存模型和内存间的交互操作 Java内存模型 内存间的交互操作 内存间交互操作的规则 volatile特性 多线程中的可见性 volatile 指令重排原理和规则 指令重排 指令重排的基本规则 多线程中的有序性 线程安全处理 锁优化 锁优化之自旋锁与自适应自旋 锁优…...
中小学智慧校园电子班牌系统源码 Saas云平台模式
智慧电子班牌区别于传统电子班牌,智慧校园电子班牌系统更加注重老师和学生的沟通交流和及时数据交互。学校为每个教室配置一台智能电子班牌,一般安装于教室门口,用来实时显示学校通知、班级通知,可设置集中分布式管理,…...
记录一次服务器被攻击的经历
突然收到阿里云发过来的异常登陆的信息: 于是,急忙打开电脑查看对应的ECS服务器的记录: 发现服务器的cpu占用率异常飙升,所以可以大概断定服务器已经被非法入侵了。 通过自己的账号登陆后,发现sshd服务有异常的链接存…...
Python解题 - CSDN周赛第29期 - 争抢糖豆
本期问哥是志在必得,这本算法书我已经觊觎许久,而之前两次因为种种原因未能如愿。因此,问哥这几天花了不少时间,把所有之前在每日一练做过的题目重新梳理了一遍。苦心人,天不负,感谢官方大大! 第…...
C代码中访问链接脚本中的符号
一、目的在之前的《GNU LD脚本命令语言(一)》、《GNU LD脚本命令语言(二)》我们介绍了GNU链接脚本的知识点,基本上对链接脚本中的SECTION、REGION、以及加载地址与执行地址的关系等内容有了一定的了解。本篇主要讲解链…...
MySQL 8:MySQL索引
索引就是通过一定的算法建立数据模型,用于快速查找某一列中具有特定值的行。如果没有索引,MySQL 必须从第一条记录开始读取整个表,直到找到相关的表。表越大,查询数据所花费的时间就越多。如果表中查询的列有索引,MySQ…...
网站的按钮怎么做 视频/网络营销的策划流程
在几个月之前,我在Firefox浏览器中发现了一个安全漏洞,这个漏洞就是CVE-2019-17016。在分析这个安全漏洞的过程中,我发现了一种新技术,即利用单一注入点从Firefox浏览器中提取CSS数据。在这篇文章中,我将跟大家详细介绍…...
网站建设哪家公司靠谱/it行业培训机构哪个好
Collection和Collections有什么区别? Collections (1)是一个工具类,提供了大量处理容器的方法。 (2)它包含有各种有关集合操作的静态多态方法 (3)不能实例化,可用于对集…...
wordpress百度地图/网络营销的方式有十种
近些年,很多企业在大力发展的同时,也被固定资产的管理问题所困扰。由于固定资产的数量大,种类多,使用部门分散,供应商不同,管理难度大等特点。传统的手工录入或财务管理软件不仅效率低,速度慢&a…...
南京十大软件公司排名/淘宝关键词优化技巧教程
前言:医院的视频监控系统如何设计呢?需要考虑哪些方面呢?如何规划呢?今天分享一下医院项目视频监控系统建设思路,仅供参考。正文:一、系统规划系统要求建立一个集数字视频图像采集、传输、处理、控制、指挥…...
初中做网站用什么软件/厦门网站到首页排名
1.lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。 1.2 lucene的工作方式 lucene提供的服务实际包含两部分࿱…...
郑州市政府网站的建设与发展/网络事件营销
1. 在 app 目录下新建一个文件 helpers.php 2. 在 composer.json 文件的 autoload 字典中添加 "files":["app/helpers.php"] 3. 执行命令:composer dumpautoload OK搞定 4. 这其实是与composer中的自动加载有关 -> 链接 转自:htt…...