从反向传播过程看激活函数与权重初始化的选择对深度神经网络稳定性的影响

news2024/11/25 4:52:48

之前使用深度学习时一直对各种激活函数和权重初始化策略信手拈用,然而不能只知其表不知其里。若想深入理解为何选择某种激活函数和权重初始化方法卓有成效还是得回归本源,本文就从反向传播的计算过程来按图索骥。

为了更好地演示深度学习中的前向传播和反向传播,有必要图文结合,先按下面这个计算图造些数据。


在这里插入图片描述


这是一个输入只有单个样本、包含两个特征,两个隐藏层、分别带有2个神经元,以及一个输出的三层全连接神经网络。

输入和权重

输入 I n p u t Input Input (每行表示一个样本,每列表示一个特征)

X = [ x 1 , x 2 ] = [ 1 , − 1 ] X=[x_1,x_2]=[1,-1] X=[x1,x2]=[1,1]

标签 y = [ 1 ] y=[1] y=[1]

权重 W W W (每列对应一个神经元,行数等于样本特征数)

W 1 = [ w 1 w 3 w 2 w 4 ] = [ 1 − 1 − 2 1 ] \begin{align} W_1 & = \begin{bmatrix} w_1 & w_3 \\ w_2 & w_4 \\ \end{bmatrix} \hspace{100cm} \\ & = \begin{bmatrix} 1 & -1 \\ -2 & 1 \\ \end{bmatrix} \end{align} W1=[w1w2w3w4]=[1211]

W 2 = [ w 5 w 7 w 6 w 8 ] = [ 2 − 2 − 1 − 1 ] \begin{align} W_2 & = \begin{bmatrix} w_5 & w_7 \\ w_6 & w_8 \\ \end{bmatrix} \hspace{100cm} \\ & = \begin{bmatrix} 2 & -2 \\ -1 & -1 \\ \end{bmatrix} \end{align} W2=[w5w6w7w8]=[2121]

W 3 = [ w 9 w 11 w 10 w 12 ] = [ 3 − 1 − 1 4 ] \begin{align} W_3 & = \begin{bmatrix} w_9 & w_{11} \\ w_{10} & w_{12} \\ \end{bmatrix} \hspace{100cm} \\ & = \begin{bmatrix} 3 & -1 \\ -1 & 4 \\ \end{bmatrix} \end{align} W3=[w9w10w11w12]=[3114]

偏置 b b b (长度等于神经元数量)

b 1 = [ b 11 , b 12 ] = [ 1 , 0 ] b_1=[b_{11},b_{12}]=[1,0] b1=[b11,b12]=[1,0]

b 2 = [ b 21 , b 22 ] = [ 0 , 0 ] b_2=[b_{21},b_{22}]=[0,0] b2=[b21,b22]=[0,0]

b 3 = [ − 2 ] b_3=[-2] b3=[2]

前向传播过程

前向传播就是从输入经隐藏层到输出层的计算过程。

从输入到第一个隐藏层的计算

z 1 = w 1 ⋅ x 1 + w 2 ⋅ x 2 + b 11 = 4 z_1=w_1 · x_1 + w_2 · x_2 + b_{11}=4 z1=w1x1+w2x2+b11=4

z 2 = w 3 ⋅ x 1 + w 4 ⋅ x 2 + b 12 = − 2 z_2=w_3 · x_1 + w_4 · x_2 + b_{12}=-2 z2=w3x1+w4x2+b12=2

a 11 = σ ( z 1 ) = 0.9820 a_{11}=\sigma(z_1)=0.9820 a11=σ(z1)=0.9820

a 12 = σ ( z 2 ) = 0.1192 a_{12}=\sigma(z_2)=0.1192 a12=σ(z2)=0.1192

其中, σ = s i g m o i d = 1 1 + e − x \sigma=sigmoid={1 \over{1+e^{-x}}} σ=sigmoid=1+ex1 ,其导数为 σ ′ = s i g m o i d ∗ ( 1 − s i g m o i d ) = 1 1 + e − x − 1 ( 1 + e − x ) 2 \sigma'=sigmoid * (1 - sigmoid)={1 \over{1+e^{-x}}}-{1 \over{(1+e^{-x}})^2} σ=sigmoid(1sigmoid)=1+ex1(1+ex)21

隐藏层 H 1 = [ a 11 , a 12 ] H_1=[a_{11},a_{12}] H1=[a11,a12] ,作为第二个隐藏层的输入。

从第一个隐藏层到第二个隐藏层的计算

z 3 = w 5 ⋅ a 11 + w 6 ⋅ a 12 + b 21 = 1.8448 z_3=w_5 · a_{11} + w_6 · a_{12} + b_{21}=1.8448 z3=w5a11+w6a12+b21=1.8448

z 4 = w 7 ⋅ a 11 + w 8 ⋅ a 12 + b 22 = − 2.0832 z_4=w_7 · a_{11} + w_8 · a_{12} + b_{22}=-2.0832 z4=w7a11+w8a12+b22=2.0832

a 21 = σ ( z 3 ) = 0.8635 a_{21}=\sigma(z_3)=0.8635 a21=σ(z3)=0.8635

a 22 = σ ( z 4 ) = 0.1107 a_{22}=\sigma(z_4)=0.1107 a22=σ(z4)=0.1107

隐藏层 H 2 = [ a 21 , a 22 ] H_2=[a_{21},a_{22}] H2=[a21,a22] ,作为输出层的输入。

从第二个隐藏层到输出层的计算

y ^ = w 9 ⋅ a 21 + w 10 ⋅ a 22 + b 3 = 0.4798 \hat{y}=w_9 · a_{21} + w_{10} · a_{22} + b_{3}=0.4798 y^=w9a21+w10a22+b3=0.4798

一个样本的损失: L = ( y ^ − y ) 2 = y ^ 2 + y 2 − 2 y ^ y = 0.2706 L=(\hat{y}-y)^2=\hat{y}^2+y^2-2\hat{y}y=0.2706 L=(y^y)2=y^2+y22y^y=0.2706

计算结果如下:


在这里插入图片描述


反向传播过程

以求 w 1 w_1 w1 的偏导数为例,其他可仿照之,利用链式法则计算梯度。
∂ L ∂ w 1 = ∂ z 1 ∂ w 1 ∂ L ∂ z 1 = x 1 ∂ L ∂ z 1       ( 1 ) \begin{align} {\partial L \over \partial w_1} & = {\partial z_1 \over \partial w_1} {\partial L \over \partial z_1} \hspace{100cm} \\ &=x_1 {\partial L \over \partial z_1} \ \ \ \ \ (1) \end{align} w1L=w1z1z1L=x1z1L     (1)

∂ L ∂ w 1 = ∂ z 1 ∂ w 1 ∂ a 11 ∂ z 1 ∂ L ∂ a 11 = x 1 σ ′ ( z 1 ) ∂ L ∂ a 11       ( 2 ) \begin{align} {\partial L \over \partial w_1} & = {\partial z_1 \over \partial w_1} {\partial a_{11} \over \partial z_1} {\partial L \over \partial a_{11}} \hspace{100cm} \\ &=x_1 \sigma'(z_1) {\partial L \over \partial a_{11}} \ \ \ \ \ (2) \end{align} w1L=w1z1z1a11a11L=x1σ(z1)a11L     (2)

∂ L ∂ w 1 = ∂ z 1 ∂ w 1 ∂ a 11 ∂ z 1 ( ∂ z 3 ∂ a 11 ∂ L ∂ z 3 + ∂ z 4 ∂ a 11 ∂ L ∂ z 4 ) = x 1 σ ′ ( z 1 ) [ w 5 ∂ L ∂ z 3 + w 7 ∂ L ∂ z 4 ]       ( 3 ) \begin{align} {\partial L \over \partial w_1} & = {\partial z_1 \over \partial w_1} {\partial a_{11} \over \partial z_1} ({\partial z_3 \over \partial a_{11}} {\partial L \over \partial z_{3}} + {\partial z_4 \over \partial a_{11}} {\partial L \over \partial z_{4}}) \hspace{100cm} \\ &=x_1 \sigma'(z_1) [w_5 {\partial L \over \partial z_{3}} + w_7 {\partial L \over \partial z_{4}}] \ \ \ \ \ (3) \end{align} w1L=w1z1z1a11(a11z3z3L+a11z4z4L)=x1σ(z1)[w5z3L+w7z4L]     (3)

∂ L ∂ w 1 = ∂ z 1 ∂ w 1 ∂ a 11 ∂ z 1 ( ∂ z 3 ∂ a 11 ∂ a 21 ∂ z 3 ∂ L ∂ a 21 + ∂ z 4 ∂ a 11 ∂ a 22 ∂ z 4 ∂ L ∂ a 22 ) = x 1 σ ′ ( z 1 ) [ w 5 σ ′ ( z 3 ) ∂ L ∂ a 21 + w 7 σ ′ ( z 4 ) ∂ L ∂ a 22 ]       ( 4 ) \begin{align} {\partial L \over \partial w_1} & = {\partial z_1 \over \partial w_1} {\partial a_{11} \over \partial z_1} ({\partial z_3 \over \partial a_{11}} {\partial a_{21} \over \partial z_{3}} {\partial L \over \partial a_{21}} + {\partial z_4 \over \partial a_{11}} {\partial a_{22} \over \partial z_{4}} {\partial L \over \partial a_{22}}) \hspace{100cm} \\ &=x_1 \sigma'(z_1) [w_5 \sigma'(z_3) {\partial L \over \partial a_{21}} + w_7 \sigma'(z_4) {\partial L \over \partial a_{22}}] \ \ \ \ \ (4) \end{align} w1L=w1z1z1a11(a11z3z3a21a21L+a11z4z4a22a22L)=x1σ(z1)[w5σ(z3)a21L+w7σ(z4)a22L]     (4)

∂ L ∂ w 1 = ∂ z 1 ∂ w 1 ∂ a 11 ∂ z 1 ( ∂ z 3 ∂ a 11 ∂ a 21 ∂ z 3 ∂ y ^ ∂ a 21 ∂ L ∂ y ^ + ∂ z 4 ∂ a 11 ∂ a 22 ∂ z 4 ∂ y ^ ∂ a 22 ∂ L ∂ y ^ ) = x 1 σ ′ ( z 1 ) [ w 5 σ ′ ( z 3 ) w 9 ∂ L ∂ y ^ + w 7 σ ′ ( z 4 ) w 10 ∂ L ∂ y ^ ]       ( 5 ) \begin{align} {\partial L \over \partial w_1} & = {\partial z_1 \over \partial w_1} {\partial a_{11} \over \partial z_1} ({\partial z_3 \over \partial a_{11}} {\partial a_{21} \over \partial z_{3}} {\partial \hat{y} \over \partial a_{21}} {\partial L \over \partial \hat{y}} + {\partial z_4 \over \partial a_{11}} {\partial a_{22} \over \partial z_{4}} {\partial \hat{y} \over \partial a_{22}} {\partial L \over \partial \hat{y}}) \hspace{100cm} \\ &=x_1 \sigma'(z_1) [w_5 \sigma'(z_3) w_9 {\partial L \over \partial \hat{y}} + w_7 \sigma'(z_4) w_{10} {\partial L \over \partial \hat{y}}] \ \ \ \ \ (5) \end{align} w1L=w1z1z1a11(a11z3z3a21a21y^y^L+a11z4z4a22a22y^y^L)=x1σ(z1)[w5σ(z3)w9y^L+w7σ(z4)w10y^L]     (5)

∂ L ∂ w 1 = x 1 σ ′ ( z 1 ) [ w 5 σ ′ ( z 3 ) w 9 ∂ L ∂ y ^ + w 7 σ ′ ( z 4 ) w 10 ∂ L ∂ y ^ ] = 1 ∗ 0.0177 ∗ [ 2 ∗ 0.1179 ∗ 3 ∗ ( 2 y ^ − 2 y ) + ( − 2 ∗ 0.0985 ∗ − 1 ∗ ( 2 y ^ − 2 y ) ) ] = − 0.0166       ( 6 ) \begin{align} {\partial L \over \partial w_1} & = x_1 \sigma'(z_1) [w_5 \sigma'(z_3) w_9 {\partial L \over \partial \hat{y}} + w_7 \sigma'(z_4) w_{10} {\partial L \over \partial \hat{y}}] \hspace{100cm} \\ &=1*0.0177*[2*0.1179*3*(2 \hat{y}-2y) + (-2*0.0985*-1*(2 \hat{y}-2y))] \\ &=-0.0166 \ \ \ \ \ (6) \end{align} w1L=x1σ(z1)[w5σ(z3)w9y^L+w7σ(z4)w10y^L]=10.0177[20.11793(2y^2y)+(20.09851(2y^2y))]=0.0166     (6)

与pytorch计算结果相同。

import torch
from torch import nn

#输入与权重
X=torch.tensor([[1.0,-1.0]])
y=torch.tensor([1.0])
W1=torch.tensor([[1.0,-1.0],[-2.0,1.0]],requires_grad=True)
b1=torch.tensor([1.0,0.0],requires_grad=True)
W2=torch.tensor([[2.0,-2.0],[-1.0,-1.0]],requires_grad=True)
b2=torch.tensor([0.0,0.0],requires_grad=True)
W3=torch.tensor([[3.0],[-1.0]],requires_grad=True)
b3=torch.tensor([-2.0],requires_grad=True)

#隐藏层1
z1=torch.matmul(X,W1)+b1
a1=torch.sigmoid(z1) 

#隐藏层2
z2=torch.matmul(a1,W2)+b2
a2=torch.sigmoid(z2) 

#输出层
y_hat=torch.matmul(a2,W3)+b3

#损失函数
loss=nn.MSELoss(reduction='none')

#计算损失
L=loss(y_hat,y).sum()
L.backward()
print(W1.grad)

在这里插入图片描述


要想求 ∂ L ∂ w 1 {\partial L \over \partial w_1} w1L ,我们先看式 ( 1 ) (1) (1) ∂ z 1 ∂ w 1 {\partial z_1 \over \partial w_1} w1z1 是可以立刻得出的,因为它就是 w 1 w_1 w1 前面连接的输入的值。实际上对于任何权重,其偏导数 ∂ w {\partial w} w 表达式的第一项都是可以通过其连接的输入立刻获得(即利用前向传播过程中存储的每个神经元的中间结果),比如对于靠后的 w 9 w_9 w9 ,其输入为 a 21 a_{21} a21 ,展开得:

a 21 = σ [ w 5 ⋅ σ ( w 1 ⋅ x 1 + w 2 ⋅ x 2 + b 11 ) + w 6 ⋅ σ ( w 3 ⋅ x 1 + w 4 ⋅ x 2 + b 12 ) + b 21 ] a_{21}=\sigma[w_5 · \sigma(w_1 · x_1 + w_2 · x_2 + b_{11}) + w_6 · \sigma(w_3 · x_1 + w_4 · x_2 + b_{12}) + b_{21}] a21=σ[w5σ(w1x1+w2x2+b11)+w6σ(w3x1+w4x2+b12)+b21]

a 21 a_{21} a21 σ ( W 2 σ ( W 1 X + b 1 ) + b 2 )       ( 7 ) \sigma(W_2 \sigma(W_1X+b1)+b2) \ \ \ \ \ (7) σ(W2σ(W1X+b1)+b2)     (7) 结果其中之一。

可以看出,每一部分都会经激活函数,而对于 s i g m o i d sigmoid sigmoid 激活函数来说,第一项的计算可能会是无穷小,因此可能会引发梯度消失问题,而使用Relu则可以 减轻困扰以往神经网络的梯度消失问题。


在这里插入图片描述

sigmoid图像

在这里插入图片描述

Relu图像

继续回到对 ∂ L ∂ w 1 {\partial L \over \partial w_1} w1L 的讨论上。现在还要求 ∂ L ∂ z 1 {\partial L \over \partial z_1} z1L ,那么 ∂ L ∂ z 1 {\partial L \over \partial z_1} z1L 如何求解呢?这就是反向传播要解决的问题了。

我们再回看一下式 ( 2 ) − ( 5 ) (2)-(5) (2)(5) 中的 ∂ L ∂ z 1 {\partial L \over \partial z_1} z1L ,列示如下:

∂ L ∂ z 1 = σ ′ ( z 1 ) ∂ L ∂ a 11 {\partial L \over \partial z_1} = \sigma'(z_1) {\partial L \over \partial a_{11}} z1L=σ(z1)a11L

∂ L ∂ z 1 = σ ′ ( z 1 ) [ w 5 ∂ L ∂ z 3 + w 7 ∂ L ∂ z 4 ] {\partial L \over \partial z_1} = \sigma'(z_1) [w_5 {\partial L \over \partial z_{3}} + w_7 {\partial L \over \partial z_{4}}] z1L=σ(z1)[w5z3L+w7z4L]

∂ L ∂ z 1 = σ ′ ( z 1 ) [ w 5 σ ′ ( z 3 ) ∂ L ∂ a 21 + w 7 σ ′ ( z 4 ) ∂ L ∂ a 22 ] {\partial L \over \partial z_1} = \sigma'(z_1) [w_5 \sigma'(z_3) {\partial L \over \partial a_{21}} + w_7 \sigma'(z_4) {\partial L \over \partial a_{22}}] z1L=σ(z1)[w5σ(z3)a21L+w7σ(z4)a22L]

∂ L ∂ z 1 = σ ′ ( z 1 ) [ w 5 σ ′ ( z 3 ) w 9 ∂ L ∂ y ^ + w 7 σ ′ ( z 4 ) w 10 ∂ L ∂ y ^ ] {\partial L \over \partial z_1} = \sigma'(z_1) [w_5 \sigma'(z_3) w_9 {\partial L \over \partial \hat{y}} + w_7 \sigma'(z_4) w_{10} {\partial L \over \partial \hat{y}}] z1L=σ(z1)[w5σ(z3)w9y^L+w7σ(z4)w10y^L]

可以看出,从前往后计算 ∂ L ∂ z 1 {\partial L \over \partial z_1} z1L 会不太容易,因为前面项总会依赖后面项的计算结果,所以得先一直往后计算。

但反过来就简单多了,我们可以从最后一项出发,对于最初的计算图,最后一项是输出值关于损失的导数 ∂ L ∂ y ^ {\partial L \over \partial \hat{y}} y^L ,这个可以由确定的损失函数求得。

有了 ∂ L ∂ y ^ {\partial L \over \partial \hat{y}} y^L ,可以通过 w 9 、 w 10 w_9、w_{10} w9w10 求得 ∂ L ∂ a 21 、 ∂ L ∂ a 22 {\partial L \over \partial a_{21}}、 {\partial L \over \partial a_{22}} a21La22L

有了 ∂ L ∂ a 21 、 ∂ L ∂ a 22 {\partial L \over \partial a_{21}}、 {\partial L \over \partial a_{22}} a21La22L ,可以通过 w 5 、 w 7 w_5、w_7 w5w7 求得 ∂ L ∂ a 11 {\partial L \over \partial a_{11}} a11L (别忘了中间还要乘以一个 $\sigma’(z) $ , z z z 只是一个常量,也可以从前向传播存储的中间结果获得) 。

再回味一下上面这个从后往前的计算过程,是不是跟前向传播很相似?这就是梯度的反向传播!与前向传播的图示比对如下:


在这里插入图片描述

反向传播

在这里插入图片描述

前向传播

其中:

∂ L ∂ a 21 = w 9 ∂ L ∂ y ^       ( 8 ) {\partial L \over \partial a_{21}}=w_9 {\partial L \over \partial \hat{y}} \ \ \ \ \ (8) a21L=w9y^L     (8)

∂ L ∂ a 22 = w 10 ∂ L ∂ y ^       ( 9 ) {\partial L \over \partial a_{22}}=w_{10} {\partial L \over \partial \hat{y}} \ \ \ \ \ (9) a22L=w10y^L     (9)

∂ L ∂ a 11 = w 5 ∂ L ∂ z 3 + w 7 ∂ L ∂ z 4       ( 10 ) {\partial L \over \partial a_{11}}=w_5 {\partial L \over \partial z_{3}} + w_7 {\partial L \over \partial z_{4}} \ \ \ \ \ (10) a11L=w5z3L+w7z4L     (10)

∂ L ∂ z 3 = σ ′ ( z 3 ) ∂ L ∂ a 21 {\partial L \over \partial z_{3}}=\sigma'(z_3) {\partial L \over \partial a_{21}} z3L=σ(z3)a21L

∂ L ∂ z 4 = σ ′ ( z 4 ) ∂ L ∂ a 22 {\partial L \over \partial z_{4}}=\sigma'(z_4) {\partial L \over \partial a_{22}} z4L=σ(z4)a22L

∂ L ∂ z 1 = σ ′ ( z 1 ) ∂ L ∂ a 11 {\partial L \over \partial z_{1}}=\sigma'(z_1) {\partial L \over \partial a_{11}} z1L=σ(z1)a11L

这个计算过程和前向传播很类似(尤其是式 ( 10 ) (10) (10) ),所以称之为反向传播。

从式 ( 5 ) 、 ( 7 ) (5)、(7) (5)(7) 可以看出,每个权重的偏导数都会涉及到一连串 w w w 与激活函数导数的乘积以及权重与输入的乘积,试想,如果没有一个良好初始化的权重,这么多 w w w 相乘很可能会引起梯度爆炸或梯度消失等参数不稳定问题。

比如方差为1的正态随机矩阵和一个初始权重矩阵相乘,会引起梯度爆炸:

W = torch.normal(0, 1, size=(5,5)) 
print('初始权重矩阵 \n',W) 
for i in range(100):
    W = torch.matmul(W,torch.normal(0, 1, size=(5, 5)))

print('100个矩阵相乘后 \n', W)

在这里插入图片描述


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

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

相关文章

Modbus主站和从站的区别

Modbus主站,从站 在工业自动化领域,Modbus是一种常用的通信协议,用于设备之间的数据交换。在Modbus通信中,主站和从站是两个关键的角色。了解主站和从站之间的区别对正确配置和管理Modbus网络至关重要。 Modbus主站的特点和功能 1.通信请求发…

文献阅读:Solving olympiad geometry without human demonstrations

文献阅读:Solving olympiad geometry without human demonstrations 1. 文章简介2. 方法介绍 1. Overview2. Symbolic deduce3. Language Model4. 联合使用 3. 实验考察 & 结论 1. 基础实验考察2. 结果分析3. 样例展示 4. 总结 & 思考 文献链接&#xff1a…

《web应用技术》第十次作业

将自己的项目改造为基于vue-cli脚手架的项目&#xff0c;页面有导航&#xff0c;学会使用router。 <el-aside width"200px" style"background-color: aliceblue;"> <el-menu :default-openeds"[1]" style"background-color:rgb(1…

关于Redis中哨兵(Sentinel)

Redis Sentinel 相关名词解释 名词 逻辑结构 物理结构 主节点 Redis 主服务 一个独立的 redis-server 进程 从节点 Redis 从服务 一个独立的 redis-server 进程 Redis 数据节点 主从节点 主节点和从节点的进程 哨兵节点 监控 Redis 数据节点的节点 一个独立的 re…

Cyber Weekly #10

赛博新闻 1、最强开源大模型面世&#xff1a;阿里发布Qwen2 6月7日凌晨&#xff0c;阿里巴巴通义千问团队发布了Qwen2系列开源模型。该系列模型包括5个尺寸的预训练和指令微调模型&#xff1a;Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B以及Qwen2-72B。据Qwen官方博客…

开发没有尽头,尽力既是完美

最近遇到了一些难题&#xff0c;开发系统总有一些地方没有考虑周全&#xff0c;偏偏用户使用的时候“完美复现”了这个隐藏的Bug...... 讲道理创业一年之久为了生存&#xff0c;我一直都有在做复盘&#xff0c;复盘的核心就是&#xff1a;如何提升营收、把控开发质量&#xff0…

嵌入式仪器模块:示波器模块和自动化测试软件

示波器模块 • 32 位分辨率 • 125 MSPS 采样率 • 支持单通道/双通道模块选择 • 低速模式可实现实时功率分布和整机功率检测 • 高速模式可实现信号分析和上电时序测量 应用场景 • 抓取并分析波形的周期、幅值、异常信号等指标 • 电源纹波与噪声分析 • 信号模板比…

vue28:组件化开发和根组件

简单写个点击事件 <template> <div class"app"><div class"box" click"fn"></div></div> </template><script> export default {//导出当前组件的配置项//里面可以提供 data methods computed wat…

SpringBoot: 启动流程和类装载

前面我们学过Spring定制了自己的可执行jar&#xff0c;将真正执行时需要的类和依赖放到BOOT-INF/classes、BOOT-INF/lib来&#xff0c;为了能够识别这些为止的源文件&#xff0c;Spring定制了自己类加载器&#xff0c;本节我们来讲解这个类加载器。本节涉及的内容主要包括: Sp…

web端中使用vue3 实现 移动端的上拉滚动加载功能

需要再web端实现上拉加载 纯属web端的东西 类似这样的功能效果 能够在web端实现滚动分页 overflow-y: scroll;首先给这个大盒子 一个 css 样式 支持滚动 再给固定高度 这个盒子里的内容就能立马滚动起来 给这个盒子一个ref 的属性 以及 有原生滚动事件 scroll const handle…

Wireshark TS | 应用传输丢包问题

问题背景 仍然是来自于朋友分享的一个案例&#xff0c;实际案例不难&#xff0c;原因也就是互联网线路丢包产生的重传问题。但从一开始只看到数据包截图的判断结果&#xff0c;和最后拿到实际数据包的分析结果&#xff0c;却不是一个结论&#xff0c;方向有点跑偏&#xff0c;…

gdb 【Linux】

程序发布方式&#xff1a;  1、debug版本&#xff1a;程序会被加入调试信息&#xff0c;以便于进行调试。  2、release版本&#xff1a;不添加任何调试信息&#xff0c;是不可调试   确定一个可执行程序是debug&#xff0c;还是release [cxqiZ7xviiy0goapxtblgih6oZ test_g…

张大哥笔记:经济下行,这5大行业反而越来越好

现在人们由于生活压力大&#xff0c;于是就干脆降低自己的欲望&#xff0c;只要不是必需品就不买了&#xff0c;自然而然消费也就降低了&#xff0c;消费降级未必是不好的现象&#xff01; 人的生物本能是趋利避害&#xff0c;追求更好的生存和发展空间&#xff0c;回避对自己有…

Vue3+Vite报错:vite忽略.vue扩展名 Failed to resolve import ..... Does the file exist?

Vue3Vite报错&#xff1a;vite忽略.vue扩展名 Failed to resolve import … Does the file exist? 先看报错&#xff1a; 分析原因 原因是我们没有写后缀名 建议你在你的vite.config.js中加上如下配置 import { defineConfig } from "vite"; import vue from &qu…

华为坤灵路由器配置SSH

配置SSH服务器的管理网口IP地址。 <HUAWEI> system-view [HUAWEI] sysname SSH Server [SSH Server] interface meth 0/0/0 [SSH Server-MEth0/0/0] ip address 10.248.103.194 255.255.255.0 [SSH Server-MEth0/0/0] quit 在SSH服务器端生成本地密钥对。 [SSH Server…

SpringAI(二)

大模型:具有大规模参数和复杂计算结构的机器学习模型.通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数.其设计目的在于提高模型的表达能力和预测性能,应对复杂的任务和数据. SpringAI是一个AI工程领域的应用程序框架 大概推出时间是2023年7月份(不确定) 目的是将S…

单片机数码管时钟电路的设计

5 调试 数码管的引脚1&#xff5e;4&#xff0c;a&#xff5e;g以及小数点的排列都不是连续的&#xff0c;这就意味着难免需要飞线。数码管是分共阴和共阳的&#xff0c;起初我错把原理图中的共阳数码管当成了共阴数码管&#xff0c;焊上去了之后才发现&#xff0c;为了避免拆卸…

如何下载BarTender软件及详细安装步骤

BarTender是美国海鸥科技推出的一款优秀的条码打印软件&#xff0c;应用于 WINDOWS95 、 98 、 NT 、 XP 、 2000 、 2003 和 3.1 版本&#xff0c; 产品支持广泛的条形码码制和条形码打印机&#xff0c; 不但支持条形码打印机而且支持激光打印机&#xff0c;还为世界知名品牌条…

sqli-labs 靶场 less-11~14 第十一关、第十二关、第十三关、第十四关详解:联合注入、错误注入

SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它&#xff0c;我们可以学习如何识别和利用不同类型的SQL注入漏洞&#xff0c;并了解如何修复和防范这些漏洞。Less 11 SQLI DUMB SERIES-11判断注入点 尝试在用户名这个字段实施注入,且试出SQL语句闭合方式为单…

基于stm32最小版的超声波测距模块

目录 一、模块准备 二、HC-SR04模块原理解释 三、程序完整代码 四、烧录结果 总结 一、模块准备 STM32F103C8T6 HC-SR04 ST-Link&#xff08;其他烧录器也可以&#xff09; 0.96寸OLED屏幕&#xff08;非必须&#xff0c;仅供显示测距结果&#xff0c;可以使用串口助手代替…