深度学习激活函数与损失函数全解析:从Sigmoid到交叉熵的数学原理与实践应用
目录
- 前言
- 一、sigmoid 及导数求导
- 二、tanh
- 三、ReLU
- 四、Leaky Relu
- 五、 Prelu
- 六、Softmax
- 七、ELU
- 八、极大似然估计与交叉熵损失函数
- 8.1 极大似然估计与交叉熵损失函数算法理论
- 8.1.1 伯努利分布
- 8.1.2 二项分布
- 8.1.3 极大似然估计
- 总结
前言
书接上文
PaddlePaddle线性回归详解:从模型定义到加载,掌握深度学习基础-CSDN博客文章浏览阅读995次,点赞24次,收藏18次。本文深入讲解了使用PaddlePaddle框架实现线性回归的完整流程,涵盖了模型定义(包括序列方式和类方式)、数据加载、模型保存(基础API和高级API)、模型加载(基础API和高级API)以及模型网络结构查看等关键步骤,旨在帮助读者全面掌握PaddlePaddle框架下线性回归的实现方法,并理解其背后的原理。同时,文章还涉及曲线拟合的理论与实践,以及多种激活函数的特性与应用,为读者构建扎实的深度学习基础。https://blog.csdn.net/qq_58364361/article/details/147408186?fromshare=blogdetail&sharetype=blogdetail&sharerId=147408186&sharerefer=PC&sharesource=qq_58364361&sharefrom=from_link
一、sigmoid 及导数求导
import numpy as np # 导入 numpy 库,用于数值计算
import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 模块,用于绘图def sigmoid(x):"""Sigmoid 激活函数:param x: 输入值:return: Sigmoid 函数的输出"""return 1 / (1 + np.exp(-x)) # Sigmoid 函数的公式def sigmoid_derivative(x):"""Sigmoid 激活函数的导数:param x: 输入值:return: Sigmoid 函数导数的输出"""return sigmoid(x) * (1 - sigmoid(x)) # Sigmoid 导数的公式x = np.linspace(-5, 5, 100) # 创建一个从 -5 到 5 的等间隔的 100 个点的数组
y = sigmoid(x) # 计算 sigmoid 函数的值
y1 = sigmoid_derivative(x) # 计算 sigmoid 导数的值plt.figure() # 创建一个新的图形
plt.plot(x, y, label='sigmoid') # 绘制 sigmoid 函数的图像
plt.plot(x, y1, label='sigmoid_derivative') # 绘制 sigmoid 导数的图像
plt.legend() # 显示图例
plt.show() # 显示图形
二、tanh
下面学一下双曲正切的激活函数tanh
tanh激活函数的数学公式为
该函数解决了Sigmoid函数不以零为中心的问题,它的取值范围是(-1,1),无限接近1和-1,但永不等于1或者-1,它是关于0中心对称,以零为中心。
tanh导数公式为:
tanh特点总结:
输出范围:tanh 函数的输出范围被限制在 -1 到 1 之间,因此它可以使神经网络的输出更接近于零中心,有助于减少梯度消失问题。
零中心性:tanh 函数的输出以零为中心,即在输入为 0 时函数值为 0,这有助于减少梯度消失问题,并使得神经网络更容易学习。
相对于Sigmoid函数,优势显而易见:
输出以零为中心:tanh函数的输出范围是-1到1之间,其均值为零,因此它是零中心的激活函数。相比于Sigmoid函数,tanh函数能够更好地处理数据的中心化和对称性,有助于提高网络的学习效率。
饱和区域更大:在输入绝对值较大时,tanh函数的斜率较大,这使得它在非线性变换上比Sigmoid函数更加陡峭,有助于提供更强的非线性特性,从而提高了网络的表达能力。
良好的输出范围:tanh函数的输出范围在-1到1之间,相比于Sigmoid函数的0到1之间,输出范围更广,有助于减少数据在网络中传播时的数值不稳定性。
但是缺点也同样明显:
容易出现梯度消失问题:虽然相比于Sigmoid函数,tanh函数在非饱和区域的斜率较大,但在输入绝对值较大时,其导数仍然会接近于零,可能导致梯度消失问题。
- 计算难度同样大。
import numpy as np # 导入 numpy 库,用于数值计算
import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 模块,用于绘图def tanh(x):"""tanh 激活函数:param x: 输入值:return: tanh 函数的输出"""return np.tanh(x) # 返回 tanh 函数的计算结果def tanh_derivative(x):"""tanh 激活函数的导数:param x: 输入值:return: tanh 函数导数的输出"""return 1 - np.tanh(x) ** 2 # 返回 tanh 导数的计算结果x = np.linspace(-5, 5, 100) # 创建一个从 -5 到 5 的等间隔的 100 个点的数组
y = tanh(x) # 计算 tanh 函数的值
y1 = tanh_derivative(x) # 计算 tanh 导数的值plt.figure() # 创建一个新的图形
plt.plot(x, y, label='tanh') # 绘制 tanh 函数的图像
plt.plot(x, y1, label='tanh_derivative') # 绘制 tanh 导数的图像
plt.legend() # 显示图例
plt.show() # 显示图形
三、ReLU
ReLU激活函数的数学公式为:
ReLU函数其实是分段线性函数,把所有的负值都变为0,而正值不变。
ReLU函数的导数公式为:
ReLU特点:
稀疏性:ReLU 函数的导数在输入为负数时为零,这意味着在反向传播过程中,只有激活的神经元会传递梯度,从而促进了稀疏激活的现象,有助于减少过拟合。
计算高效:ReLU 函数的计算非常简单,并且在实践中被证明是非常高效的。
解决梯度消失问题: ReLU函数在输入大于零时输出其本身值,这使得在反向传播时梯度保持为常数1,避免了梯度消失问题。ReLU函数在深度网络中更容易训练。
ReLU函数的优势:
- 解决梯度消失问题: ReLU函数在输入大于零时输出输入值,这使得在反向传播时梯度保持为常数1,避免了梯度消失问题。相比于Sigmoid和tanh函数,ReLU函数在深度网络中更容易训练,使得网络能够更有效地学习复杂的特征。
- 计算速度快: ReLU函数的计算非常简单,只需进行一次阈值判断和取最大值操作。这使得在大规模深度神经网络中,ReLU函数的计算速度远快于Sigmoid和tanh函数,加快了模型训练的速度。
- 稀疏激活性: 在输入小于零的情况下,ReLU函数的输出是零,这表现为稀疏激活性。这意味着在激活后,一部分神经元将被激活,而其他神经元则保持不活跃。这有助于减少神经网络中的冗余计算和参数数量,提高了网络的泛化能力。
它的劣势:
- 死亡ReLU问题(Dying ReLU): 在训练过程中,某些神经元可能会遇到“死亡ReLU”问题,即永远不会被激活。如果某个神经元在训练过程中的权重更新导致在其上的输入始终为负值,那么它的输出将永远为零。这意味着该神经元不会再学习或参与后续训练,导致该神经元“死亡”,从而减少了网络的表达能力。
死亡relu问题理解
ReLU函数导数只可以取两个值,当输入小于0时,导数为0;当输入大于0时,导数为1,在反向传播过程中,
(w新=w旧-学习率*梯度),如果学习率比较大,一个很大的梯度更新后,经过Relu激活函数,可能会导致ReLU神经元更新后的权重是负数,进而导致下一轮正向传播过程中ReLU神经元的输入是负数,输出是0,由于ReLU神经元的输出为0,在后续迭代的反向过程中,该处的梯度一直为0,相关参数不再变化,从而导致ReLU神经元的输入始终是负数,输出始终为0。即为“死亡ReLU问题”。
(relu产生的情况,第一种情况就是输入大部分是负值,第二种情况 w更新后成为负数,第3种情况就是b为比较大的负数)
- 输出不是以零为中心: ReLU函数的输出范围是从零开始,因此输出不是以零为中心的。这可能会导致训练过程中的参数更新存在偏差,降低了网络的优化能力。
- 不适合所有问题: 尽管ReLU函数在大多数情况下表现良好,但并不是适合所有问题。对于一些问题,特别是在处理一些包含负值的数据时,ReLU函数可能不够理想,可能会产生不良的结果。
针对ReLU函数的劣势,研究人员也提出了一些改进的激活函数,如Leaky ReLU、Parametric ReLU和Exponential Linear Units(ELU)等,这些函数在一定程度上缓解了ReLU函数的问题,并在特定情况下表现更好。因此,在实际使用中,根据具体问题和实验结果选择合适的激活函数是很重要的。
import numpy as np # 导入 numpy 库,用于数值计算
import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 模块,用于绘图def relu(x):"""ReLU 激活函数:param x: 输入值:return: ReLU 函数的输出"""return np.maximum(0, x) # 返回 ReLU 函数的计算结果,即 max(0, x)def relu_derivative(x):"""ReLU 激活函数的导数:param x: 输入值:return: ReLU 函数导数的输出"""return np.where(x > 0, 1, 0) # 返回 ReLU 导数的计算结果,当 x > 0 时为 1,否则为 0x = np.linspace(-5, 5, 100) # 创建一个从 -5 到 5 的等间隔的 100 个点的数组
y = relu(x) # 计算 ReLU 函数的值
y1 = relu_derivative(x) # 计算 ReLU 导数的值plt.figure() # 创建一个新的图形
plt.plot(x, y, label='relu') # 绘制 ReLU 函数的图像
plt.plot(x, y1, label='relu_derivative') # 绘制 ReLU 导数的图像
plt.legend() # 显示图例
plt.show() # 显示图形
四、Leaky Relu
公式:
f(x)=max(αx, x),其中 α 是一个小常数(例如0.01)
导数:
f’(x)=1,当x>0时。
f’(x)=α,当x<=0时。
Leaky ReLU 通过在负数区域引入小的正斜率 α 来避免ReLU的“死亡”问题,允许负数区域的梯度不为零。
import numpy as np # 导入 numpy 库,用于数值计算
import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 模块,用于绘图def leaky_relu(x, a=0.01):"""Leaky ReLU 激活函数:param x: 输入值:param a: 斜率,默认为 0.01:return: Leaky ReLU 函数的输出"""return np.maximum(a * x, x) # 返回 Leaky ReLU 函数的计算结果,即 max(a*x, x)def leaky_relu_derivative(x, a=0.01):"""Leaky ReLU 激活函数的导数:param x: 输入值:param a: 斜率,默认为 0.01:return: Leaky ReLU 函数导数的输出"""return np.where(x > 0, 1, a) # 返回 Leaky ReLU 导数的计算结果,当 x > 0 时为 1,否则为 ax = np.linspace(-5, 5, 100) # 创建一个从 -5 到 5 的等间隔的 100 个点的数组
y = leaky_relu(x) # 计算 leaky_relu 函数的值
y1 = leaky_relu_derivative(x) # 计算 leaky_relu 导数的值plt.figure() # 创建一个新的图形
plt.plot(x, y, label='relu') # 绘制 leaky_relu 函数的图像
plt.plot(x, y1, label='relu_derivative') # 绘制 leaky_relu 导数的图像
plt.legend() # 显示图例
plt.show() # 显示图形
五、 Prelu
Prelu 和 Leaky Relu想比,Prelu的α是可学习的。
公式:
f(x)=max(αx, x),其中 α 是一个可学习的参数。
导数:
f’(x)=1,当x>0时。
f’(x)=α,当x<=0时。
PReLU是Leaky ReLu的一个变种,其中a是通过学习得到的,这使得模型可以适应性地改变其行为。
import numpy as np # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt # 导入Matplotlib库,用于绘图def p_relu(x, alpha=0.25):"""参数化ReLU激活函数:param x: 输入值:param alpha: 斜率小于0时的系数,默认为0.25:return: PReLU激活值"""return np.maximum(alpha * x, x) # 返回alpha*x和x中的较大值def p_relu_derivative(x, alpha=0.25):"""参数化ReLU激活函数的导数:param x: 输入值:param alpha: 斜率小于0时的系数,默认为0.25:return: PReLU导数值"""return np.where(x > 0, 1, alpha) # 当x>0时返回1,否则返回alphax = np.linspace(-5, 5, 100) # 创建一个从-5到5的等间隔数组,包含100个点
y_p_relu = p_relu(x) # 计算x的PReLU激活值
y_p_relu_derivative = p_relu_derivative(x) # 计算x的PReLU导数值
plt.figure(figsize=(8, 6)) # 创建一个图形,设置大小为8x6英寸
plt.plot(x, y_p_relu) # 绘制x和PReLU激活值的关系图
plt.plot(x, y_p_relu_derivative) # 绘制x和PReLU导数值的关系图
plt.show() # 显示图形
六、Softmax
softmax激活函数,但是很多地方,不会把softmax称为激活函数,但是呢没有一个合理的叫法,它就叫softmax函数,但是呢,它的性质上无论和我们的sigmoid或者tanh 或者relu等其实是类似的,我们可以把它称为激活函数。
softmax激活函数为什么不把它称为激活函数,是因为和它的位置是有关系的。为什么呢?
softmax这个函数和我们的sigmoid函数也好。relu函数也好,不一样的点在哪里?如果sigmoid函数位于算法的最后一层,做二分类的活。softmax函数它一般只用于最后一次的激活,也就是输出之前的一次激活,前面不用softmax。 softmax一般不用于回归算法中,一般是用于分类中,我们前面计算的都是在算拟合和回归,softmax它做的是分类。
eg:猫和狗,当我们的输出不是一个值而是一个向量的时候,比如要分成三类(猫,狗 ,老虎)三类,根据输出的向量数值,按照下面的公式进行计算。
然后再结合后面的交叉熵就可以计算损失值。
Softmax函数,可以将神经网络计算出来的数值通过公式变成概率,经过softmax后得到的结果相加和为1。
另一个优势就是不论向量输出的结果是正值还是负值都能转化为正值。
这个在后续的深度学习中用的非常多。
当n=100时,即有100类时,其图像如下图所示:
softmax 特点总结:
概率分布:Softmax函数将输入转换为概率分布,因此在多分类问题中常用于将模型的原始输出转换为概率值。
连续可导:Softmax函数是连续可导的,这使得它可以与梯度下降等优化算法一起使用进行训练。
指数增长:Softmax函数中的指数运算可能会导致数值稳定性问题,特别是当输入较大时。为了解决这个问题,可以通过减去输入向量中的最大值来进行数值稳定的计算。
梯度计算简单:Softmax函数的导数计算相对简单,可以通过对Softmax函数的定义进行微分得到。
涉及到softmax求导,看一下它怎么求导?
import numpy as np # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt # 导入Matplotlib库,用于绘图def softmax(x):n_val = np.exp(x) # 计算输入x的指数d_val = np.sum(np.exp(x)) # 计算所有指数的和return n_val / d_val # 返回Softmax值def softmax_derivative(x):s = softmax(x) # 计算Softmax值return np.diagflat(s) - np.outer(s, s) # 计算Softmax导数x = np.linspace(-5, 5, 50) # 创建一个从-5到5的等间隔数组,包含50个点
y_softmax = softmax(x) # 计算x的Softmax值
y_softmax_derivative = softmax_derivative(x) # 计算x的Softmax导数
plt.figure(figsize=(8, 6)) # 创建一个图形,设置大小为8x6英寸
plt.plot(x, y_softmax) # 绘制x和Softmax值的关系图
plt.plot(x, y_softmax_derivative) # 绘制x和Softmax导数的关系图
plt.show() # 显示图形
七、ELU
前面的激活函数学完后,现在学习最后一个激活函数,它叫ELU的激活函数。
ELU(Expoentital Linear Unit)激活函数是深度学习中用于增强网络学习能力的又一种激活函数,ELU通过在负值输入时提供负值输出,旨在结合Relu的优点和解决其潜在的一些问题,如ReLU的不活跃神经元问题。
数序定义
ELU函数的数学表达式定义为:
中,x是函数的输入,α是一个预定义的超参数,用于控制x为负值时输出的饱和度。
图像如下:
2.函数特性
非线性:ELU是非线性的,可以帮助神经网络学习复杂的数据表示。
连续可导:ELU在整个定义域内连续可导,这有助于提高梯度下降优化算法的稳定性。
解决梯度消失问题:对于负值输入,ELU提供了负值输出,这有助于减轻梯度消失问题,尤其是在深度网络中。
输出均值接近0:ELU函数能够产生负值输出,这意味着其激活输出的均值更接近0,有助于数据的中心化,减少训练过程中的偏置偏移。
3.导数
ELU函数的导数如下:
图像如下:
意味着在正数区域,梯度为1,而在负数区域,梯度取决于α和x的指数值,这有助于保持负输入值的梯度更新。
ELU优势:
ELU通过在负数区域引入指数衰减,能够减少ReLU的“死亡”问题,同时保持负值的输出,有助于保持平均激活接近零,这有助于加快学习。
ELU劣势:
计算成本:由于ELU在负值时涉及指数运算,其计算成本高于Relu及其直接变体,尤其是在前向传播时。
import numpy as np # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt # 导入Matplotlib库,用于绘图def elu(x, alpha=0.25):"""ELU激活函数:param x: 输入值:param alpha: x小于0时的系数,默认为0.25:return: ELU激活值"""return np.where(x > 0, x, alpha * (np.exp(x) - 1)) # 当x>0时返回x,否则返回alpha * (np.exp(x) - 1)def elu_derivative(x, alpha=0.25):"""ELU激活函数的导数:param x: 输入值:param alpha: x小于0时的系数,默认为0.25:return: ELU导数值"""return np.where(x > 0, 1, alpha * (np.exp(x))) # 当x>0时返回1,否则返回alpha * np.exp(x)x = np.linspace(-5, 5, 100) # 创建一个从-5到5的等间隔数组,包含100个点
y_elu = elu(x) # 计算x的ELU激活值
y_elu_derivative = elu_derivative(x) # 计算x的ELU导数值plt.figure(figsize=(8, 6)) # 创建一个图形,设置大小为8x6英寸
plt.plot(x, y_elu) # 绘制x和ELU激活值的关系图
plt.plot(x, y_elu_derivative) # 绘制x和ELU导数值的关系图
plt.show() # 显示图形
八、极大似然估计与交叉熵损失函数
从以下3个方面对极大似然估计与交叉熵损失函数进行介绍
1.极大似然估计与交叉熵损失函数算法理论讲解
2.编程实例与步骤
8.1 极大似然估计与交叉熵损失函数算法理论
交叉熵损失函数是独立于的MSE(均方差损失函数)
交叉熵损失函数是另一种损失函数。MSE损失函数和交叉熵损失函数它们的应用场合是不一样的。
均方差损失函数主要应用在回归、拟合领域。(eg:有一些点用直线拟合它,或者用曲线去拟合)。
交叉熵损失函数主要应用在分类领域。
交叉熵损失函数主要应用在分类领域。
eg:对有猫和狗的图片进行分类,输入猫和狗的照片,然后特征提取,得到两类结果,可以先用softmax,得到两类的概率值将求解出来的概率,交给交叉熵计算损失?就可以进行模型优化了。
那分类问题指的是什么问题呢?
分类问题是机器学习中最常见的问题之一。分类问题的目标是根据给定的特征将数据分为不同的类别。
分类问题怎么去优化的呢?
主要是使用最小化交叉熵损失去优化
MSE解决分类问题的弊端?
在回归预测问题中,使用MSE作为损失函数,L2距离(欧式距离)能够很漂亮的体现出预测值与实际值的差距(距离)。
在分类问题中,网络输出的是属于某个类的概率。最后一层使用(softmax激活函数或者sigmoid激活函数)进行处理,二分类可以使用Sigmoid也可以使用Softmax,多分类使用Softmax,如果使用MSE,当与Sigmoid或Softmax搭配使用时,loss的偏导数的变化趋势和预测值及真实值之间的数值的变化趋势不一致。
当真实值y=1时,若预测值等于1,
等于0
当真实值y=1时,如预测值等于0,
等于0
也就是说,预测为错误时,依然没有梯度让网络可以学习。可以得出MSE对于分类问题无法有效地度量类别之间的差异,导致对于分类任务的优化不够敏感。
8.1.1 伯努利分布
伯努利分布是一种离散型概率分布,它描述的是一次伯努利试验中成功和失败的概率分布。在伯努利分布中,只有两种可能的结果,通过用0和1来表示,其中0表示失败,1表示成功。
伯努利分布的数学公式表达如下:
如果表示抛硬币,则正面向上的概率 p为当x=1时,p(1)=p^1*(1-p)^(1-1)=p,
反面向上的概率1-p为当x=0时,p(0)=p^0*(1-p)=1-p
8.1.2 二项分布
二项分布是描述了n次独立的伯努利试验中成功的次数的概率分布。在二项分布中,每次试验都是独立的,且成功和失败的概率保持不变。二项分布的概率质量函数公式如下:
其中n表示试验次数,k表示成功的次数,p表示单次实验成功的概率。
8.1.3 极大似然估计
极大似然估计,通俗理解来说,就是利用已知的样本结果信息,反推最具有可能(最大概率)导致这些样本结果出现的模型参数值。
假设现在进行伯努利试验10次,结果用随机变量xi表示,则x1,x2,...x10,满足独立同分布。其值为(1,0,1,0,0,0,1,0,0,0),每个样本出现的概率的乘积为:
对于上面的例子结果为:
极大似然估计的目标是不是要求最大的L(p)值中对应的p值?
举个例子(p=0.1 L(p)=0.0004782969
p=0.2 L(p)=0.0016777216
p=0.5 L(p)=0.0009765625 )
总结
本文结合理论与实践,详细解析Sigmoid、tanh、ReLU系列激活函数的数学特性与梯度行为,指出ReLU的死亡问题及改进方案如Leaky ReLU、PReLU和ELU的设计逻辑。通过可视化对比各函数曲线与导数,阐明零中心性、稀疏性对神经网络训练的影响。在损失函数部分,从极大似然估计出发,论证交叉熵在分类任务中的必要性,对比MSE的缺陷,强调概率输出与损失函数适配的重要性。代码实现覆盖函数绘制、导数计算及实际应用场景,提供完整的理论与实操参考。
相关文章:
深度学习激活函数与损失函数全解析:从Sigmoid到交叉熵的数学原理与实践应用
目录 前言一、sigmoid 及导数求导二、tanh 三、ReLU 四、Leaky Relu五、 Prelu六、Softmax七、ELU八、极大似然估计与交叉熵损失函数8.1 极大似然估计与交叉熵损失函数算法理论8.1.1 伯努利分布8.1.2 二项分布8.1.3 极大似然估计总结 前言 书接上文 PaddlePaddle线性回归详解…...
Kotlin中实现静态
实现“类似静态” class Util {fun action1() {}//使用companion object关键字会在类的内部创建一个伴生类,每个类都允许有一个伴生类//而action2作为伴生类中的方法,可以直接通过类名进行调用,实现类似“静态”的效果companion object {fun…...
Android 回显
//执行 private void playRunTime(String cmd) throws Exception { Process p Runtime.getRuntime().exec(cmd); InputStream is p.getInputStream(); BufferedReader reader new BufferedReader(new InputStreamReader(is)); String l…...
基于大模型的胃食管反流病全周期预测与诊疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、胃食管反流病概述 2.1 疾病定义与分类 2.2 流行病学特征 2.3 发病机制 三、大模型技术原理与应用基础 3.1 大模型简介 3.2 适用于胃食管反流病预测的大模型类型 3.3 数据收集与预处理 四、大模型在胃食…...
class文件(二)
字段表集合: 用于描述接口或类中声明的变量 包括类级变量以及实例级变量,不包括方法内部声明的局部变量 字段的修饰符包括: 作用域:public、private、protected修饰符 实例还是类变量:static 可变性:fin…...
Django 实现电影推荐系统:从搭建到功能完善(附源码)
前言:本文将详细介绍如何使用 Django 构建一个电影推荐系统,涵盖项目的搭建、数据库设计、视图函数编写、模板渲染以及用户认证等多个方面。🔗软件安装、环境准备 ❤ 【作者主页—📚阅读更多优质文章、获取更多优质源码】 目录 一…...
UML2.0中的14种图简介,并借助AI生成UML图
UML2.0中的14种图简介,并借助AI生成UML图 绘制流程结构图(Structure Diagrams)1. 类图(Class Diagram):2. 对象图(Object Diagram):3. 组件图(Component Diag…...
Jsoup、Selenium 和 Playwright 的含义、作用和区别
文章目录 一、Jsoup1. 含义2. 作用3. 核心特性4. 适用场景 二、Selenium1. 含义2. 作用3. 核心特性4. 适用场景 三、Playwright1. 含义2. 作用3. 核心特性4. 适用场景 四、Jsoup、Selenium 和 Playwright 的区别五、适用场景对比六、总结 Jsoup、Selenium 和 Playwright 都是用…...
服务器如何修复SSL证书错误?
修复服务器上的SSL证书错误需要根据具体错误类型逐步排查和解决。以下是常见的步骤和解决方案: --- ### **1. 确认错误类型** 首先检查浏览器或工具(如OpenSSL)报错的具体信息,常见错误包括: - **证书过期**…...
AD9253链路训练
传统方式 参考Xilinx官方文档xapp524。对于AD9253器件 - 125M采样率 - DDR模式,ADC器件的DCO采样时钟(500M Hz)和FCO帧时钟是中心对齐的,适合直接采样。但是DCO时钟不能直接被FPGA内部逻辑使用,需要经过BUFIO和BUFR缓冲后,得到s_b…...
VAE-LSTM异常检测模型复刻报告
VAE-LSTM异常检测模型复刻报告 复刻背景 本报告记录了我复刻VAE-LSTM异常检测模型的完整过程。原论文提出了一种结合变分自编码器(VAE)和长短期记忆网络(LSTM)的异常检测方法,用于时间序列数据。 环境配置 复刻过程中使用的环境配置如下: Python 3.…...
有哪些信誉良好的脂多糖供应商推荐?
一般描述 Sigma-Aldrich的脂多糖 (LPS) 是糖脂,由连接单个或多个脂肪酸的碳水化合物单元组合而成,存在于革兰氏阴性菌细胞壁中。LPS是外膜的重要组成部分,结构由脂质A、葡萄糖胺基磷脂、短核寡糖和O-抗原(远端多糖)组…...
初识分布式事务原理
事务是指符合ACID特性的操作就是事务,在同一个数据库中,如果要分别对表A和表B进行插入和删除操作,如果其中一个操作执行失败,可以对当前数据库进行回滚,使其回滚到执行操作前的状态,但是现有的系统架构都是…...
文件上传过程中出现EOFException的解决方案
文件上传过程中出现EOFException的解决方案 项目场景: 项目是一个考试测评系统,包含学生答题截图上传功能。学生通过前端界面提交答题截图,后端服务接收并处理这些图片文件,存储到MinIO对象存储中。 问题描述 前端调用’提交答…...
智能文档解析系统架构师角色定义
(根据专业写作类任务要求,以系统架构师角色定义范式进行结构化呈现) 智能文档解析系统架构师角色定义 核心技能模块 1. 多模态语义解析引擎 支持中英双语对齐的异构数据解码遵循ISO/IEC 30140标准的JSON语法校验体系 ├─ 智能字段补全机…...
翻倍缠论系统+拐点多空雷达,组合指标的使用操盘技术
如上图,单独从副图指标信号来说,在标记①的位置,开始出现副图指标【拐点多空雷达】转多的买点,红柱开始出现就是跟进做多的第一买点。 在标记②的位置,副图指标出现红柱持续,而黑色的柱线开始出现…...
Linux脏页相关参数
参数 以下是Linux内核中与脏页(Dirty Page)相关的各个参数及其含义的详细说明: 1. vm.dirty_background_bytes 含义:系统内存中脏页数量的绝对字节阈值(单位为字节),当脏页达到此值时&#x…...
C++20 module下的LVGL模拟器
ARM GCC:14.2 Toolchain:MSVC 前篇:使用SDL2搭建简易LVGL模拟器_lvgl sdl-CSDN博客 故事 从前 我所用的单片机工程本身是为了电赛设计的,由于电赛的特性,需要使用同一个实验平台通过不同外设的“排列组合”来实现不…...
Go全栈_Golang、Gin实战、Gorm实战、Go_Socket、Redis、Elasticsearch、微服务、K8s、RabbitMQ全家桶
Go全栈全家桶包含: 1、【零基础入门】Go语言核心编程零基础入门实战,B站学习地址分享: 【2025年新版】Go语言教程 2、GolangGinGorm仿小米商城企业级项目实战 3、Golang仿小米商城高并发微服务实战 4、Golang RabbitMQ高并发秒杀、抢购、预约…...
STM32提高篇: 蓝牙通讯
STM32提高篇: 蓝牙通讯 一.蓝牙通讯介绍1.蓝牙技术类型 二.蓝牙协议栈1.蓝牙芯片架构2.BLE低功耗蓝牙协议栈框架 三.ESP32-C3中的蓝牙功能1.广播2.扫描3.通讯 四.发送和接收 一.蓝牙通讯介绍 蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技…...
Linux系统编程---精灵进程与守护进程
1、前言 精灵进程又称守护进程、后台进程,在英文中称为 daemon 进程。精灵进程是运行在一个相对干净的环境、不受终端影响、常驻内存的进程,和神话中的精灵一样,拥有不死不灭的特性,长期稳定提供某种功能或服务。 在Linux系统中&a…...
《让机器人读懂你的心:情感分析技术融合奥秘》
机器人早已不再局限于执行简单机械的任务,人们期望它们能像人类伙伴一样,理解我们的喜怒哀乐,实现更自然、温暖的互动。情感分析技术,正是赋予机器人这种“理解人类情绪”能力的关键钥匙,它的融入将彻底革新机器人与人…...
科技项目必须进行验收测试吗?项目验收测试服务机构有哪些?
在现代科技迅猛发展的背景下,各类科技项目层出不穷,从智能硬件到软件系统,乃至工业自动化解决方案,项目的质量直接关系到企业的信誉、用户体验和市场竞争力。那么科技项目必须进行验收测试吗? 简短且明确的回答是:必…...
7.7 Axios+Redux+JWT全链路实战:打通前后端API通信最佳实践
Axios+Redux+JWT全链路实战:打通前后端API通信最佳实践 连接前端与后端 API:全链路数据交互设计指南 关键词:前后端通信架构设计、RESTful API 开发、Axios 请求拦截、Redux 状态管理、JWT 认证集成 1. 前后端通信架构设计原则 我们采用分层架构实现前后端解耦,通过 RES…...
零基础入门 Verilog VHDL:在线仿真与 FPGA 实战全流程指南
摘要 本文面向零基础读者,全面详解 Verilog 与 VHDL 两大主流硬件描述语言(HDL)的核心概念、典型用法及开发流程。文章在浅显易懂的语言下,配合多组可在线验证的示例代码、PlantUML 电路结构图,让你在 EDA Playground 上动手体验数字电路设计与仿真,并深入了解从 HDL 编写…...
[蓝桥杯 2025 省 Python B] 最多次数
import sysdef max_times() -> int:s sys.stdin.readline().strip()checked {l,q,b} # set(),不存在键值对,识别为set()n len(s)time 0i 0while i < n - 2:sec s[i:i3]if set(sec) checked:i 3time 1else:i 1sys.…...
HTTP相关
目录 一、HTTP状态码 1XX信息性状态码 2XX成功状态码 3XX重定向状态码 4XX客户端错误状态码 5XX服务器错误状态码 二、GET/POST/PUT/DELETE请求 2.1GET 2.2POST 2.3PUT 2.4DELETE 2.5RESTful API例子 三、RESTful API 3.1什么是RESTful API 3.2RESTful API中的关…...
使用rclone迁移minio文件
文章目录 一、rclone简介1、工具说明2、核心特点2.1、跨平台支持2.2、多存储支持2.3、加密与安全2.4、增量同步与断点续传2.5、高性能 3、适用场景3.1、云存储迁移3.2、备份与同步3.3、跨云协作3.4、数据加密归档 二、常用命令1、基础操作2、文件传输3、文件管理4、高级功能5、…...
基于Java与MAVLink协议的多无人机(Cube飞控)集群控制与调度方案问题
基于Java与MAVLink协议的多无人机(Cube飞控)集群控制与调度方案问题 背景需求: 我们目前有一个基于Cube飞控的无人机系统,需实现以下核心功能: 多机通信:通过MAVLink协议同时连接并控制多架无人机&#x…...
Super-Vlan和MUX-Vlan的原理、配置、区别
Super-Vlan 原理 Super-Vlan也叫Aggregate-Vlan。 一般的三层交换机中,通常是采用一个VLAN对应一个vlanif接口的方式实现广播域之间的互通,这在某些情况下导致了IP地址的浪费。因为一个VLAN对应的子网中,子网号、子网定向广播地址、子网缺…...
数据一致性问题剖析与实践(二)——单机事务的一致性问题
一、前言 我们一般讲到单机事务,离不开的就是数据库,其最重要的定义就是,要么全部成功执行,要么全部不执行,保证安全的状态转化。 之前我们讨论了几种场景的一致性问题 冗余数据存储中的一致性问题分布式共识中的一…...
VUE Element-ui Message 消息提示组件自定义封装
为了让message 信息提示的更加方便快捷,减少不同地方的调用,避免代码的重复,特意再官方message 组件的基础上二次封装,使代码更加的优雅和高效。 实现效果: 代码组件: 封装成 message.js 文件,…...
HSTL详解
一、HSTL的基本定义 HSTL(High-Speed Transceiver Logic) 是一种针对高速数字电路设计的差分信号接口标准,主要用于高带宽、低功耗场景(如FPGA、ASIC、高速存储器接口)。其核心特性包括: 差分信号传输&…...
【PCB工艺】运放电路中的负反馈机制
通过运算方法器电路设计详细解释负反馈机制(Negative Feedback) 负反馈 是控制系统、电子电路、神经系统等多个领域中非常核心的概念。特别在运算放大器(Op-Amp)电路中,负反馈是实现精确控制和高稳定性的关键机制。 …...
玩转Docker | 使用Docker部署Neko自托管浏览器
玩转Docker | 使用Docker部署Neko自托管浏览器 前言一、Neko介绍简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Neko服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问Neko服务访问Neko首页登录Neko五、基本使用设置键…...
聊聊自动化用例的维护
自动化测试中的农药悖论:为何长期维护至关重要 自动化测试常被视为"一次编写,永久有效"的解决方案,但随着时间的推移,即使设计最精良的测试套件也会逐渐失效。这种现象被称为农药悖论(Pesticide Paradox&am…...
OpenCV 图形API(60)颜色空间转换-----将图像从 YUV 色彩空间转换为 RGB 色彩空间函数YUV2RGB()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 YUV 色彩空间转换为 RGB。 该函数将输入图像从 YUV 色彩空间转换为 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图像必须是 8…...
Docker配置带证书的远程访问监听
一、生成证书和密钥 1、准备证书目录和生成CA证书 # 创建证书目录 mkdir -p /etc/docker/tls cd /etc/docker/tls # 生成CA密钥和证书 openssl req -x509 -newkey rsa:4096 -keyout ca-key.pem \ -out ca-cert.pem -days 365 -nodes -subj "/CNDocker CA" 2、为…...
监督学习(Supervised Learning)与无监督学习(Unsupervised Learning)
监督学习与无监督学习是机器学习的两大核心范式,主要区别在于数据是否包含明确的“标签”(目标输出)。 1. 监督学习(Supervised Learning) 定义: 数据形式:输入数据&…...
批量将多个 Excel 表格中的某张图片替换为新的图片
对于 Excel 文档,相信大家都不陌生,我们可以在 Excel 单元格中插入各种各样的图片,我们也可以将 Excel 表格中的图片替换为新的图片,常规的做法我们都是通过 Office 来进行单个处理的,但是如果我们遇到批量处理的场景&…...
数据一致性问题剖析与实践(三)——分布式事务的一致性问题
一、前言 之前我们讨论了几种场景的一致性问题 冗余数据存储中的一致性问题分布式共识中的一致性问题单机事务中的一致性问题 本文将围绕分布式事务中的一致性问题展开讨论。 二、分布式环境的最大难题 相对于单机环境,分布式环境中,一致性问题最大…...
分布式理论和事务
微服务和分布式 微服务 是一种软件架构风格,它将应用程序拆分成一系列小型、独立的服务,每个服务专注于单一功能,彼此通过轻量级通信机制(如 API)进行交互。微服务通常是松耦合的,可以独立开发、部署和扩展…...
基于Flask与Ngrok实现Pycharm本地项目公网访问:从零部署
目录 概要 1. 环境与前置条件 2. 安装与配置 Flask 2.1 创建虚拟环境 2.2 安装 Flask 3. 安装与配置 Ngrok 3.1 下载 Ngrok 3.2 注册并获取 Authtoken 4. 在 PyCharm 中创建 Flask 项目 5. 运行本地 Flask 服务 6. 启动 Ngrok 隧道并获取公网地址 7. 完整示例代码汇…...
flutter和vue3项目利用webview_flutter插件通信
近来需要实现一个功能: flutter项目的会员中心页面跳转到vue3项目的活动页,点击该活动页面的“签到”按钮后到flutter项目的积分中心页面进行签到,签到成功后手动返回上一个页面即vue3活动页面的按钮状态更新问题(需更新为“已签到”)。 实现方法:通过webview_flutter …...
sql 根据时间范围获取每日,每月,年月的模版数据
1:获取每日模版数据(参数也支持跨年) SELECT a.selected_date cdate FROM(SELECT adddate(1970-01-01,t4.i * 10000 t3.i * 1000 t2.i * 100 t1.i * 10 t0.i) selected_dateFROM( SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELEC…...
亚信安全与联通数科达成战略合作,成立联信事业部
4月22日,亚信安全与联通数字科技有限公司(以下简称“联通数科”)正式签署战略合作协议,双方宣布将联合成立“联信事业部”,仪式上,联通数科董事长孙江山与亚信安全董事长何政为“联信事业部”成立揭牌&…...
第五节:进阶特性高频题-Teleport与Suspense组件应用
Teleport:解决模态框/弹窗的DOM层级问题(如挂载到body) Suspense:处理异步组件加载状态(fallback内容展示) 深入解析 Vue3 的 Teleport 与 Suspense 组件 一、Teleport 组件:突破 DOM 层级限制…...
如何使用 uv 构建 Python 包并本地安装
本文将逐步指导你创建一个简单的 Python 包,并将其本地安装到机器或云环境中。完成本教程后,你将拥有一个可复用的 Python 库,可直接通过 pip 安装或在项目中导入使用。 步骤详解 Step 0: 选择构建工具 - 使用 uv 推荐理由:uv 是…...
集结号海螺捕鱼组件搭建教程与源码结构详解(第一篇)
本系列将基于 C Unity3D Java MySQL 构建的集结号海螺捕鱼平台,全面拆解组件架构、服务部署、客户端接入、数据库结构等内容,适合技术团队二次开发及运维部署。 一、整体架构说明 集结号海螺捕鱼平台采用三层结构: 客户端(Uni…...
RabbitMQ复习笔记
文章目录 MQ 概述同步调用拓展性差的问题性能下降的问题级联失败问题 异步调用举例 技术选型 RabbitMQRabbitMQ 安装RabbitMQ 收发消息交换机队列绑定关系模拟发送消息 RabbitMQ 数据隔离用户管理virtual host 授权 SpringAMOPSpringAMOP 快速入门消息发送消息接收 Work Queues…...