当前位置: 首页 > news >正文

【深度学习入门】深度学习知识点总结

一、卷积

(1)什么是卷积

定义:特征图的局部与卷积核做内积的操作。

作用:① 广泛应用于图像处理领域。卷积操作可以提取图片中的特征低层的卷积层提取局部特征,如:边缘、线条、角。

② 高层的卷积从低层的卷积层中学到更复杂的特征,即局部特征的组合,如前景与背景的组合,从而实现图片的分类和识别。

(2)卷积的特点

主要特点:局部感知和权值共享。

局部感知卷积的大小远远小于图像局部的像素联系比较密切,而距离较远的像素相关性较弱。因此,每个特征没必要对全局图像进行感知,只需对局部进行感知,然后在更高层将局部的信息 综合起来得到全局信息。

权值共享:使用相同的卷积核去提取特征,参数可以共享。带来了平移不变性:无论目标物体平移变换到图像中的哪个位置,卷积核都能以相同的方式(卷积核相同)对其进行处理,提取出相同的特征。

(3)卷积和全连接的区别

输入输出的结构卷积输入输出都是 NCHW (批次大小、通道数、高度、宽度)格式,全连接输入输出都是 NV (批次大小、特征向量维度)结构。

知识点补充:深度学习框架中,数据一般是4D,如NCHW,分别代表 Batch(N)、Channel(C)、Height(H)、Width(W)。如:假设N=2,C=16,H=5,W=4,逻辑上就是如下4D图:

        计算机存储上是一维的二进制,因此存取数据的顺序是:①W方向②H方向③C方向④N方向。用上图举例,即(W)000、001、……、(H)004、005、……、019、(C)020、021、……、039、(N)320、……、639。

        全连接会把一整个特征图拉成一个向量(V),因此只有NV两个维度。

层之间的连接方式全连接网络两层之间的神经元是两两相连(两层各任选出一个神经元,这两个神经元是连接的),卷积部分相连(提取的特征只与卷积核覆盖的局部图像的特征有关)。

全连接不适合做 CV:① 全连接导致参数量过多,提高过拟合风险,即在训练集上表现好,在测试集上表现差,扩展性差

② 使用Sigmoid激活函数,它的导数值最大为0.25,网络每更深一层,梯度值就会乘上一个不超过0.25的导数,使梯度值越来越小,甚至“梯度消失”。因此,全连接网络存在局限,梯度传播很难超过 3 层

 邻近像素关联性强,距离较远像素关联性弱。全连接网络将每个像素视为独立特征没有利用像素之间的位置关系信息

卷积适合做 CV:① 局部连接(卷积核只有局部特征图的大小)、权重共享(使用相同的卷积核)、池化(压缩特征图尺寸,随之使用的卷积核尺寸减小),参数量大大减少

使用Relu激活函数,其在正值区域梯度恒为1,避免了Sigmoid激活函数在极端值处梯度消失的问题,有利于深层网络训练

③ 局部感知利用了像素之间的位置关系信息

(4)卷积的相关计算

卷积结果的长、宽计算公式

H_{2}=\frac{H_{1}-F_{H}+2P}{S}+1

W_{2}=\frac{W_{1}-F_{W}+2P}{S}+1

        计算结果向下取整H_{1}W_{1}表示输入数据的长、宽;F_{H}F_{W}表示卷积核的长、宽;P表示边缘填充的宽度,乘以2是因为数据的两边都会填充P的宽度;S为滑动窗口的步长。

卷积层参数量的计算

C_{out}*\left ( F_{H}*F_{W}*C_{in} \right )+C_{out}

        F_{H}表示卷积核的高度,F_{W}表示卷积核的宽度,C_{in}表示输入的通道数(卷积核的通道数),C_{out}表示输出的通道数(卷积核的个数)。结尾再加C_{out},是因为每个卷积核还有一个偏置项。

(5)感受野

定义:输出特征图上的一个特征点对应于原图像素点的映射区域的大小。

来源:VGG网络提出,通过堆叠多层小卷积核(如3*3)代替一层大卷积核(如5*5、7*7),保持了与大卷积核相同的感受野,并增加了其它优势

减少了网络的参数,随之降低了过拟合风险、提高了计算速度。

② 卷积层越多,每层专注于学习更简单的问题,提取的特征越细致

③ 卷积层越多,加入的非线性变换越多(Relu激活函数),可以表现更复杂的东西。

有效感受野:① 实际上的有效感受野(认为每个像素的贡献不同)远远小于理论感受野(认为每个像素的贡献相同)。并且越靠近感受野中心的特征值,在卷积层中被使用次数越多,即对输出层的特征图点的贡献越大即越有效,如下图所示:

        x表示卷积层的输入,w表示卷积层的权重,o表示卷积层的输出。靠感受野边缘的特征x_{1,1}只参与了o_{1,1}^{1}的计算,而靠中间的x_{3,3}参与了第一层输出的所有特征值的计算。因此,x_{1,1}只能通过o_{1,1}^{1}来影响o_{1,1}^{2},而x_{3,3}能通过o_{1,1}^{1}o_{1,2}^{1}o_{1,3}^{1}o_{2,1}^{1}o_{2,2}^{1}o_{2,3}^{1}o_{3,1}^{1}o_{3,2}^{1}o_{3,3}^{1}来影响o_{1,1}^{2},很明显,x_{3,3}x_{1,1}o_{1,1}^{2}更有效。输出层的特征点的感受野有效性,类高斯分布向边缘递减,如下图所示:

② anchor 应该与有效感受野相匹配。

感受野大小计算公式

注意:① 第一层卷积层的输出特征图像素的感受野的大小等于滤波器(卷积核)的大小

② 深层卷积层的感受野大小和它之前所有层的滤波器大小和步长有关

③ 计算感受野大小时,忽略了图像边缘填充的影响,即不考虑 padding 的大小。以下公式,是从输入层开始,逐渐迭代计算到输出层的特征的感受野。

l_{k}=l_{k-1}+\left [ \left ( f_{k}-1 \right )*\prod_{i=1}^{k-1}s_{i} \right ]

        其中 l_{k-1} 表示第 k-1 层输出的特征图对应的感受野大小;f_{k} 表示第 k 层的卷积核、或者池化层的池化大小;s_{i} 表示第 i 层的滑动窗口步长;初始值 l_{0} 为1。用以下的一个例子示范感受野大小的计算:

第一层输出的感受野:l_{1} =1+(3-1)=1+2=3

第二层输出的感受野: l_{2}=3+(2-1)*1=3+1=4

第三层输出的感受野:l_{3}=4+(3-1)*1*2=4+4=8

        神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次

        如果使用的是空洞卷积,公式则如下:

l_{k}=l_{k-1}+\left [ \left ( f_{k}-1 \right )*\prod_{i=1}^{k-1}s_{i} \right ]*dilation_{k}

        其中 dilation_{k} 表示第 k 层的空洞率。

(6)反卷积(转置卷积)

作用:主要用于上采样,就是扩大输入特征图的尺寸;还可以用来近似重构输入图像卷积层可视化

运算步骤:以下的 k 表示卷积核尺寸;s 表示每个像素间的距离,如下图所示:

        p 表示初始卷积核可以卷积到图像的尺寸,如下图所示:

① 填充输入特征图:在输入特征图的元素间填充 s-1 长度的行和列,填充值为0;在特征图四周填充 k-p-1 长度的行和列,填充值为0。

② 翻转卷积核:上下、左右翻转。

③ 做普通的卷积运算。 

        可以看到转置卷积最终还是做普通的卷积,因此,转置卷积是一种特殊的正向卷积

示例:

 动图来源于:GitHub - vdumoulin/conv_arithmetic: A technical report on convolution arithmetic in the context of deep learning

        上面动图的蓝色部分是输入特征图,虚线部分是对输入特征图的填充,绿色部分是输出特征图,总的效果是从输入特征图的3*3变为输出特征图的5*5,尺寸变大。假设上图的s=2,p=1,k=3,则元素间距填充:2-1=1;边缘填充:3-1-1=1。在做普通卷积的时候,padding为0,stride为1

输出特征图的长、宽计算公式

H_{out}=(H_{in}-1)\times stride[0]-2\times padding[0]+kernel_size[0]

W_{out}=(W_{in}-1)\times stride[1]-2\times padding[1]+kernel_size[1]

        如果使用空洞卷积或者做普通卷积的时候padding不为0,那么用如下的公式:

H_{out}=(H_{in}-1)\times stride[0]-2\times padding[0]+dilation[0]\times(kernel_size[0]-1)+output_padding[0]+1

W_{out}=(W_{in}-1)\times stride[1]-2\times padding[1]+dilation[1]\times(kernel_size[1]-1)+output_padding[1]+1

        其中 dilation 表示空洞率,output_padding 表示做普通卷积时的边缘填充宽度。

转置卷积运算步骤的推导:以下图的普通卷积为例子,步长为1,边缘填充宽度为0,卷积核尺寸为3。

        在理论讲述普通卷积的计算时,说都是以滑动窗口的形式计算的,但是这种滑动的方式非常低效,因此,在实际计算时用了下面的一种计算方法:

        ① 将卷积核转换为跟输入特征图尺寸相同的等效矩阵

        ② 将输入特征图展平为行向量:

        ③ 将所有等效矩阵展平为列向量,并合并为一个矩阵:

        ④ 最后将输入特征图与卷积核等效矩阵相乘,就能得到输出特征图:

        现在有一个问题,如果知道卷积核参数C以及输出矩阵O,那么可以计算输入矩阵I吗?可能会说,在两边都乘以一个C的逆矩阵就行了,但是逆矩阵必须为方阵,而C并不是方阵,因此,这个方法行不通,反卷积不是卷积的逆运算。现在放宽条件,不要求计算原始输入矩阵 I,只要求与原始输入矩阵相同尺寸的矩阵,这样便是可以的,方法如下:

        将输出矩阵 O,乘以卷积核等效矩阵的转置 C^{T},得到大小为 1*16 的矩阵 P,可以看到它与输入矩阵 I 的参数不同,但尺寸相同。最终效果是,把一个 2*2 的矩阵上采样,扩展为一个4*4 的矩阵。因此,反卷积操作不能还原出卷积之前的特征图,只能还原出卷积之前特征图的尺寸

        接下来讲述的是反卷积运算步骤是怎么来的:

        ① 把矩阵 O 还原为 2*2 的矩阵形式,把 C^{T} 的每一列变为 2*2 的等效矩阵形式,再将 O 与每一个等效矩阵在相应位置相乘相加,就能得到矩阵 P :

        与之还有一种等效的做法,将下图的绿色矩阵在填充后的矩阵 O 上滑动做卷积,会发现得到的结果与 P 一模一样。下图是将绿色矩阵与第一个滑动窗口相计算:

        实际上,绿色矩阵就是一开始用卷积核 kernel 在 4*4 的输入特征图上做普通卷积得到 2*2 的输出特征图中的卷积核的上下、左右的翻转矩阵

(7)空洞卷积

作用:在保持输出特征图的尺寸与输入特征图的尺寸一致的条件下,扩大输出特征图像素的感受野,并能保证不会因为下采样而丢失信息。通常情况下,为了扩大感受野,会进行下采样,然后用上采样还原到原图的尺寸,但下采样造成的信息丢失,在上采样中是无法弥补的。因此,为了避免因下采样而造成更多的信息丢失,就使用空洞卷积。

为什么扩大了感受野:在空洞卷积中,加入了一个新参数 dilation 表示空洞率,空洞率就是卷积核的参数间的间隔,参数间空的部分填充0,扩大了实际上的卷积核尺寸,因此会扩大感受野。如下图的所示,蓝色表示输入,绿色表示输出,深蓝色表示卷积核参数:

         在卷积核的参数个数都为9的情况下,传统卷积的感受野是 3*3 ,而空洞卷积的感受野是 5*5。

为什么能保持尺寸不变:上图中的空洞卷积后的特征图尺寸变小,是因为没有对输入图像进行边缘填充。对输入特征图进行边缘填充(padding不为0),输入特征图的信息全保留了下来(不像用池化进行下采样,比如 max-pooling 只保留局部的最大特征值,造成信息丢失),并让输入图像的尺寸变大,再做空洞卷积就能保持输入和输出的尺寸不变。

卷积核尺寸计算:k 为原始卷积核尺寸,r 为空洞率。

K=k+(k-1)(r-1)

存在的问题——网格效应(gridding effect):空洞卷积后得到的像素值对应于原特征图上的感受野范围内,使用到的原特征图上的像数值并不连续,存在间隔,导致丢失部分信息

        假如对一张17*17的特征图(layer1)进行3次卷积核尺寸为3*3,空洞率为2,步长为1的空洞卷积,网络层次结构如下图所示:

        下图中有颜色的部分表示做3次空洞卷积后,输出特征图中的一个像素对应于该层的感受野。比如输出特征图 layer4 中的像素 x_{4,1} 在 layer1 中的感受野范围是 13*13,在 layer2 中的感受野范围是 9*9。

        先从 layer1 开始执行第一次空洞卷积,会利用到所有带颜色的像素点,得到 layer2 中所有带颜色的像素点;再执行第二次空洞卷积,会利用 layer2 中所有带颜色的像素点,得到 layer3 中所有带颜色的像素点;执行第三次空洞卷积,只用到了黄色的像素点,得到 layer4 中的像素 x_{4,1}

        再反过来看,layer4 中的像素 x_{4,1} 只利用了 layer3 中黄色的像素点;layer3 中黄色的像素点只利用了 layer2 中黄色的像素点(layer2 中黄色的像素点上的数字表示被 x_{4,1} 利用的次数);layer2 中黄色的像素点只利用了 layer1 中黄色的像素点。如果计算 layer1 中黄色像素点被 x_{4,1} 利用的次数, 比如 layer1 上的像素 x_{1,3} 被 layer2 上的像素 x_{2,1}x_{2,2}x_{2,3} 利用,这3个像素点被 x_{4,1} 利用的次数分别是 1、2、3,那么  x_{1,3}  被 x_{4,1} 利用的次数就是 1+2+3=6。

        按照上面的方法计算,最终会得到原特征图中所有被 x_{4,1}  利用的像素点以及被利用的次数,如下图所示,右边的颜色条表示像素被利用次数的程度:

        可以看到经过几层相同空洞率的空洞卷积后,输出特征图的像素对应输入特征图的感受野范围内的像素并不是都被利用到的,造成信息丢失。输入特征图的像素参与运算次数也分布不均,利用次数多的特征可能对分割结果产生更多影响

        如果3次空洞卷积的空洞率改为1、2、3,网络层次如下:

        同3个空洞率为2的空洞卷积类似,得到被 layer4 的一个像素利用的像素(黄色)以及被利用的次数,如下图所示:

        完整的 layer1 的像素被利用次数:

        可以发现分别用空洞率为1、2、3的空洞卷积结果,连续地使用了原特征图的所有特征。因此,设置合适的混合空洞率参数,可以更好地避免信息丢失

设计膨胀系数的方法——混合空洞卷积(Hybrid Dilated Convolution,HDC)

建议1:假如有 N 层空洞卷积,卷积核尺寸为 K*K,每层的空洞率为 \left [ r_{1},......,r_{i},......,r_{n} \right ]M_{i} 表示第 i 层两个非零元素(被利用到的元素)的最大距离,M_{i} 的计算公式为:

M_i=max[M_{i+1}-2r_i,-\left (M_{i+1}-2r_i \right ),r_i]

        并且M_{n}=r_{n},如果满足条件:M_{2}\leq K,则空洞率设计合适,否则不合适。

        例如:K = 3,r = [1, 2, 5],则M_{3}=5M_{2}=max(1,-1,2)=2,满足条件 M_{2}\leq K,因此设计合适。最高层像素利用最低层像素信息情况如下图所示,所有像素都被利用:

        又例如:K = 3,r = [1, 2, 9],则M_{3}=9M_{2}=max(5,-5,2)=5,不满足条件 M_{2}\leq K,因此设计不合适。最高层像素利用最低层像素信息情况如下图所示,非零像素间最大间隔为3,用公式也可以求得(M_{1} = max\left ( 5-2*1, -(5-2*1), 1 \right )=3),部分信息丢失:

        从上面两个例子可以观察到,r_{1} 都为1,这是因为,如果想要最底层的像素都被利用,那么M_{1} 应该为1,而 M_{1} 是取 M_{2}-21,-\left (M_{2}-2r1 \right ),r1 三者的最大值,那么 r_{1} 肯定小于等于M_{1},故 r_{1} 肯定设计为 1

建议2:将膨胀系数设计为锯齿结构,例如 r = [1, 2, 3, 1, 2, 3],重复给定的 1, 2, 3。

建议3:膨胀系数的公约数不能大于1,例如 r = [2, 4, 8],公约数为2 大于 1,它的最低层像素利用结果如下图所示,可以看到部分像素未被利用:

        下面是真实标签、未使用HDC设置方法、使用HDC设计方法的分割效果对比:

        可以看到没有使用 HDC设计方法的预测效果存在很多细节上的问题,如上图中第二行,红色线框出来的部分。

缺点:① 局部信息丢失:由于空洞卷积的计算方式类似于棋盘格式,某一层得到的卷积结果中的邻近像素,来自上一 层的独立的子集,没有相互依赖,因此该层的卷积结果之间没有相关性(邻近像素点的集合作为局部信息,应该有相关性,现在却没有了)。例如下图所示:

        x1, x2 是第一层卷积结果 layer2 中的两个邻近像素点,x1 由 x3、x5、x7 计算得来,x2 由 x4、x6、x8 计算得来,这两个子集互相独立,导致卷积结果 x1, x2 没有相关性。

远距离信息不相关:原本的卷积神经网络在较深层,才会去处理两个间隔较远的像素特征。由于空洞卷积稀疏的采样输入信号,让间隔较远的特征早早地发生了相关运算,使得远距离信息的特征可能提取不好(远距离信息原本不相关,却强行将它们进行相关运算,卷积提取的特征效果就差)。

        空洞率过大,适合分割大物体,但小物体的分割效果糟糕。

(8)可分离卷积

        可分离卷积分为空间可分离卷积和深度可分离卷积,空间是指 [height, width] 两个维度,深度是指 channel 维度。

① 空间可分离卷积

运算步骤:空间可分离卷积就是将 n * n 的卷积分成 n ∗ 1 和 1 ∗ n 两步计算。比如将一个 3 * 3 的卷积核拆分成一个 3 * 1 的向量和一个 1 * 3 的向量,如下图所示:

优点节省计算成本。如果做普通卷积,如下图所示,一共要做 9 次卷积,每次卷积要做 9 次乘法,一共要做 9 * 9 = 81 次乘法。

        现在把 3 * 3 的卷积核拆分成个向量,分别做卷积,如下图所示:

        第一次卷积:一共要做 15 次卷积,每次卷积要做 3 次乘法,一共要做 15 * 3 = 45 次乘法;第二次卷积:一共要做 9 次卷积,每次卷积要做 3 次乘法,一共要做 9 * 3 = 27 次乘法;总共做了 45 + 27 = 72 次乘法。

缺点:这种方法具有局限性,并非所有卷积核都可以分为两个较小的卷积核。如果用空间可分离卷积代替所有传统的卷积,在训练过程中,将限制卷积核的类型,训练结果可能不是最佳的。因此,一般情况下很少用到。

② 深度可分离卷积

运算步骤:将标准卷积操作分为逐深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。

        对于普通卷积,一张特征图的 3 个通道会分别于卷积核的 3 个通道做卷积,最后将 3 个结果合并作为最终输出,如下图所示(一共有 4 个卷积核):

        使用的参数数量:3 * 3 * 3 * 4 = 108 个。

        而深度可分离卷积分为了两步。逐深度卷积:卷积核是二维的,个数与特征图的通道数一致,分别卷积后得到 3 张特征图,这一步的目的是特征提取,如下图所示:

        使用的参数数量:3 *3 * 3 = 27 个。

        逐点卷积:卷积核恢复三维,但大小都是 1 * 1 的。为了对比,卷积核个数与上面的普通卷积中一致,为 4 个,最后得到的特征图数量与卷积核个数一致。这一步的目的是通道间信息交互和合并,如下图示:

        使用的参数数量:1* 1 * 3 * 4 = 12 个。两步总共的参数数量:27 + 12 = 39 个。

优点可大幅度减少卷积的参数

缺点:在逐深度卷积这一步,卷积核太少,得到特征图太少,获取到的有效信息较少,从而造成精度损失。因此,模型大小可能会显著降低,模型的能力可能会变得不太理想。最近一些研究的解决办法就是,增加第二步逐点卷积的卷积核个数,从而增加输出特征图的通道数。

(9)分组卷积

运算步骤:设原通道为 C_{in},目标通道为 C_{out}将输入特征图按通道均分为 g 组,然后对每一组进行常规卷积。分组后,每组输入特征图的通道数为 C_{in}/g,所以每个卷积核的通道数也降低到 C_{in}/g 。一个卷积核可以计算一张特征图,如果每组有 n个卷积核,则目标通道数 C_{out} = n * g,即 C_{in} 和 C_{out} 都是 g 的倍数,如下图所示:

优点:① 减少大量参数,从而减少运算量。若输入特征图大小为 n * n ,卷积核大小为 m * m,相同输入输出大小的情况下,普通卷积使用的参数个数为:C_{out} * (m * m * C_{in}),分组卷积使用的参数个数为:C_{out} * \left [ m * m * (C_{in} / g) \right ],分组卷积比普通卷积少了 g 倍

② 隔绝不同组的信息交换。如每个输出与输入的一部分特征图相关联时,分组卷积可以取得比常规卷积更好的性能,如输出通道为2,它们分别只与输入的1,2和3,4通道相关,这时最好使用g=2的分组卷积,相当于直接让模型将不相关的输入通道权重设置为零(不相关的输入通道之间不必再做计算),加快模型收敛。如下图所示:

缺点:对于需要考虑所有输入特征图信息的情况,分组卷积会降低模型的性能。这个问题,常常在两个分组卷积之间加入Channel_Shuffle模块打乱通道顺序,从而实现不同分组间的信息交换。如下图所示:

        如果 g=C_{in},就变成了逐深度卷积;如果 g=C_{in},而且卷积核的 size 等于输入的 size,就变成了全局加权池化,权重是可学习的。

(10)可变形卷积

运算步骤:首先看普通卷积的公式:\mathbf{y}(\mathbf{p}_0)=\sum_{\mathbf{p}_n\in\mathcal{R}}\mathbf{w}(\mathbf{p}_n)\cdot\mathbf{x}(\mathbf{p}_0+\mathbf{p}_n)p_{0} 就是当前处理的窗口的中心像素的坐标,如(3, 4),如下图所示:

p_{n} 就是相对于中心像素的窗口内其它像素的相对位置,它们组成矩阵RR 定义了卷积操作的 kernel size 和 dilation。如果 dlilation=2,相对位置就由加减 1 变为加减 2,如下图所示:

\mathbf{x}(\mathbf{p}_0+\mathbf{p}_n) 就是输入图像中 \mathbf{p}_0+\mathbf{p}_n 位置的像素值,\mathbf{w}(\mathbf{p}_n) 就是卷积核中 \mathbf{p}_n 位置的权重。而可变形卷积公式加了一个 \Delta\mathbf{p}_n,表示滑动窗口中每个像素的位置偏移量

\mathbf{y}(\mathbf{p}_0)=\sum_{\mathbf{p}_n\in\mathcal{R}}\mathbf{w}(\mathbf{p}_n)\cdot\mathbf{x}(\mathbf{p}_0+\mathbf{p}_n+\Delta\mathbf{p}_n)

\Delta\mathbf{p}_n 是一个学习到的值,通过普通卷积计算而来,是浮点型数据。假设对输入图像中以第3行,第4列为中心的滑动窗口的右上角像素为例,说明可变形卷积的运算过程:

① 计算 \Delta\mathbf{p}_n:计算 \Delta\mathbf{p}_n 的普通卷积的输入就是可变形卷积的输入(in_channel = 输入图像的 channel);out_channel = 2 * kernel_size^2;其它的参数,如 kernel_size、stride、padding 都与可变形卷积一样,因此它的输出 size 也与可变形卷积一样。例如,输入图像的 channel 为 3,那么 out_channel = 2*3*3=18,如下图所示:

        左边的黄色部分是当前做卷积的窗口,右边的黄色部分是得到的结果,有18个像素值,将它们 reshape 为\Delta R,如上图所示,每个元素就是\Delta\mathbf{p}_n表示当前处理的滑动窗口中每个像素的位置偏移量(x, y)。滑动窗口中右上角的像素值的\Delta\mathbf{p}_n就是(1.6, 3.2)。

② 计算亚像素点位置\mathbf{p}=\mathbf{p}_{0}+\mathbf{p}_{n}+\Delta\mathbf{p}_{n} =(3,4)+(-1, 1)+(1.6, 3.2)=(3.6, 8.2),是浮点型数据,(3.6,8.2)临近的4个像素点分别为(3,8)、(3,9)、(4,8)、(4,9),如下图中的紫色部分:

紫色部分中的红色点就是亚像素点,即偏移位置,它的像素值 p_{3} 通过双线性插值法求得。同理求得窗口中其它像素点的偏移后的像素值。

③ 做普通卷积

优点:通过左右对比可以明显的看出,可变形卷积的采样位置更符合物体本身的形状和尺寸,而标准卷积的形式却不能做到这一点。相比原始的卷积它更能排除背景噪声的干扰得到更有用的信息

(11)1 * 1 卷积

起源:在 2014 年 GoogleNet 中首先应用。

作用

① 实现跨通道的交互和信息整合。比如图中,输入的三个通道会与卷积核的三个通道分别做卷积,然后将三个结果的对应位置相加,即对不同通道上的特征进行线性组合,得到一个通道的特征图。

② 进行卷积核通道数的降维和升维。比如图中,使用两个 1 * 1卷积核,没有改变输入和输出的 size但 channel 减少,实现降维(3 channel 变为 2 channel)。

③ 可以实现与全连接层等价的效果。比如图中,将输入的 3 个通道分别拉成 [16 * 1] 的向量 1、2、3,作为三个神经元,通过卷积核1的3个通道、卷积核2的3个通道计算得到两个 [16 * 1] 的向量神经元 4、5,它们是全连接的。

④ 加入非线性(卷积后紧跟激活函数层)。

⑤ 减少参数及计算量(MobileNet)。这一想法最早在GoogleNet中被提出,比如说如下两个Inception模块:

情况1,使用 1 * 1 卷积:

 1*1卷积部分: 96*32*1*1=3072个;3*3卷积部分 32*48*3*3=13824个;总计16896个训练参数。

情况2,不使用 1 * 1 卷积:

总计 96*48*3*3 = 41472个训练参数。

        从实际上来看,带1*1卷积的模型参数量更少,本质原因是因为1*1的卷积对数据的特征向量进行了降维的处理,使得特征通道数目先有了一定的减少(降维导致通道数减少,从而参数量减少)。

(12)3D 卷积

2D卷积,卷积核通道数与输入图像通道数一致

3D卷积:

        3D卷积的卷积核有3个维度,并且卷积核通道数小于特征图通道数,卷积核可在 h,w,c 三个方向移动。

二、池化

(1)池化的作用

池化即下采样。

① 减小特征图的 size,保留主要的特征,从而减少参数和计算量,达到降维的效果。

② 防止过拟合,增强模型泛化性能。

③ 扩大感受野

④ 实现平移旋转不变性。因为池化不断抽象了区域的特征而不关心位置,所以池化一定程度上增加了平移不变性。比如,用平均池化、最大池化,把窗口内像素点位置改变了,平均值、最大值还是一样的。

(2)池化的分类

最大池化:选取池化窗口中的最大值作为输出。

平均池化:选取池化窗口中像素的平均值作为输出。

③ 全局平均池化:在 Class Activation Mapping(CAM)中提出,就是对每个通道的整个特征图进行平均池化,生成对应于每个通道的汇聚特征值,最终得到一个汇聚特征向量。一般用于后面的全连接层

④ 金字塔池化:目前流行的CNN都需要固定 size 和 scale 的输入图片,基本上都是通过剪裁(crop) 和缩放 (wrap),这种处理方式存在弊端:crop 的图片可能不包含整个物体;wrap 导致物体变形;当物体大小改变时,预定义的 scale 可能不适合物体的变化。如下图所示:

CNN网络对于固定输入的要求,主要在全连接的分类器层(输入必须与权重矩阵匹配),而特征提取层可以通过控制卷积核尺寸调节,来接受各种 scale 和 size 的输入,得到固定的特征输出。因此,可以通过一种叫做空间金字塔池化(Spatial Pyramid Pooling, SPP)的方法,将不同尺寸的输入,进行多个尺度的池化,然后展开并拼接出一个固定大小的向量,从而连接到全连接层。

        如下图所示,一张任意大小的图片在经过一系列的卷积层后,产生了256个特征图(最后一个卷积层有256个卷积核),大小不固定。将每张特征图都分别分成16, 4, 1份,然后做最大池化。处理完所有的特征图后,将池化结果进行拼接,得到的向量是固定长度的。在这个例子中,这个向量的长度为 (16+4+1) * 256。

        SPP 避免 crop 和 warp 操作导致一些信息丢失多尺度池化有助于捕捉不同规模的特征,总体来说提高了模型准确率

⑤ 全局加权池化:分组卷积提到。

(3)池化结果 size 的计算公式

        同卷积一样,但是是向上取整

(4)池化能减小特征提取的误差

        特征提取的误差主要来自两个方面:

邻域大小受限造成的估计值方差增大:进行卷积操作时,卷积核覆盖的区域(即邻域)是有限的,意味着只能基于这一小块区域内的像素来估计整个图像在该位置的特征。因为这个估计基于有限的信息,所以存在不确定性,这种不确定性在统计学上表现为估计值的方差增大。方差增大意味着估计值的波动范围较大,即估计值可能偏离真实值较远,且不确定性增大

② 卷积层参数误差造成估计均值的偏移:卷积层中的参数,由于训练数据的限制、模型的复杂度以及优化算法的性能等因素,可能会存在误差。这种误差会导致对特征值的估计产生偏移,即估计的均值与真实值之间存在差距

        平均池化能减小第一种误差:因为平均值能够平滑掉一些随机波动,使得估计更加稳定,能更多地保留图像整体或背景信息。因为背景信息通常较为平滑,不易受局部波动影响。

        最大池化能减小第二种误差:最大值对邻域内的变化更加敏感,能够捕捉到更为显著的特征,这些特征往往与纹理信息紧密相关。因此,最大池化能够更多地保留图像局部显著特征或纹理信息

(5)池化的反向传播

原则:把下一层的 1 个像素的梯度传递给上一层的 n * n(池化窗口的 size)个像素,但是需要保证传递的梯度总和不变

平均池化:将梯度平均分给池化之前的每个像素。

最大池化:将梯度只分给之前最大值的像素,其它的梯度为 0。

三、激活函数

(1)激活函数的作用

        如果不用激活函数,每一层输出都是上一层的线性函数,就变成了线性模型,表达能力不够。如果引入非线性激活函数的话,加入了非线性因素,神经网络就能够去逼近任意函数

(2)Sigmoid

公式

Sigmoid\left ( x \right )=\frac{1}{1+e^{-x}}

图像(左为函数图像,右为导数图像):

优点:① 提供非线性能力

② 因为处处连续,所以可导,这便于计算梯度。

③ 压缩数据,输出范围在0和1之间

④ 输出值可以解释为概率,可作为分类任务的输出层

适用于二分类

缺点:① 在输入值接近无穷大或无穷小时,其输出值会接近于0或1(达到饱和状态),此时函数的梯度(导数)会趋近于0。导数最大为 0.25,每传递一层梯度都会减为原来 0.25 倍(甚至更小),这会导致权重更新的梯度非常小,即梯度消失现象,会使得网络在训练过程中学习得非常慢,甚至无法继续学习。

非中心对称函数,均值不为 0,网络收敛效果不好。理由如下图所示:

        网络结构为 隐层1->激活层1->隐层2->激活层2,现在我们想更新参数 w_{5} 和 w_{6},则参数更新公式为:w_{5/6} = w_{5/6} - \eta \frac{\partial L}{\partial f_{3}}\frac{\partial f_{3}}{\partial z_{3}}\frac{\partial z_{3}}{\partial w_{5/6}} = w_{5/6} - \eta f_{1/2}\frac{\partial L}{\partial f_{3}}\frac{\partial f_{3}}{\partial z_{3}},其中 \eta 为学习率,f_{1/2/3}为 sigmoid 激活函数。可以看到 \frac{\partial L}{\partial f3}\frac{\partial f3}{\partial z3}\eta 对于更新 w_{5} 和 w_{6} 来说都是相同的值,唯一不同的是 f_{1}f_{2}。因此 w_{5} 和 w_{6} 更新方向,完全由对应的输入值 f_{i},i=1,2  的符号决定。而激活层1 用的是sigmoid 函数,导致 f_{i} 的值都为正,即 w_{5} 和 w_{6} 更新方向总是相同的(同时增大或者同时减少),如果 w_{5} 最优的更新方向是增加,w_{6} 最优的更新方向是减少,w_{5} 和 w_{6} 的合方向将会走 Z 字形逼近最优解,收敛的过程将会非常缓慢,如下图所示(\omega _{5}^{*}\omega _{6}^{*}表示最优参数):

③ 函数本身包含指数运算(e^{-x}),且其导函数也比较复杂(Sigmoid(x)(1-Sigmoid(x))),运算相对耗时

(3)Softmax

        参考链接:http://t.csdnimg.cn/8qNDF。

Sigmoid 和 Softmax指数运算溢出问题:sigmoid 和 softmax 函数在计算中,都会用到指数运算e^{-x} 或 e^{x} ,如果在 e^{-x}  中 x 是一个很小的负数,或者在 e^{x} 中 x 是一个很大的正数,这时有溢出(即数值超过计算机能表示的最大浮点数)的风险。

Sigmoid 溢出的解决办法:如果 x>0 ,则 y=\frac1{1+\mathrm{e}^{-\mathrm{x}}};如果 x<0 ,则 y=\frac1{1+\mathrm{e}^{\mathrm{x}}}

Softmax 溢出的解决办法:取所有 x_{i} 中的最大值M,则计算 (x_1,x_2,x_3,......,x_n) 这组数的Softmax 等同于计算 (x_1- M, x_2- M, x_3- M, . . . . . . , x_n- M) 这一组数据的 Softmax(即分子分母同时除以e^M)。这样Softmax改为 Softmax= \frac {e^{x_{i}- M}}{\sum _{i= 1}^{n}e^{x_{i}- M}} ,就解决了上溢出的问题,因为 x_{i}- M 小于等于 0,则 e^{x_{i}- M} 都是小于等于 1 的值。

(4)Tanh

公式\tanh(\mathrm{x})=\frac{\mathrm{e}^{\mathrm{x}}-\mathrm{e}^{-\mathrm{x}}}{\mathrm{e}^{\mathrm{x}}+\mathrm{e}^{-\mathrm{x}}}

图像

优点:与sigmoid函数不同,tanh函数零中心对称,让模型的收敛速度更快。

缺点:① 在两边还是有梯度饱和(也就是梯度趋近于 0)易造成梯度消失

② 包含指数运算,运算相对复杂且耗时

(5)Relu

公式:max (0, x)。

图像

优点

计算简单(只需要一个阈值判断,x小于0得0,x大于等于0得x),梯度也好求(x小于0为0,x大于0为1)。

② ReLU函数在输入为正数时,其梯度恒为1,梯度不会衰减,减轻梯度消失问题

③ ReLU函数在输入小于0时,输出为0,使得网络在训练过程中产生大量的稀疏性(指只有少量神经元被激活,对网络的输出产生影响)。稀疏性有两个好处:一是可以减少参数的数量,缓解过拟合问题;二是让网络更加关注重要的特征(激活输出为5的特征比0.5的更突出,都是负值的表示没有明显特征,直接过滤掉为0),提高模型的泛化能力

④ ReLu的这个三个优点,促进了模型快速收敛

缺点:① 当ReLU函数的输入值为负时,输出始终为0,并且其一阶导数(梯度)也始终为0。这会导致在反向传播过程中,如果某个神经元的输入始终为负,那么该神经元的权重永久不会更新,这种现象被称为“神经元死亡”。

        比如,当学习率(learning rate)设置得过高时,高学习率意味着在每次参数更新,权重的改变量可能很大,如果更新前参数梯度为正,那么更新前的参数就会被减去一个很大的值,更新后的参数变为负值,这可能导致输入神经元的正值与相应负权重相乘求和后也变为负值输出,再经过 Relu,输出值为0,反向传播的梯度也为0,参数得不到更新就一直为负,从而导致神经元一直为负,永久失活。这些神经元同时“死亡”,从而整个网络中相当大比例(40%)的神经元失效。

        解决办法:改用 Relu 的变体 —— 如Leaky ReLU、Parametric ReLU;改用小的学习率。

③ 不会对输入数据进行幅度压缩正数经过ReLU层后,其输出将保持不变并继续传递给下一层。如果权重矩阵中的某些元素也较大,那么这些较大的输入和权重相乘后,输出可能会变得更大。这种效应在多层网络中会累积,导致数据幅度不断扩张,可能会发生梯度爆炸(如果前向传播中的数据幅度很大,那么计算出的梯度也可能很大,导致权重更新不稳定甚至发散)。

(6)Leaky ReLu

公式

LeakyReLu\left ( x \right )=\left\{\begin{matrix} x, x> 0& \\ \alpha x, x\leq 0, & \end{matrix}\right.

        \alpha 是自己设置的一个很小的参数,通常是 0.01。

图像

         小于0的输出,不再是0,而是绝对值很小的一个负数;输入小于0的部分,梯度也不再是0,而是 \alpha ,从而解决 “Dead ReLu” 问题

其它的 ReLu 变体:① 随机 Leaky ReLu:\alpha 随机取值,\alpha 分布服从均值为0、标准差为1的正态分布。

② PReLu(Parametric ReLU): \alpha 通过学习而来,跟着模型一起优化。

优点:① 避免神经元死亡。

② 输入为负时梯度不为0,缓解梯度消失问题。

③ 计算速度快。

④  Leaky ReLU 线性、非饱和的形式,在梯度下降中能够快速收敛。

缺点:虽然解决了神经元死亡的问题,但在实践中的效果没有比 ReLU 有明显的提升。

(7)ReLu6

        源于Mobile v1,将最大值限制为6。

公式:

ReLu6(x) = min(6, max(0, x))

图像:黄线为ReLu6,蓝线为ReLu。

函数图

梯度函数图

优点:在移动端float16的低精度的时候,也能有很好的数值分辨率。如果对ReLu的输出值不加限制,那么输出范围就是0到正无穷,而低精度的float16无法精确描述其数值,带来精度损失。

(8)ELU

公式

LeakyReLu\left ( x \right )=\left\{\begin{matrix} x, x> 0& \\ \alpha \left ( e^{x}-1 \right ), x\leq 0, & \end{matrix}\right.

图像

优点

一个好的激活函数应该满足:① 单侧饱和(负输入区域饱和,可以过滤掉不重要的特征)。

② 输出值分布在 0 的两侧(相当于0中心对称,可以加快网络的收敛速度)。

        Relu只满足了第1个条件,而不满足第2个条件;LeakyReLu、PReLu 满足第2个条件而不满足第1个条件。ELU同时满足2个条件

        满足单侧饱和:指数函数 e^{x} 在 x 趋近于负无穷时趋近于0,因此 e^{x}-1 会趋近于 -1 。乘以α 后,ELU 的输出将趋近于 -α。因此 ELU 函数在负输入区域具有饱和性,即当输入值足够小时,输出值将不再随输入值的减小而显著减小,而是趋近于一个固定的负值 -a,那么梯度也是一个趋于0的值。

相关文章:

【深度学习入门】深度学习知识点总结

一、卷积 &#xff08;1&#xff09;什么是卷积 定义&#xff1a;特征图的局部与卷积核做内积的操作。 作用&#xff1a;① 广泛应用于图像处理领域。卷积操作可以提取图片中的特征&#xff0c;低层的卷积层提取局部特征&#xff0c;如&#xff1a;边缘、线条、角。 ② 高层…...

最小距离和与带权最小距离和

1. 等权中位数 背景&#xff1a; 给定一系列整数&#xff0c;求一个整数x使得x在数轴上与所有整数在数轴上的距离和最小。 结论&#xff1a; 这一系列的整数按顺序排好后的中位数(偶数个整数的中位数取 n 2 或 n 2 1 \frac{n}{2}或\frac{n}{2}1 2n​或2n​1都可)一定是所求点…...

有哪些常见的 Vue 错误?

在使用 Vue.js 开发应用时&#xff0c;开发者可能会遇到各种错误。以下是一些常见的 Vue 错误以及如何避免它们&#xff1a;为了更详细地解释常见的 Vue.js 错误&#xff0c;我们可以深入探讨每个类别&#xff0c;并提供更多的背景信息和解决方案。以下是针对常见错误的扩展说明…...

查看电脑或笔记本CPU的核心数方法及CPU详细信息

一、通过任务管理器查看 1.打开任务管理器 可以按下“Ctrl Shift Esc”组合键&#xff0c;或者按下“Ctrl Alt Delete”组合键后选择“任务管理器”来打开。 2.查看CPU信息 在任务管理器界面中&#xff0c;点击“性能”标签页&#xff0c;找到CPU使用记录区域&#xff0c…...

Python 轻松扫描,快速检测:高效IP网段扫描工具全解析

Python 轻松扫描&#xff0c;快速检测&#xff1a;高效IP网段扫描工具全解析 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着…...

AI Agent:AutoGPT的使用方法

AutoGPT的使用方法 准备工作: 安装Python:确保你的电脑上安装了Python 3.8或更高版本。获取OpenAI API密钥:访问https://platform.openai.com/account/api-keys获取API密钥,并保存备用。获取Google API及Google Search Engine ID(可选):若要使用谷歌搜索功能,需访问htt…...

RabbitMQ 在实际应用时要注意的问题

1. 幂等性保障 1.1 幂等性介绍 幂等性是数学和计算机科学中某些运算的性质,它们可以被多次应⽤,⽽不会改变初始应⽤的结果. 应⽤程序的幂等性介绍 在应⽤程序中,幂等性就是指对⼀个系统进⾏重复调⽤(相同参数),不论请求多少次,这些请求对系统的影响都是相同的效果. ⽐如数据库…...

ASP .NET Core 学习(.NET9)部署(一)windows

在windows部署 ASP .NET Core 的时候IIS是不二选择 一、IIS安装 不论是在window7 、w10还是Windows Server&#xff0c;都是十分简单的&#xff0c;下面以Windows10为例 打开控制面版—程序—启用或关闭Windows功能 勾选图中的两项&#xff0c;其中的子项看需求自行勾选&am…...

在Qt中实现点击一个界面上的按钮弹窗到另一个界面

文章目录 步骤 1&#xff1a;创建新窗口类步骤 2&#xff1a;设计窗口的 UI步骤 3&#xff1a;设计响应函数 以下是一个完整的示例&#xff0c;展示在Qt中如何实现在一个窗口中通过点击按钮弹出一个新窗口。 步骤 1&#xff1a;创建新窗口类 假设你要创建一个名为 WelcomeWidg…...

计算机组成原理(计算机系统3)--实验八:处理器结构拓展实验

一、实验目标&#xff1a; 了解MIPS的五级流水线&#xff0c;和在运行过程中的所产生的各种不同的流水线冒险&#xff1b;通过指令顺序调整&#xff0c;或旁路与预测技术来提高流水线效率&#xff1b;更加了解流水线细节和其指令的改善方法&#xff1b;更加深入了解动态分支预…...

pytest执行报错:found no collectors

今天在尝试使用pytest运行用例的时候出现报错&#xff1a;found no collectors&#xff1b;从两个方向进行排查&#xff0c;一是看文件名和函数名是不是符合规范&#xff0c;命名要是"test_*"格式&#xff1b;二是是否存在修改文件名的情况&#xff0c;如果修改过文件…...

Typescript 多个泛型参数详细解读

多个泛型参数的函数 : 函数中有多个泛型的参数。 示例&#xff1a; (() > {function getMsg<K, V>(value1: K, value2: V): [K, V] {return [value1, value2]}const arr1 getMsg<string,number>(jack,100.2345)console.log(arr1[0].split())console.log(arr1…...

等变即插即用图像重建

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 即插即用算法为解决反问题成像问题提供了一个流行的框架&#xff0c;该框架依赖于通过降噪器隐式定义图像先验。这些算法可以利用强大的预训练降噪器来解决各种成像任务&#xff0c;从而避免了在每…...

安卓14自由窗口圆角处理之绘制圆角轮廓线

背景&#xff1a; 前面文章已经分享过&#xff1a; 如何一行代码搞定自由窗口的圆角处理&#xff1f;-wms/自由窗口/sf实战开发 但是又有学员朋友提出另一个blog的成果&#xff1a; 安卓aosp14上自由窗口划线边框Freeform Caption实战开发-千里马framework实战 想要把划线和…...

2025.1.25 关于c++学习中拷贝构造的问题

在各种构造函数中&#xff0c;比如带参数的和不带参数的构造函数&#xff0c;全缺省的构造函数&#xff0c;最特别的就是拷贝构造函数&#xff0c;当类的实例化对象作为参数进行传递时就要自动调用拷贝构造函数 1.基本形式 class Time{ public://全缺省构造函数Time(int year…...

满足不同场景的需求的智慧物流开源了

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。构建基于Ai技术的…...

实现 iOS 自定义高斯模糊文字效果的 UILabel(文末有Demo)

引言 在实际的项目开发中&#xff0c;我们经常会遇到一些看似简单&#xff0c;但在实现时却充满挑战的需求。比如在开发付费通话功能时&#xff0c;我们需要展示最近通话的用户记录&#xff0c;其中包括用户的头像和昵称。为了保护用户隐私并且提升界面的美观性&#xff0c;我…...

【AI编辑器】字节跳动推出AI IDE——Trae,专为中文开发者深度定制

目录 一、背景 二、核心特性 2.1 AI驱动的代码自动生成 2.2 智能问答与代码补全 2.3 多语言支持 2.4 插件与扩展 三、架构 四、下载使用 4.1 下载与安装 4.2 界面与配置 五、应用实践 5.1 快速生成代码 5.2 智能问答与调试 5.3 团队协作与代码审查 六、与Cursor…...

Qt Creator 15.0.0如何更换主题和字体

1.打开Qt Creator 15.0.0 (Community)&#xff0c; 2.点击编辑栏3.点击Preferences... 4.修改主题&#xff0c;点击环境&#xff0c;修改Theme:栏 5.修改字体大小&#xff0c;点击文本编辑器&#xff0c;修改字号栏。&#xff0c;修改Theme:栏...

Java开发提效秘籍:巧用Apache Commons IO工具库

一、引言 在 Java 开发的广袤领域中&#xff0c;输入输出&#xff08;I/O&#xff09;操作宛如一座桥梁&#xff0c;连接着程序与外部世界&#xff0c;从文件的读取与写入&#xff0c;到网络数据的传输&#xff0c;I/O 操作无处不在&#xff0c;其重要性不言而喻。然而&#xf…...

IDEA中Maven使用的踩坑与最佳实践

文章目录 IDEA中Maven使用的踩坑与最佳实践一、环境配置类问题1. Maven环境配置2. IDEA中Maven配置建议 二、常见问题与解决方案1. 依赖下载失败2. 依赖冲突解决3. 编译问题修复 三、效率提升技巧1. IDEA Maven Helper插件使用2. 常用Maven命令配置3. 多模块项目配置4. 资源文件…...

webrtc入门系列(五)amazon-kinesis-video-streams-webrtc-sdk-c编译

《webrtc入门系列&#xff08;一&#xff09;easy_webrtc_server 入门环境搭建》 《webrtc入门系列&#xff08;二&#xff09;easy_webrtc_server 入门example测试》 《webrtc入门系列&#xff08;三&#xff09;云服务器coturn环境搭建》 《webrtc入门系列&#xff08;四&…...

全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析

本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中&#xff0c;我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现&#xff0c;以及基本的系统性能指标&#xff0c;包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…...

MySQL、HBase、ES的特点和区别

MySQL&#xff1a;关系型数据库&#xff0c;主要面向OLTP&#xff0c;支持事务&#xff0c;支持二级索引&#xff0c;支持sql&#xff0c;支持主从、Group Replication架构模型&#xff08;本文全部以Innodb为例&#xff0c;不涉及别的存储引擎&#xff09;。 HBase&#xff1…...

Windows远程连接Docker服务

问题背景 本地开发了一个SpringBoot项目&#xff0c;想通过Docker部署起来&#xff0c;我本地是Window11系统&#xff0c;由于某些原因不能虚拟化并且未安装Docker-Desktop&#xff0c;所以我在想有没有办法本地不需要虚拟化也不需要安装Docker-Desktop来实现支持Docker命令远…...

【前端知识】简单易懂的vue前端页面元素权限控制

文章目录 设计思路代码实现1. **权限数据管理**2. **权限判断方法**3. **动态控制元素**4. **路由权限控制**5. **无权限页面** 总结相关文献 在前端实现基于 Vue 的权限控制&#xff0c;通常需要结合后端返回的用户权限数据&#xff0c;动态控制页面元素的显示与隐藏、按钮的可…...

2024大模型双向突破:MoE架构创新与小模型崛起

标题&#xff1a;2024大模型双向突破&#xff1a;MoE架构创新与小模型崛起 文章信息摘要&#xff1a; 文章分析了2024年初大语言模型领域的两大技术发展方向&#xff1a;一是以Arctic为代表的新型MoE架构&#xff0c;通过480B总参数但仅17B活跃参数的设计实现高效企业级应用&a…...

电气防火保护器为高校学生宿舍提供安全保障

摘 要&#xff1a;3月2日&#xff0c;清华大学紫荆学生公寓发生火情&#xff0c;无人员伤亡。推断起火原因系中厅内通电电器发生故障引燃周边可燃物所致。2月27日&#xff0c;贵州某高校女生宿舍发生火灾&#xff0c;现场明火得到有效控制&#xff0c;无人员受伤。2月19日&…...

ChatGPT大模型极简应用开发-CH2-深入了解 GPT-4 和 ChatGPT 的 API

文章目录 2.1 基本概念2.2 OpenAI API 提供的可用模型2.3 在 OpenAI Playground 中使用 GPT模型2.4 开始使用 OpenAI Python 库2.4.1 OpenAI 访问权限和 API 密钥2.4.2 Hello World 示例程序 2.5 使用 GPT-4 和 ChatGPT2.5.1 ChatCompletion 端点的输入选项2.5.2 ChatCompletio…...

notepad++下载安装及使用笔记

文章目录 可以打开多大的文件可以打开多大的文件和内存设置有关吗&#xff0c;如何设置? TODO 如果打不开太大的文件 拆分为200M的肯定可以打开Find All in CurrentDocument(在当前文档中找到所有) 下载从百度网盘下载从官网下载 主要为了本地看大日志方便&#xff0c;例如几百…...

线上突发:MySQL 自增 ID 用完,怎么办?

线上突发&#xff1a;MySQL 自增 ID 用完&#xff0c;怎么办&#xff1f; 1. 问题背景2. 场景复现3. 自增id用完怎么办&#xff1f;4. 总结 1. 问题背景 最近&#xff0c;我们在数据库巡检的时候发现了一个问题&#xff1a;线上的地址表自增主键用的是int类型。随着业务越做越…...

黑马程序员C++ P1-P40

一.注释和常量 1.多行注释&#xff1a;/*...............*/ ; 单行注释&#xff1a;//.............. 2.常量&#xff1a;用于记录程序中不可修改的量 。定义方式&#xff1a;宏常量#define定义在文件上方 ;const修饰变量 3.标识符命名规则&#xff1a;标识符不能是关键字&a…...

AIGC浪潮下,图文内容社区数据指标体系如何构建?

文章目录 01 案例&#xff1a;以图文内容社区为例实践数据指标体构建02 4个步骤实现数据指标体系构建1. 明确业务目标&#xff0c;梳理北极星指标2. 梳理业务流程&#xff0c;明确过程指标3. 指标下钻分级&#xff0c;构建多层级数据指标体系4. 添加分析维度&#xff0c;构建完…...

OpenVela 各模块之间的交互方式和数据流

目录 一、核心操作系统模块与其他模块的交互 1.1. 内核层与硬件抽象层(HAL)的交互 1.2. 内核层与服务框架的交互 二、模块化与可扩展性模块与其他模块的交互 2.1. 模块化设计与其他模块的交互 2.2. 服务框架与应用层的交互 三、通信与连接模块与其他模块的交互 3.1. …...

HTB:Heist[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用smbclient匿…...

C语言——文件操作

目录 前言 一什么是文件 1程序文件 2数据文件 3文件名 二文件的打开与关闭 1文件指针 2fopen 3fclose 三文件的读与写 1文件的顺序读写 1.1fputc fgetc 1.2fputs fgets 1.3fprintf fscanf 1.4fwrite fread 1.5文本文件和二进制文件 2文件的任意读写 1fseek …...

嵌入式知识点总结 C/C++ 专题提升(七)-位操作

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.位操作基础 2.如何求解整型数的二进制表示中1的个数 ? 3.如何求解二进制中0的个数 4.交换两个变量的值&#xff0c;不使用第三个变量。即a3,b5,交换之后a5,b3: 5.给定一个…...

26. 【.NET 8 实战--孢子记账--从单体到微服务】--需求更新--用户注销、修改用户名、安全设置

在实际开发过程中&#xff0c;项目需求的变更和增加是常见的情况&#xff0c;因此这篇文章我们就模拟一下项目需求新增的情况。 一、需求 项目经理今天提出了新的功能&#xff0c;需要增加重置密码、安全设置、修改用户名、注销账户这四个功能&#xff0c;这四个功能必须是独…...

Git 分支管理与多人协作实战指南

目录 1.分支管理&#xff1a; 1.1.理解分支&#xff1a; 1.2.创建分支 1.3.切换分支 1.4.合并分支 1.5.删除分支 2.合并冲突 3.分支管理策略 分支策略 4.bug分支 5.删除临时分支 git branch -d 和 git branch -D的区别 6.多人协作 6.1.多人协作一 6.2.多人协作二…...

使用pyboard、micropython和tja1050进行can通信

单片机和can收发器之间tx、rx不需要交叉接线&#xff01;&#xff01;&#xff01; tja1050的rx接Y3、tx接Y4 from pyb import CANcan CAN(1) can.init(modecan.NORMAL, prescaler6, sjw1, bs14, bs22, auto_restartTrue) # 1Mbps的配置&#xff0c;本文使用的micropython1.…...

新能源监控平台都管理哪些数据

北理新源信息科技有限公司&#xff08;简称“北理新源”&#xff09;依托北京理工大学电动车辆国家工程研究中心&#xff0c;建设和运营了“新能源汽车国家监测与管理平台”。该平台是国家级的新能源汽车数据监管平台&#xff0c;主要负责对新能源汽车的运行数据进行采集、监测…...

Go学习:常量

变量&#xff1a;程序运行期间&#xff0c;可以改变的量&#xff0c;变量声明需要使用 var 常量&#xff1a;程序运行期间&#xff0c;不可以改变的量&#xff0c;常量声明需要使用 const 目录 1. 常量不允许修改 2. 常量赋值不使用 : 3. 常量能够自动推导类型 1. 常量不允许…...

Apache Tika 详解

Apache Tika是一个开源的、跨平台的库&#xff0c;专门用于检测、提取和解析多种文件格式的元数据。以下是对Apache Tika的详细解析&#xff1a; 一、概述 Apache Tika旨在为各种类型的数据提取提供一个单一的API&#xff0c;它支持多种文件格式&#xff0c;包括文档、图片、…...

第12章:Python TDD完善货币加法运算(一)

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

KNN的调参方法

目录 1. K 值&#xff08;邻居数 K&#xff09;的选择2. 距离度量方式2.1 常见距离度量2.2 如何选择距离度量 3. 权重策略&#xff08;weights&#xff09;4. 特征预处理4.1 特征缩放&#xff08;标准化/归一化&#xff09;4.2 处理异常值 5. 特征选择或降维6. 使用交叉验证来综…...

mac 电脑上安装adb命令

在Mac下配置android adb命令环境&#xff0c;配置方式如下&#xff1a; 1、下载并安装IDE &#xff08;android studio&#xff09; Android Studio官网下载链接 详细的安装连接请参考 Mac 安装Android studio 2、配置环境 在安装完成之后&#xff0c;将android的adb工具所在…...

P3934 [Ynoi2016] 炸脖龙 I Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​). 有 m m m 个操作&#xff0c;分以下两种&#xff1a; modify ⁡ ( l , r , k ) \operatorname{modify}(l,r,k) modify(l,r,k)&#xff1a;对每个 i ∈ [ l , r ] i \in [l…...

数据库-多表查询

介绍&#xff08;什么是多表查询&#xff1f;&#xff09; 多表查询&#xff1a;查询时从多张表中获取所需数据 单表查询的SQL语句&#xff1a;select 字段列表 from 表名; 那么要执行多表查询&#xff0c;只需要使用逗号分隔多张表即可 如&#xff1a; select 字段列表 from …...

PID控制的优势与LabVIEW应用

PID控制&#xff08;比例-积分-微分控制&#xff09;已在工业控制领域得到广泛应用&#xff0c;尤其在实时控制和自动化系统中&#xff0c;其核心优点是简单、稳定且高效。尽管许多现代控制方法&#xff08;如自适应控制、模型预测控制等&#xff09;逐渐崭露头角&#xff0c;P…...

Next.js:构建大模型智能体GPT研究者应用的 Web开发框架

Next.js&#xff1a;构建大模型智能体GPT研究者应用的 Web开发框架 Next.js 基础知识 Next.js 是由 Vercel 公司开发维护的框架&#xff0c;极大地简化了 React 应用的开发流程。其核心特性包括&#xff1a; 服务器端渲染&#xff08;SSR&#xff09;与静态站点生成&#xff…...