神经网络基础部件-卷积层详解
前言
在全连接层构成的多层感知机网络中,我们要通过将图像数据展平成一维向量来送入模型,但这会忽略了每个图像的空间结构信息。理想的策略应该是要利用相近像素之间的相互关联性,将图像数据二维矩阵送给模型中学习。
卷积神经网络(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 浏…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
