吴恩达深度学习——卷积神经网络基础
本文来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。
文章目录
- 矩阵和张量
- 边缘检测
- 计算方式
- 检测原理
- Valid卷积和Same卷积
- 卷积步长
- 三维卷积
- 单层卷积网络
- 总结
- 符号定义
- 输入输出维度
- 其他参数维度
- 举例
- 池化层
- 示例
- 输入层
- 第一层卷积 - 池化
- 第二层卷积 - 池化
- 全连接层
- 输出层
- 为什么使用卷积
矩阵和张量
矩阵是一个二维数组,由行和列组成,用于表示线性变换或存储数据;张量是矩阵在高维空间的推广,可以看作是一个多维数组。它可以有零维(标量,如一个单独的数值)、一维(向量,如一个数列)、二维(即矩阵)以及更高维度。
边缘检测
边缘检测是计算机视觉和图像处理中的技术,识别图像中亮度变化剧烈的像素点集合构成的线条(图像边缘),表示了物体、区域的边界。
图片展示了边缘检测的结果,左侧是原始图像,右侧上方是检测出的垂直边缘,右侧下方是检测出的水平边缘。
计算方式
对于这样一个矩阵,计算过程如下:左侧是一个6×6的矩阵,中间是一个3×3的滤波器(核),右侧运算后得到的4×4的结果矩阵。
对于计算结果的第一个元素(-5),滤波器中的值与原矩阵左上角3×3区域(3×1 + 0×0 + 1×(-1) + 1×1 + 5×0 + 8×(-1) + 2×1 + 7×0 + 2×(-1)= -5)对应元素相乘后求和;红色的-4计算结果为滤波器中的值分别与图中红线的一一值相乘后相加(0×1+5×1+7×1+1×0+8×0+2×0+2×(-1)+9×(-1)+5×(-1)= -4);蓝色的8也是相同的算法。依次将滤波器在原矩阵上滑动(每次滑动一个单位),重复上述乘法和求和操作,得到整个结果矩阵。
检测原理
如果将该矩阵看成一张图片,0表示灰色,10表示亮白,在灰色区域和白色区域有一条明显的垂直边缘。过滤器用1表示白,0表示灰,-1表示黑色。经过卷积后,得到44的矩阵,0表示灰,30表示白,可以看到,计算后的结果的中间部分有明显的白色区域,表示66矩阵的垂直边缘。
如果将图像反转,得到中间是黑色区域的输出矩阵。与由白(亮)向暗不同,反转的输出结果展示了由暗向亮(灰色相对于黑色更亮)。如果不在乎这两者的区别,可以为结果加绝对值。
Valid卷积和Same卷积
上述的6*6的矩阵,经过3*3的过滤器后,得到4*4的输出矩阵。设原矩阵是 n × n n\times n n×n的大小,过滤器是 f × f f \times f f×f的大小,输出结果就是 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1) \times (n-f+1) (n−f+1)×(n−f+1)大小的矩阵,这样做,每次卷积都使得图片进一步缩小;同时,输入矩阵中间的核心像素被频繁计算,而角落或者边缘像素在输出时被使用较少。
因此,在使用卷积之前,需要将图片做填充(Padding),将6*6的矩阵最外层在填充一层像素,变成8*8的矩阵。填充的数字可以是0填充。
大小为 ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) (n+2p-f+1) \times (n+2p-f+1) (n+2p−f+1)×(n+2p−f+1)其中, p p p是填充的层数,本例中填充了一层。
上面两种是不同的卷积方式:
- Valid卷积:不进行填充的卷积操作。若输入数据尺寸为 n × n n \times n n×n ,滤波器(卷积核)尺寸为 f × f f \times f f×f ,那么输出尺寸为 ( n − f + 1 ) × ( n − f + 1 ) (n - f + 1)\times(n - f + 1) (n−f+1)×(n−f+1) 。
- Same卷积:使输出尺寸和输入尺寸相同的卷积。需要对输入进行填充操作,设填充层数为 p p p ,则输出尺寸为 ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) (n + 2p - f + 1)\times(n + 2p - f + 1) (n+2p−f+1)×(n+2p−f+1) 。为使输出尺寸等于输入尺寸 n n n ,即 n + 2 p − f + 1 = n n+2p - f + 1=n n+2p−f+1=n ,可推出 p = f − 1 2 p=\frac{f - 1}{2} p=2f−1 ( f f f 通常为奇数,否则图像将不对称,这也是过滤器大小选择奇数的原因) 。
Valid卷积会缩小特征图尺寸,Same卷积可保持特征图尺寸不变。
卷积步长
如果将卷积步长 s = 2 s=2 s=2:
计算后的输出矩阵大小为 ⌊ n + 2 p − f s + 1 ⌋ × ⌊ n + 2 p − f s + 1 ⌋ \left \lfloor\frac{n + 2p - f }{s}+1\right \rfloor\times\left \lfloor\frac{n + 2p - f }{s}+1\right \rfloor ⌊sn+2p−f+1⌋×⌊sn+2p−f+1⌋
三维卷积
如果是三维的卷积,对于6*6*3,规定第一个6是高,第二个6是宽度,第三个3是通道数,要求三维输入张量的通道数必须与过滤器的通道数相同。最后得到4*4*1的输出张量。
类似二维的卷积计算,三维的卷积计算时,首先过滤器(有27个参数)与三维输入张量分别相乘后在相加,得到的数填在输出张量中,然后继续移动过滤器,重复以上的计算。
如果只是想计算红色的边缘信息,将过滤器的第一个通道设置1,0,-1,其他通道设置为0即可。
如果有多个过滤器,输入是一个尺寸为 6 × 6 × 3 6×6×3 6×6×3的三维张量:
有两组 3 × 3 × 3 3×3×3 3×3×3的过滤器,每个过滤器都是 3 × 3 × 3 3×3×3 3×3×3的大小,经过卷积运算后,得到两个尺寸为 4 × 4 4×4 4×4的的输出张量,输出一个大小为 4 × 4 × 2 4×4×2 4×4×2的张量。
如果输入为 n × n × n c n×n×n_c n×n×nc( n n n是特征图边长, n c n_c nc是通道数),过滤器为 f × f × n c f×f×n_c f×f×nc( f f f是过滤器边长, n c n_c nc是通道数),经过卷积运算后,输出尺寸为 ( n − f + 1 ) × ( n − f + 1 ) × n c ′ (n - f + 1)×(n - f + 1)×n_c' (n−f+1)×(n−f+1)×nc′,其中 n c ′ n_c' nc′是过滤器的数量。本例的 n = 6 n = 6 n=6, f = 3 f = 3 f=3, n c = 3 n_c = 3 nc=3, n c ′ = 2 n_c' = 2 nc′=2,输出尺寸为 4 × 4 × 2 4×4×2 4×4×2。
单层卷积网络
如果使用线性函数 z = w x + b z=wx+b z=wx+b和激活函数 a = g ( z ) a=g(z) a=g(z)。输入的 6 × 6 × 3 6×6×3 6×6×3的张量,记为 a [ 0 ] a^{[0]} a[0],两个大小为 3 × 3 × 3 3×3×3 3×3×3的卷积核(过滤器),记为 W [ 1 ] W^{[1]} W[1]。分别与输入张量 a [ 0 ] a^{[0]} a[0]进行卷积运算 z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] z^{[1]} = W^{[1]}a^{[0]} + b^{[1]} z[1]=W[1]a[0]+b[1],其中 z [ 1 ] z^{[1]} z[1]是线性变换后的结果, b [ 1 ] b^{[1]} b[1]是偏置项, b 1 b_1 b1和 b 2 b_2 b2分别对应两组卷积核的运算结果。对线性变换结果 z [ 1 ] z^{[1]} z[1]应用ReLU激活函数,记为 g ( z ) g(z) g(z),即 a [ 1 ] = g ( z [ 1 ] ) a^{[1]} = g(z^{[1]}) a[1]=g(z[1])。最终得到一个大小为 4 × 4 × 2 4×4×2 4×4×2的输出张量 a [ 1 ] a^{[1]} a[1]。
总结
符号定义
- f [ l ] f^{[l]} f[l]:表示第 l l l层卷积层中过滤器(卷积核)的大小。
- p [ l ] p^{[l]} p[l]:第 l l l层的填充数量。
- s [ l ] s^{[l]} s[l]:第 l l l层的步长。
- n c [ l ] n_c^{[l]} nc[l]:第 l l l层中过滤器的数量。
输入输出维度
- 输入:维度为 n H [ l − 1 ] × n W [ l − 1 ] × n c [ l − 1 ] n_H^{[l - 1]}×n_W^{[l - 1]}×n_c^{[l - 1]} nH[l−1]×nW[l−1]×nc[l−1],其中 n H [ l − 1 ] n_H^{[l - 1]} nH[l−1]和 n W [ l − 1 ] n_W^{[l - 1]} nW[l−1]分别是第 l − 1 l - 1 l−1层输出特征图的高度和宽度, n c [ l − 1 ] n_c^{[l - 1]} nc[l−1]是是第 l − 1 l - 1 l−1层通道数。
- 输出:维度为 n H [ l ] × n W [ l ] × n c [ l ] n_H^{[l]}×n_W^{[l]}×n_c^{[l]} nH[l]×nW[l]×nc[l],其中 n H [ l ] n_H^{[l]} nH[l]和 n W [ l ] n_W^{[l]} nW[l]可由公式 n H [ l ] = n W [ l ] = ⌊ n H ( W ) [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n_H^{[l]}=n_W^{[l]}=\lfloor\frac{n_{H(W)}^{[l - 1]} + 2p^{[l]}-f^{[l]}}{s^{[l]}}+1\rfloor nH[l]=nW[l]=⌊s[l]nH(W)[l−1]+2p[l]−f[l]+1⌋计算得出, n c [ l ] n_c^{[l]} nc[l]为该层过滤器数量。
其他参数维度
- 激活值:运用偏差和非线性函数后,本层的输出 a [ l ] a^{[l]} a[l]的维度是 n H [ l ] × n W [ l ] × n c [ l ] n_H^{[l]}×n_W^{[l]}×n_c^{[l]} nH[l]×nW[l]×nc[l]。如果考虑批量梯度下降或者mini-batch,对于 m m m个样本,则 A [ l ] A^{[l]} A[l]维度为 m × n H [ l ] × n W [ l ] × n c [ l ] m×n_H^{[l]}×n_W^{[l]}×n_c^{[l]} m×nH[l]×nW[l]×nc[l]。
- 权重: W [ l ] W^{[l]} W[l]的维度是 f [ l ] × f [ l ] × n c [ l − 1 ] × n c [ l ] f^{[l]}×f^{[l]}×n_c^{[l - 1]}×n_c^{[l]} f[l]×f[l]×nc[l−1]×nc[l]。
- 偏置: b [ l ] b^{[l]} b[l]数量等于该层过滤器数量 n c [ l ] n_c^{[l]} nc[l],或者使用的维度是 ( 1 , 1 , 1 , n c [ l ] ) (1,1,1,n_c^{[l]}) (1,1,1,nc[l])大小的四维张量。
举例
输入数据维度为 39 × 39 × 3 39×39×3 39×39×3,其中 39 × 39 39×39 39×39是图片大小, 3 3 3表示通道数。
在第一层卷积,过滤器大小 f [ 1 ] = 3 f^{[1]} = 3 f[1]=3,步长 s [ 1 ] = 1 s^{[1]} = 1 s[1]=1,填充 p [ 1 ] = 0 p^{[1]} = 0 p[1]=0,过滤器数量 n c [ 1 ] = 10 n_c^{[1]} = 10 nc[1]=10。根据公式 n H [ l ] = n W [ l ] = ⌊ n H [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n_H^{[l]}=n_W^{[l]}=\lfloor\frac{n_H^{[l - 1]} + 2p^{[l]}-f^{[l]}}{s^{[l]}}+1\rfloor nH[l]=nW[l]=⌊s[l]nH[l−1]+2p[l]−f[l]+1⌋,可得 n H [ 1 ] = n W [ 1 ] = ⌊ 39 + 2 × 0 − 3 1 + 1 ⌋ = 37 n_H^{[1]}=n_W^{[1]}=\lfloor\frac{39+ 2×0 - 3}{1}+1\rfloor = 37 nH[1]=nW[1]=⌊139+2×0−3+1⌋=37,输出维度为 37 × 37 × 10 37×37×10 37×37×10。
第二层卷积,过滤器大小 f [ 2 ] = 5 f^{[2]} = 5 f[2]=5,步长 s [ 2 ] = 2 s^{[2]} = 2 s[2]=2,填充 p [ 2 ] = 0 p^{[2]} = 0 p[2]=0,过滤器数量 n c [ 2 ] = 20 n_c^{[2]} = 20 nc[2]=20,可得 n H [ 2 ] = n W [ 2 ] = ⌊ 37 + 2 × 0 − 5 2 + 1 ⌋ = 17 n_H^{[2]}=n_W^{[2]}=\lfloor\frac{37+ 2×0 - 5}{2}+1\rfloor = 17 nH[2]=nW[2]=⌊237+2×0−5+1⌋=17,输出维度为 17 × 17 × 20 17×17×20 17×17×20。
第三层卷积,过滤器大小 f [ 3 ] = 5 f^{[3]} = 5 f[3]=5,步长 s [ 3 ] = 2 s^{[3]} = 2 s[3]=2,填充 p [ 3 ] = 0 p^{[3]} = 0 p[3]=0,过滤器数量 n c [ 3 ] = 40 n_c^{[3]} = 40 nc[3]=40,可得 n H [ 3 ] = n W [ 3 ] = ⌊ 17 + 2 × 0 − 5 2 + 1 ⌋ = 7 n_H^{[3]}=n_W^{[3]}=\lfloor\frac{17+ 2×0 - 5}{2}+1\rfloor = 7 nH[3]=nW[3]=⌊217+2×0−5+1⌋=7,输出维度为 7 × 7 × 40 7×7×40 7×7×40。
将 7 × 7 × 40 7×7×40 7×7×40的输出展平后连接到全连接层,最终通过逻辑回归(logistic)或Softmax函数得到输出 y y y ,全连接层输入特征为 7 × 7 × 40 = 1960 7×7×40 = 1960 7×7×40=1960。
一个典型的卷积网络有三层:卷积层(Conv)、池化层(pool)和全连接层(FC)。
池化层
池化层对输入的特征图进行采样操作,通过在局部区域内进行聚合计算,改变特征图的尺寸和特征表示。
最大池化在特征图的局部区域内选取最大值作为该区域池化后的输出值。
设定一个池化窗口(如 2 × 2 2×2 2×2、 3 × 3 3×3 3×3)和步长(stride),池化窗口按照步长在特征图上滑动,每到一个位置,取窗口内的最大值作为输出特征图对应位置的值。例如,对于一个 2 × 2 2×2 2×2的池化窗口和步长为2的最大池化操作,它会将输入特征图划分为不重叠的 2 × 2 2×2 2×2区域,每个区域输出一个最大值。
最大池化减少特征图的空间尺寸(高度和宽度),降低计算量和模型参数数量,加快训练速度。例如,将一个 32 × 32 32×32 32×32的特征图通过 2 × 2 2×2 2×2步长为2的最大池化,尺寸变为 16 × 16 16×16 16×16。同时保留局部区域内的最大值,意味着保留了该区域最显著的特征,对特征进行了筛选和强化。
超参数 f f f和 s s s最常见的取值是2和2。
示例
卷积神经网络加上池化层后,模型如下:
输入层
输入是一个尺寸为 32 × 32 × 3 32×32×3 32×32×3的图像,其中 32 × 32 32×32 32×32是图像的空间尺寸, 3 3 3表示通道数。
第一层卷积 - 池化
- 卷积层(CONV1):使用大小为 5 × 5 5×5 5×5( f = 5 f = 5 f=5)、步长为 1 1 1( s = 1 s = 1 s=1)的过滤器,数量为 6 6 6( n c = 6 n_c = 6 nc=6)。根据公式 n H [ l ] = n W [ l ] = ⌊ n H [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n_H^{[l]}=n_W^{[l]}=\lfloor\frac{n_H^{[l - 1]} + 2p^{[l]}-f^{[l]}}{s^{[l]}}+1\rfloor nH[l]=nW[l]=⌊s[l]nH[l−1]+2p[l]−f[l]+1⌋(假设填充 p = 0 p = 0 p=0),输出特征图尺寸为 28 × 28 × 6 28×28×6 28×28×6。
- 池化层(POOL1):采用最大池化,池化窗口大小为 2 × 2 2×2 2×2( f = 2 f = 2 f=2),步长为 2 2 2( s = 2 s = 2 s=2),输出特征图尺寸变为 14 × 14 × 6 14×14×6 14×14×6。
第二层卷积 - 池化
- 卷积层(CONV2):使用大小为 5 × 5 5×5 5×5( f = 5 f = 5 f=5)、步长为 1 1 1( s = 1 s = 1 s=1)的过滤器,数量为 16 16 16( n c = 16 n_c = 16 nc=16),输出特征图尺寸为 10 × 10 × 16 10×10×16 10×10×16。
- 池化层(POOL2):同样是最大池化,池化窗口大小为 2 × 2 2×2 2×2( f = 2 f = 2 f=2),步长为 2 2 2( s = 2 s = 2 s=2),输出特征图尺寸变为 5 × 5 × 16 5×5×16 5×5×16,展平后为 400 400 400个神经元。
全连接层
- FC3层:权重矩阵 W [ 3 ] W^{[3]} W[3]维度为 ( 120 , 400 ) (120,400) (120,400),偏置 b [ 3 ] b^{[3]} b[3]维度为 ( 120 ) (120) (120),输出 120 120 120个神经元。
- FC4层:接着连接到有 84 84 84个神经元的全连接层。
输出层
通过Softmax函数,输出 10 10 10个类别(对应数字 0 − 9 0 - 9 0−9)的概率分布,用于图像分类。
为什么使用卷积
- 参数共享:在图像某一部分有用的特征检测器(如垂直边缘检测器),在图像的另一部分可能同样有用。同一个卷积核在对输入数据的不同位置进行卷积运算时,权重固定不变。这大大减少了模型需要学习的参数数量,降低了模型的复杂度。
- 在卷积神经网络的每一层中,每个输出值仅依赖于少量的输入值。卷积核在进行卷积操作时,每次只与输入数据的一个局部区域进行交互,而不是与整个输入数据的所有元素相连。比如一个3×3的卷积核在图像上滑动进行卷积运算,对于输出特征图上的每个点,它只依赖于输入图像中对应3×3区域内的像素值,而非整个图像的像素,体现了连接的稀疏性。这种特性使得模型的参数数量大幅减少,计算量降低,同时也有助于提取数据的局部特征 。
相关文章:
吴恩达深度学习——卷积神经网络基础
本文来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 矩阵和张量边缘检测计算方式检测原理 Valid卷积和Same卷积卷积步长三维卷积单层卷积网络总结符号定义输入输出维度其他参数维度 举例 池化层示例输入层第一层卷积 - 池化第二层卷…...
MySQL锁详解
MySQL锁详解 数据库的锁机制锁的分类行级锁与表级锁行级锁之共享锁与排他锁乐观锁与悲观锁悲观锁乐观锁 Innodb存储引擎的锁机制行级锁与表级锁的使用区分三种行锁的算法死锁的问题多版本并发控制MVCC 数据库的锁机制 什么是锁?锁是一种保障数据的机制 为何要用锁…...
快速提升网站收录:利用网站用户反馈机制
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/59.html 利用网站用户反馈机制是快速提升网站收录的有效策略之一。以下是一些具体的实施步骤和建议: 一、建立用户反馈机制 多样化反馈渠道: 设立在线反馈表、邮件…...
初五,很棒
20元一瓶的水见过没?配料只有水和维C,养生佳品?除非我疯了。 今晚和大姨爹等人探讨成家问题。没错,我变成最应该成家的人了。 的确,从年龄上,发展阶段上,也是应该成家啦。 难道我不知道嘛。 人…...
Vue指令v-html
目录 一、Vue中的v-html指令是什么?二、v-html指令与v-text指令的区别? 一、Vue中的v-html指令是什么? v-html指令的作用是:设置元素的innerHTML,内容中有html结构会被解析为标签。 二、v-html指令与v-text指令的区别…...
ubuntu磁盘扩容
ubuntu磁盘扩容 描述先在虚拟机设置里面扩容进入Ubuntu 配置使用命令行工具parted进行分区输出如下完成 描述 执行命令,查看 fs 类型是什么 lsblk -o NAME,FSTYPE,MOUNTPOINT将60G扩容到100G,其中有些操作我也不知道什么意思,反正就是成功了࿰…...
BFS(广度优先搜索)——搜索算法
BFS,也就是广度(宽度)优先搜索,二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS(深度优先搜索)。从字面意思也很好理解,DFS就是一条路走到黑,BFS则是一层一层地展开。…...
SAP SD学习笔记27 - 请求计划(开票计划)之1 - 定期请求(定期开票)
上两章讲了贩卖契约(框架协议)的概要,以及贩卖契约中最为常用的 基本契约 - 数量契约和金额契约。 SAP SD学习笔记26 - 贩卖契约(框架协议)的概要,基本契约 - 数量契约_sap 框架协议-CSDN博客 SAP SD学习笔记27 - 贩卖契约(框架…...
string例题
一、字符串最后一个单词长度 题目解析:由题输入一段字符串或一句话找最后一个单词的长度,也就是找最后一个空格后的单词长度。1.既然有空格那用我们常规的cin就不行了,我们这里使用getline,2.读取空格既然是最后一个空格后的单词,…...
Revit二次开发 自适应族添加放样融合
大多数博客给出的方案都是如何在有自适应族的情况下进行修改定位点或是将数据传入自适应族,如何直接在族文件中创建自适应模型并将点转换为自适应点,连接自适应点成为自适应路径这种方式没有文章介绍. 下面的代码中给出了如何在自适应族文件中创建参照点并转换为自适应点连接…...
浏览器模块化难题
CommonJS 的工作原理 当使用 require(模块路径) 导入一个模块时,node会做以下两件事情(不考虑模块缓存): 通过模块路径找到本机文件,并读取文件内容将文件中的代码放入到一个函数环境中执行,并将执行后 m…...
详细介绍:网站背景更换功能
目录 1. HTML 部分 2. JavaScript 部分 3. 完整流程 4. 总结 5. 适用场景 本文将介绍如何通过文件上传实现网站背景图片的更换。通过使用 JavaScript 和 Axios,我们可以允许用户上传图片文件并将其作为网站的背景图片。上传的图片 URL 会保存在浏览器的 localSt…...
w190工作流程管理系统设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
Linux——文件系统
一、从硬件出发 1)磁盘的主要构成 通常硬盘是由盘片、主轴、磁头、摇摆臂、马达、永磁铁等部件组成,其中一个硬盘中有多块盘片和多个磁头,堆叠在一起,工作时由盘片旋转和摇摆臂摇摆及逆行寻址从而运作,磁头可以对盘片…...
傅里叶分析之掐死教程
https://zhuanlan.zhihu.com/p/19763358 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析 不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是,傅里叶分析的公式看起来太复杂了,所以很多…...
使用scikit-learn中的K均值包进行聚类分析
聚类是无监督学习中的一种重要技术,用于在没有标签信息的情况下对数据进行分析和组织。K均值算法是聚类中最常用的方法之一,其目标是将数据点划分为K个簇,使得每个簇内的数据点更加相似,而不同簇之间的数据点差异较大。 准备自定…...
Compose笔记(一)--LifecycleEventObserver
这一节了解一下LifecycleEventObserver,它在 Android Compose 中是一个接口,它允许你监听 Android 组件(如 Activity、Fragment)的生命周期事件。Lifecycle 代表 Android 组件从创建到销毁的整个生命周期,而 Lifecycle…...
算法总结-二分查找
文章目录 1.搜索插入位置1.答案2.思路 2.搜索二维矩阵1.答案2.思路 3.寻找峰值1.答案2.思路 4.搜索旋转排序数组1.答案2.思路 5.在排序数组中查找元素的第一个和最后一个位置1.答案2.思路 6.寻找旋转排序数组中的最小值1.答案2.思路 1.搜索插入位置 1.答案 package com.sunxi…...
MySQL(InnoDB统计信息)
后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 大部分截图和文章采用该书,谢谢这位大佬的文章,在这里真的很感谢让迷茫的…...
Spring Cloud工程搭建
目录 工程搭建 搭建父子工程 创建父工程 Spring Cloud版本 创建子项目-订单服务 声明项⽬依赖 和 项⽬构建插件 创建子项目-商品服务 声明项⽬依赖 和 项⽬构建插件 工程搭建 因为拆分成了微服务,所以要拆分出多个项目,但是IDEA只能一个窗口有一…...
MySQL锁类型(详解)
锁的分类图,如下: 锁操作类型划分 读锁 : 也称为共享锁 、英文用S表示。针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞的。 写锁 : 也称为排他锁 、英文用X表示。当前写操作没有完成前,它会…...
Kafka SASL/SCRAM介绍
文章目录 Kafka SASL/SCRAM介绍1. SASL/SCRAM 认证机制2. SASL/SCRAM 认证工作原理2.1 SCRAM 认证原理2.1.1 密码存储和加盐2.1.2 SCRAM 认证流程 2.2 SCRAM 认证的关键算法2.3 SCRAM 密码存储2.4 SCRAM 密码管理 3. 配置和使用 Kafka SASL/SCRAM3.1 Kafka 服务器端配置3.2 创建…...
使用VCS进行单步调试的步骤
使用VCS对SystemVerilog进行单步调试的步骤如下: 1. 编译设计 使用-debug_all或-debug_pp选项编译设计,生成调试信息。 我的4个文件: 1.led.v module led(input clk,input rst_n,output reg led );reg [7:0] cnt;always (posedge clk) beg…...
计算机网络 应用层 笔记1(C/S模型,P2P模型,FTP协议)
应用层概述: 功能: 常见协议 应用层与其他层的关系 网络应用模型 C/S模型: 优点 缺点 P2P模型: 优点 缺点 DNS系统: 基本功能 系统架构 域名空间: DNS 服务器 根服务器: 顶级域…...
Node.js下载安装及环境配置
目录 一、下载 1. 查看电脑版本,下载对应的安装包 2. 下载路径下载 | Node.js 中文网 二、安装步骤 1. 双击安装包 2. 点击Next下一步 3. 选择安装路径 4. 这里我选择默认配置,继续Next下一步(大家按需选择) 5. 最后inst…...
LeetCode题练习与总结:任务调度器--621
一、题目描述 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表,用字母 A 到 Z 表示,以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一个限制:两个 相同种类 的任务之间必须有长…...
动手学深度学习-3.2 线性回归的从0开始
以下是代码的逐段解析及其实际作用: 1. 环境设置与库导入 %matplotlib inline import random import torch from d2l import torch as d2l作用: %matplotlib inline:在 Jupyter Notebook 中内嵌显示 matplotlib 图形。random:生成…...
鸿蒙HarmonyOS Next 视频边播放边缓存- OhosVideoCache
OhosVideoCache 是一个专为OpenHarmony开发(HarmonyOS也可以用)的音视频缓存库,旨在帮助开发者轻松实现音视频的边播放边缓存功能。以下是关于 OhosVideoCache 的详细介绍: 1. 核心功能 边播放边缓存:将音视频URL传递给 OhosVideoCache 处理后…...
#systemverilog# Verilog与SystemVerilog发展历程及关系
1. Verilog的发展历史 1984年:Gateway Design Automation公司开发了Verilog,最初作为专有语言,用于逻辑仿真和数字电路设计。 1990年:Cadence收购Gateway,Verilog逐步开放,成为行业标准。 1995年(IEEE 1364-1995):首个IEEE标准,即Verilog-1995,定义基础语法和仿真语…...
【集成Element Plus】
集成Element Plus 安装main.ts中全局引入安装图标库 安装 pnpm add element-plusmain.ts中全局引入 import ElementPlus from element-plus; import element-plus/dist/index.css;app.use(ElementPlus);安装图标库 pnpm install element-plus/icons-vue...
基于微信小程序的电子商城购物系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
进阶数据结构——双向循环链表
目录 前言一、定义与结构二、特点与优势三、基本操作四、应用场景五、实现复杂度六、动态图解七、代码模版(c)八、经典例题九、总结结语 前言 这一期我们学习双向循环链表。双向循环链表不同于单链表,双向循环链表是一种特殊的数据结构&…...
Kafka分区策略实现
引言 Kafka 的分区策略决定了生产者发送的消息会被分配到哪个分区中,合理的分区策略有助于实现负载均衡、提高消息处理效率以及满足特定的业务需求。 轮询策略(默认) 轮询策略是 Kafka 默认的分区策略(当消息没有指定键时&…...
【hot100】560和为K的子数组
一、思路 初步思路就是采用双循环以每个节点为头节点,然后向后遍历是否有满足和为K的子数组。 然后我们可以采用另一个新的思路,就是可以采用“前缀和的思路”,具体就是如果hashmap中存在sum-k的值,那就可以说明存在一个何为k的…...
【01】共识机制
BTF共识 拜占庭将军问题 拜占庭将军问题是一个共识问题 起源 Leslie Lamport在论文《The Byzantine Generals Problem》提出拜占庭将军问题。 核心描述 军中可能有叛徒,却要保证进攻一致,由此引申到计算领域,发展成了一种容错理论。随着…...
树莓派pico入坑笔记,故障解决:请求 USB 设备描述符失败,故障码(43)
今天心血来潮,拿出吃灰的pico把玩一下,打开thonny,上电,然后...... 上电识别不到端口,windows报错,请求 USB 设备描述符失败,故障码(43) 一开始以为是坏了(磕…...
大语言模型的个性化综述 ——《Personalization of Large Language Models: A Survey》
摘要: 本文深入解读了论文“Personalization of Large Language Models: A Survey”,对大语言模型(LLMs)的个性化领域进行了全面剖析。通过详细阐述个性化的基础概念、分类体系、技术方法、评估指标以及应用实践,揭示了…...
线程互斥同步
前言: 简单回顾一下上文所学,上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么,总结一句话,就是tid是用户视角下所认为的概念,因为在Linux系统中,从来没有线程这一说法,…...
高效接口限流:基于自定义注解与RateLimiter的实践
在高并发场景下,接口的流量控制是保证系统稳定性和提升性能的关键之一。通过实现接口限流,我们可以有效避免系统在访问高峰时发生崩溃。本文将详细介绍如何通过自定义注解和切面编程结合RateLimiter来实现接口的限流功能,以应对高并发请求。 …...
嵌入式硬件篇---HAL库内外部时钟主频锁相环分频器
文章目录 前言第一部分:STM32-HAL库HAL库编程优势1.抽象层2.易于上手3.代码可读性4.跨平台性5.维护和升级6.中间件支持 劣势1.性能2.灵活性3.代码大小4.复杂性 直接寄存器操作编程优势1.性能2.灵活性3.代码大小4.学习深度 劣势1.复杂性2.可读性3.可维护性4.跨平台性…...
万字长文深入浅出负载均衡器
前言 本篇博客主要分享Load Balancing(负载均衡),将从以下方面循序渐进地全面展开阐述: 介绍什么是负载均衡介绍常见的负载均衡算法 负载均衡简介 初识负载均衡 负载均衡是系统设计中的一个关键组成部分,它有助于…...
使用递归解决编程题
题目:递归实现组合型枚举 从 1−n 这 n 个整数中随机选取 m 个,每种方案里的数从小到大排列,按字典序输出所有可能的选择方案。 输入 输入两个整数 n,m。(1≤m≤n≤10) 输出 每行一组方案,每组方案中…...
Nginx 中文文档
文章来源:nginx 文档 -- nginx中文文档|nginx中文教程 nginx 文档 介绍 安装 nginx从源构建 nginx新手指南管理员指南控制 nginx连接处理方法设置哈希调试日志记录到 syslog配置文件测量单位命令行参数适用于 Windows 的 nginx支持 QUIC 和 HTTP/3 nginx 如何处理…...
2.策略模式(Strategy)
定义 定义一系列算法,把它们一个个封装起来,并且使他们可互相替换(变化)。该模式使算法可独立于使用它的客户程序(稳定)而变化(拓展,子类化)。 动机(Motiva…...
浔川AI翻译v6.0延迟上线说明
浔川社团官方联合会关于浔川AI翻译v6.0版本的说明 尊敬的各位用户: 大家好! 首先,衷心感谢大家一直以来对浔川社团官方联合会以及浔川AI翻译的关注与支持。在此,我们怀着十分遗憾的心情向大家发布一则重要通知:原计划推…...
git基础使用--4---git分支和使用
文章目录 git基础使用--4---git分支和使用1. 按顺序看2. 什么是分支3. 分支的基本操作4. 分支的基本操作4.1 查看分支4.2 创建分支4.3 切换分支4.4 合并冲突 git基础使用–4—git分支和使用 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念…...
[paddle] 矩阵相关的指标
行列式 det 行列式定义参考 d e t ( A ) ∑ i 1 , i 2 , ⋯ , i n ( − 1 ) σ ( i 1 , ⋯ , i n ) a 1 , i 1 a 2 , i 2 , ⋯ , a n , i n det(A) \sum_{i_1,i_2,\cdots,i_n } (-1)^{\sigma(i_1,\cdots,i_n)} a_{1,i_1}a_{2,i_2},\cdots, a_{n,i_n} det(A)i1,i2,⋯,in…...
CH340G上传程序到ESP8266-01(S)模块
文章目录 概要ESP8266模块外形尺寸模块原理图模块引脚功能 CH340G模块外形及其引脚模块引脚功能USB TO TTL引脚 程序上传接线Arduino IDE 安装ESP8266开发板Arduino IDE 开发板上传失败上传成功 正常工作 概要 使用USB TO TTL(CH340G)将Arduino将程序上传…...
CMake的QML项目中使用资源文件
Qt6.5的QML项目中,我发现QML引用资源文件并不像QtWidgets项目那样直接。 在QtWidgets的项目中,我们一般是创建.qrc资源文件,然后创建前缀/new/prefix,再往该前缀中添加一个图片文件,比如:test.png。…...
FBX SDK的使用:读取Mesh
读取顶点数据 要将一个Mesh渲染出来,必须要有顶点的位置,法线,UV等顶点属性,和三角面的顶点索引数组。在提取这些数据之前,先理解FBX SDK里面的几个概念: Control Point 顶点的位置,就是x,y,z…...