深度学习—BP算法梯度下降及优化方法Day37
梯度下降
1.公式
w i j n e w = w i j o l d − α ∂ E ∂ w i j w_{ij}^{new}= w_{ij}^{old} - \alpha \frac{\partial E}{\partial w_{ij}} wijnew=wijold−α∂wij∂E
α为学习率
当α过小时,训练时间过久增加算力成本,α过大则容易造成越过最优解导致震荡。
2.梯度下降过程
1.初始化参数:权重:W,偏置:b
2.求梯度:利用损失函数求出权重W的导数。
3.参数更新:按照梯度下降公式求出新的W。
4.循环迭代:按照设定的条件或次数循环更新W。
3.常见梯度下降方法
3.1批量梯度下降
Batch Gradient Descent BGD
-
特点:
- 每次更新参数时,使用整个训练集来计算梯度。
-
优点:
- 收敛稳定,能准确地沿着损失函数的真实梯度方向下降。
- 适用于小型数据集。
-
缺点:
- 对于大型数据集,计算量巨大,更新速度慢。
- 需要大量内存来存储整个数据集。
-
公式:
θ : = θ − α 1 m ∑ i = 1 m ∇ θ L ( θ ; x ( i ) , y ( i ) ) \theta := \theta - \alpha \frac{1}{m} \sum_{i=1}^{m} \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) θ:=θ−αm1i=1∑m∇θL(θ;x(i),y(i))
其中, m m m 是训练集样本总数,$x^{(i)}, y^{(i)} $是第 i i i 个样本及其标签。
3.2随机梯度下降
Stochastic Gradient Descent, SGD
-
特点:
- 每次更新参数时,仅使用一个样本来计算梯度。
-
优点:
- 更新频率高,计算快,适合大规模数据集。
- 能够跳出局部最小值,有助于找到全局最优解。
-
缺点:
- 收敛不稳定,容易震荡,因为每个样本的梯度可能都不完全代表整体方向。
- 需要较小的学习率来缓解震荡。
-
公式:
θ : = θ − α ∇ θ L ( θ ; x ( i ) , y ( i ) ) \theta := \theta - \alpha \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) θ:=θ−α∇θL(θ;x(i),y(i))
3.3小批量梯度下降
Mini-batch Gradient Descent MGBD
-
特点:
- 每次更新参数时,使用一小部分训练集(小批量)来计算梯度。
-
优点:
- 在计算效率和收敛稳定性之间取得平衡。
- 能够利用向量化加速计算,适合现代硬件(如GPU)。
-
缺点:
- 选择适当的批量大小比较困难;批量太小则接近SGD,批量太大则接近批量梯度下降。
- 通常会根据硬件算力设置为32\64\128\256等2的次方。
-
公式:
θ : = θ − α 1 b ∑ i = 1 b ∇ θ L ( θ ; x ( i ) , y ( i ) ) \theta := \theta - \alpha \frac{1}{b} \sum_{i=1}^{b} \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) θ:=θ−αb1i=1∑b∇θL(θ;x(i),y(i))
其中, b b b 是小批量的样本数量,也就是 b a t c h _ s i z e batch\_size batch_size。
其中, x ( i ) , y ( i ) x^{(i)}, y^{(i)} x(i),y(i) 是当前随机抽取的样本及其标签。
4.存在问题
-
收敛速度慢:BGD和MBGD使用固定学习率,太大会导致震荡,太小又收敛缓慢。
-
局部最小值和鞍点问题:SGD在遇到局部最小值或鞍点时容易停滞,导致模型难以达到全局最优。
-
训练不稳定:SGD中的噪声容易导致训练过程中不稳定,使得训练陷入震荡或不收敛。
5.优化方法
5.1指数加权平均数
其中:
- St 表示指数加权平均值(EMA);
- Yt 表示 t 时刻的值;
- β \beta β 是平滑系数,取值范围为 0 ≤ β < 1 0\leq \beta < 1 0≤β<1。 β \beta β 越接近 1 1 1,表示对历史数据依赖性越高;越接近 0 0 0 则越依赖当前数据。该值越大平均数越平缓
import numpy as np
import matplotlib.pyplot as pltdef test01():np.random.seed(666)y = np.random.randint(5,40,30)print(y)x = np.arange(30)plt.plot(x,y,color='b')plt.scatter(x,y,color='r')plt.show()def test02(beta = 0.9):np.random.seed(666)y = np.random.randint(5,40,30)print(y)x = np.arange(30)y_e = []for i in range(30):if i == 0:y_e.append(y[0])else:st = beta*y_e[-1]+(1-beta)*y[i]y_e.append(st)plt.plot(x,np.array(y_e),color='b')plt.scatter(x,y,color='r')plt.show()if __name__ == '__main__':test01()test02()
5.2Momentum
Momentum 的基本思想
在传统的梯度下降法中,参数的更新仅依赖于当前的梯度方向。Momentum 方法通过引入一个累积的动量来加速参数的更新。具体来说,Momentum 方法在参数更新时不仅考虑当前的梯度方向,还考虑了过去梯度的方向。
- 惯性效应: 该方法加入前面梯度的累积,这种惯性使得算法沿着当前的方向继续更新。如遇到鞍点,也不会因梯度逼近零而停滞。
- 减少震荡: 该方法平滑了梯度更新,减少在鞍点附近的震荡,帮助优化过程稳定向前推进。
- 加速收敛: 该方法在优化过程中持续沿着某个方向前进,能够更快地穿越鞍点区域,避免在鞍点附近长时间停留。
梯度计算公式:
D t = β ∗ S t − 1 + ( 1 − β ) ∗ D t Dt = β * S_{t-1} + (1- β) * Dt Dt=β∗St−1+(1−β)∗Dt
- S t − 1 S_{t-1} St−1 表示历史梯度移动加权平均值
- Dt 表示当前时刻的梯度值
- β 为权重系数
Momentum 算法是对梯度值的平滑调整,但是并没有对梯度下降中的学习率进行优化。
import torch# 1.创建一个神经网络:继承官方的nn.Module
class mynet(torch.nn.Module):# 2.定义网络结构def __init__(self, input_size, output_size):# 3.初始化父类:python语法要求调用super方法生成父类的功能让子类对象去继承super(mynet, self).__init__()# 4.定义网络结构self.hide1 = torch.nn.Sequential(torch.nn.Linear(input_size, 3), torch.nn.Sigmoid())self.hide2 = torch.nn.Sequential(torch.nn.Linear(3, 2), torch.nn.Sigmoid())self.hide3 = torch.nn.Sequential(torch.nn.Linear(2, 12), torch.nn.Sigmoid())self.out = torch.nn.Sequential(torch.nn.Linear(12, output_size), torch.nn.Sigmoid())def forward(self, input):# input.shape[1]x = self.hide1(input)x = self.hide2(x)x = self.hide3(x)pred = self.out(x)return preddef train():# 数据集input = torch.tensor([[0.5, 0.1],[0.05, 0.180],[0.05, 0.310]])target = torch.tensor([[1, 2],[0, 3],[1, 123]], dtype=torch.float32)# 5.创建网络net = mynet(2, 2)# 6.定义损失函数loss_func = torch.nn.MSELoss()# 7.定义优化器optimizer = torch.optim.SGD(net.parameters(), lr=0.1,momentum=0.6)# 8.训练for epoch in range(100):# 9.前向传播y_pred = net(input)# 10.计算损失loss = loss_func(y_pred, target)# 11.梯度清零optimizer.zero_grad()# 12.反向传播(计算每一层的w的梯度值)loss.backward()# print(net.hide1[0].weight.data)# 13.梯度更新optimizer.step() # w = w -lr*当前的移动指数加权平均(s = momentum*s + (1-momentum)*w.gradprint(loss)if __name__ == '__main__':train()
5.3AdaGrad
AdaGrad(Adaptive Gradient Algorithm)为每个参数引入独立的学习率,它根据历史梯度的平方和来调整这些学习率,这样就使得参数具有较大的历史梯度的学习率减小,而参数具有较小的历史梯度的学习率保持较大,从而实现更有效的学习。AdaGrad避免了统一学习率的不足,更多用于处理稀疏数据和梯度变化较大的问题。
AdaGrad流程:
-
初始化学习率 α、初始化参数 θ、小常数 σ = 1e-6
-
初始化梯度累积变量 s = 0
-
从训练集中采样 m 个样本的小批量,计算梯度 g
-
累积平方梯度 s = s + g ⊙ g,⊙ 表示各个分量相乘
-
学习率 α 的计算公式如下:
-
参数更新公式如下:
其中:
-
α \alpha α 是全局的初始学习率。
-
$ \sigma$ 是一个非常小的常数,用于避免除零操作(通常取$ 10^{-8}$)。
-
$ \frac{\alpha}{\sqrt{s }+\sigma} $ 是自适应调整后的学习率。
import torch# 1.创建一个神经网络:继承官方的nn.Module
class mynet(torch.nn.Module):# 2.定义网络结构def __init__(self, input_size, output_size):# 3.初始化父类:python语法要求调用super方法生成父类的功能让子类对象去继承super(mynet, self).__init__()# 4.定义网络结构self.hide1 = torch.nn.Sequential(torch.nn.Linear(input_size, 3), torch.nn.Sigmoid())self.hide2 = torch.nn.Sequential(torch.nn.Linear(3, 2), torch.nn.Sigmoid())self.hide3 = torch.nn.Sequential(torch.nn.Linear(2, 12), torch.nn.Sigmoid())self.out = torch.nn.Sequential(torch.nn.Linear(12, output_size), torch.nn.Sigmoid())def forward(self, input):# input.shape[1]x = self.hide1(input)x = self.hide2(x)x = self.hide3(x)pred = self.out(x)return preddef train():# 数据集input = torch.tensor([[0.5, 0.1],[0.05, 0.180],[0.05, 0.310]])target = torch.tensor([[1, 2],[0, 3],[1, 123]], dtype=torch.float32)# 5.创建网络net = mynet(2, 2)# 6.定义损失函数loss_func = torch.nn.MSELoss()# 7.定义优化器optimizer = torch.optim.Adagrad(net.parameters(), lr=0.1)# 8.训练for epoch in range(100):# 9.前向传播y_pred = net(input)# 10.计算损失loss = loss_func(y_pred, target)# 11.梯度清零optimizer.zero_grad()# 12.反向传播(计算每一层的w的梯度值)loss.backward()# print(net.hide1[0].weight.data)# 13.梯度更新optimizer.step() # w = w -lr*当前的移动指数加权平均(s = momentum*s + (1-momentum)*w.gradprint(loss)if __name__ == '__main__':train()
5.4RMSProp
RMSProp(Root Mean Square Propagation)在时间步中,不是简单地累积所有梯度平方和,而是使用指数加权平均来逐步衰减过时的梯度信息。这种方法专门用于解决AdaGrad在训练过程中学习率过度衰减的问题。
RMSProp过程
-
初始化学习率 α、初始化参数 θ、小常数 σ = 1e-8( 用于防止除零操作(通常取 1 0 − 8 10^{-8} 10−8))。
-
初始化参数 θ
-
初始化梯度累计变量 s=0
-
从训练集中采样 m 个样本的小批量,计算梯度 g
-
使用指数移动平均累积历史梯度,公式如下:
-
学习率 α 的计算公式如下:
-
参数更新公式如下:
优点
-
适应性强:RMSProp自适应调整每个参数的学习率,对于梯度变化较大的情况非常有效,使得优化过程更加平稳。
-
适合非稀疏数据:相比于AdaGrad,RMSProp更加适合处理非稀疏数据,因为它不会让学习率减小到几乎为零。
-
解决过度衰减问题:通过引入指数加权平均,RMSProp避免了AdaGrad中学习率过快衰减的问题,保持了学习率的稳定性
缺点
依赖于超参数的选择:RMSProp的效果对衰减率 $ \beta$ 和学习率 $ \alpha$ 的选择比较敏感,需要一些调参工作。
需要注意的是:AdaGrad 和 RMSProp 都是对于不同的参数分量使用不同的学习率,如果某个参数分量的梯度值较大,则对应的学习率就会较小,如果某个参数分量的梯度较小,则对应的学习率就会较大一些。
import torch# 1.创建一个神经网络:继承官方的nn.Module
class mynet(torch.nn.Module):# 2.定义网络结构def __init__(self, input_size, output_size):# 3.初始化父类:python语法要求调用super方法生成父类的功能让子类对象去继承super(mynet, self).__init__()# 4.定义网络结构self.hide1 = torch.nn.Sequential(torch.nn.Linear(input_size, 3), torch.nn.Sigmoid())self.hide2 = torch.nn.Sequential(torch.nn.Linear(3, 2), torch.nn.Sigmoid())self.hide3 = torch.nn.Sequential(torch.nn.Linear(2, 12), torch.nn.Sigmoid())self.out = torch.nn.Sequential(torch.nn.Linear(12, output_size), torch.nn.Sigmoid())def forward(self, input):# input.shape[1]x = self.hide1(input)x = self.hide2(x)x = self.hide3(x)pred = self.out(x)return preddef train():# 数据集input = torch.tensor([[0.5, 0.1],[0.05, 0.180],[0.05, 0.310]])target = torch.tensor([[1, 2],[0, 3],[1, 123]], dtype=torch.float32)# 5.创建网络net = mynet(2, 2)# 6.定义损失函数loss_func = torch.nn.MSELoss()# 7.定义优化器optimizer = torch.optim.RMSprop(net.parameters(), lr=0.01,momentum=0.8)# 8.训练for epoch in range(100):# 9.前向传播y_pred = net(input)# 10.计算损失loss = loss_func(y_pred, target)# 11.梯度清零optimizer.zero_grad()# 12.反向传播(计算每一层的w的梯度值)loss.backward()# print(net.hide1[0].weight.data)# 13.梯度更新optimizer.step() # w = w -lr*当前的移动指数加权平均(s = momentum*s + (1-momentum)*w.gradprint(loss)if __name__ == '__main__':train()
5.5Adam
Adam(Adaptive Moment Estimation)算法将动量法和RMSProp的优点结合在一起:
- 动量法:通过一阶动量(即梯度的指数加权平均)来加速收敛,尤其是在有噪声或梯度稀疏的情况下。
- RMSProp:通过二阶动量(即梯度平方的指数加权平均)来调整学习率,使得每个参数的学习率适应其梯度的变化。
- Momentum 使用指数加权平均计算当前的梯度值、AdaGrad、RMSProp 使用自适应的学习率,Adam 结合了 Momentum、RMSProp 的优点,使用:移动加权平均的梯度和移动加权平均的学习率。使得能够自适应学习率的同时,也能够使用 Momentum 的优点。
优点
-
高效稳健:Adam结合了动量法和RMSProp的优势,在处理非静态、稀疏梯度和噪声数据时表现出色,能够快速稳定地收敛。
-
自适应学习率:Adam通过一阶和二阶动量的估计,自适应调整每个参数的学习率,避免了全局学习率设定不合适的问题。
-
适用大多数问题:Adam几乎可以在不调整超参数的情况下应用于各种深度学习模型,表现良好。
缺点
- 超参数敏感:尽管Adam通常能很好地工作,但它对初始超参数(如 $ \beta_1 、 、 、 \beta_2$ 和 η \eta η)仍然较为敏感,有时需要仔细调参。
- 过拟合风险:由于Adam会在初始阶段快速收敛,可能导致模型陷入局部最优甚至过拟合。因此,有时会结合其他优化算法(如SGD)使用。
import torch# 1.创建一个神经网络:继承官方的nn.Module
class mynet(torch.nn.Module):# 2.定义网络结构def __init__(self, input_size, output_size):# 3.初始化父类:python语法要求调用super方法生成父类的功能让子类对象去继承super(mynet, self).__init__()# 4.定义网络结构self.hide1 = torch.nn.Sequential(torch.nn.Linear(input_size, 3), torch.nn.Sigmoid())self.hide2 = torch.nn.Sequential(torch.nn.Linear(3, 2), torch.nn.Sigmoid())self.hide3 = torch.nn.Sequential(torch.nn.Linear(2, 12), torch.nn.Sigmoid())self.out = torch.nn.Sequential(torch.nn.Linear(12, output_size), torch.nn.Sigmoid())def forward(self, input):# input.shape[1]x = self.hide1(input)x = self.hide2(x)x = self.hide3(x)pred = self.out(x)return preddef train():# 数据集input = torch.tensor([[0.5, 0.1],[0.05, 0.180],[0.05, 0.310]])target = torch.tensor([[1, 2],[0, 3],[1, 123]], dtype=torch.float32)# 5.创建网络net = mynet(2, 2)# 6.定义损失函数loss_func = torch.nn.MSELoss()# 7.定义优化器optimizer = torch.optim.Adam(net.parameters(), lr=0.1)# 8.训练for epoch in range(100):# 9.前向传播y_pred = net(input)# 10.计算损失loss = loss_func(y_pred, target)# 11.梯度清零optimizer.zero_grad()# 12.反向传播(计算每一层的w的梯度值)loss.backward()# print(net.hide1[0].weight.data)# 13.梯度更新optimizer.step() # w = w -lr*当前的移动指数加权平均(s = momentum*s + (1-momentum)*w.gradprint(loss)if __name__ == '__main__':train()
相关文章:

深度学习—BP算法梯度下降及优化方法Day37
梯度下降 1.公式 w i j n e w w i j o l d − α ∂ E ∂ w i j w_{ij}^{new} w_{ij}^{old} - \alpha \frac{\partial E}{\partial w_{ij}} wijnewwijold−α∂wij∂E α为学习率 当α过小时,训练时间过久增加算力成本,α过大则容易造成越过最…...
elasticsearch8.16 docker-compose 多机器集群安装
在网上找了一圈, 发现要么就是单机版的部署了多个节点, 很少有多台机器部署集群的, 有些就拿官网的例子写一写, 没有实战经验, 下面分享一个教程, 实实在在的多台机器, 每台机器部署2个节点的例子 先上.env , docker-compose.yml文件, 这个文件是核心, 里面掺杂太多坑, 已经帮你…...

Flink--API 之 Source 使用解析
目录 一、Flink Data Sources 分类概览 (一)预定义 Source (二)自定义 Source 二、代码实战演示 (一)预定义 Source 示例 基于本地集合 基于本地文件 基于网络套接字(socketTextStream&…...
uniapp在小程序连接webScoket实现余额支付
webScoket文档:uni.connectSocket(OBJECT) | uni-app官网 /plugins/event.js const Dep function() {this.Evens Object.create(null); } class Event {constructor({dep new Dep()} {}) {if (dep.constructor Object && Object.keys(dep).length 0…...

Spring Boot【三】
自动注入 xml中可以在bean元素中通过autowire属性来设置自动注入的方式: <bean id"" class"" autowire"byType|byName|constructor|default" /> byName:按照名称进行注入 byType:按类型进行注入 constr…...
R 因子
R 因子 引言 在金融领域,风险管理和投资策略的优化一直是核心议题。传统的风险度量工具,如波动率、Beta系数等,虽然在一定程度上能够帮助投资者理解市场的波动和资产的相对风险,但它们往往无法全面捕捉到市场动态的复杂性。因此…...

【博主推荐】C# Winform 拼图小游戏源码详解(附源码)
文章目录 前言摘要1.设计来源拼图小游戏讲解1.1 拼图主界面设计1.2 一般难度拼图效果1.3 普通难度拼图效果1.4 困难难度拼图效果1.5 地域难度拼图效果1.6 内置五种拼图效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载结束语 前言 在数字浪潮汹涌澎湃的时代,程序开…...

深入解析 MySQL 启动方式:`systemctl` 与 `mysqld` 的对比与应用
目录 前言1. 使用 systemctl 启动 MySQL1.1 什么是 systemctl1.2 systemctl 启动 MySQL 的方法1.3 应用场景1.4 优缺点优点缺点 2. 使用 mysqld 命令直接启动 MySQL2.1 什么是 mysqld2.2 mysqld 启动 MySQL 的方法2.3 应用场景2.4 优缺点优点缺点 3. 对比分析结语 前言 MySQL …...

【python】windows pip 安装 module 提示 Microsoft Visual C++ 14.0 is required 处理方法
参考链接:https://blog.csdn.net/qzzzxiaosheng/article/details/12511900 1.问题引入 在使用pip 安装一些module经常会出现报错: Microsoft Visual C 14.0 is required. Get it with “Microsoft Visual C Build Tools很明显这是缺少C的编译的相关依…...

python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)
文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…...
go sync.WaitGroup
1、数据结构 type WaitGroup struct {noCopy noCopystate atomic.Uint64 // high 32 bits are counter, low 32 bits are waiter count.sema uint32 } 计数器:原子变量,高32位用于为协程计数,低32位为等待计数(被Wait阻塞等待&a…...
Libevent库-http通信不同请求方式的处理
做项目的时候用到了http通信,同事用libevent库写的,特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…...

关于node全栈项目打包发布linux项目问题总集
1.用pm2部署nest 说明:如果一开始将nest直接打包放到linux服务器上用pm2执行则会报错,这是因为tsconfig.build.tsbuildinfo文件的路径以及相关依赖问题。 报错会为:什么东西找不到.... 所以建议以下为步骤一步一步配置 将整个nest添加压缩包直…...
常见的上、下采样方法
常见的上采样方法 反卷积(Deconvolution)或转置卷积(Transpose Convolution):通过学习可逆卷积核来进行上采样,增加特征图的尺寸。插值(Interpolation)ÿ…...
如何解决 java.rmi.NotBoundException: RMI 中没有绑定的对象问题?亲测有效的解决方法!
java.rmi.NotBoundException 是 Java RMI(Remote Method Invocation)中的一个常见异常,它通常出现在远程方法调用过程中,表示在 RMI 注册表中找不到指定的绑定对象。换句话说,当客户端尝试查找一个远程对象(…...

设计模式:14、抽象工厂模式(配套)
目录 0、定义 1、抽象工厂模式的四种角色 2、抽象工厂的UML类图 3、示例代码 0、定义 提供一个创建一系列或相互依赖对象的接口,而无须指定它们具体的类。 1、抽象工厂模式的四种角色 抽象产品(Product):一个抽象类或接口&a…...

Linux环境基础开发工具使用
目录 1. Linux软件包管理器yum 1.1 什么是软件包 1.2 Linux软件生态 1.3 关于rzsz 1.4 注意事项 1.5 查看软件包 2. Linux编辑器-vim使用 2.1 vim的基本概念 2.2 vim的基本操作 2.3 简单vim配置 3. 编译器gcc/g 3.1 背景知识 3.2 gcc编译选项 3.2.1 预处理…...
AI生成的一个.netcore 经典后端架构
下面是一个完整的 .NET Core 后端项目示例,使用 Dapper 作为轻量级 ORM 访问 Oracle 数据库,并实现高性能架构。我们将实现学生表、课程表、成绩表和班级表的基本增删改查功能,以及查询某个班级学生成绩的功能,并使用自定义缓存来…...
深度学习-48-AI应用实战之基于face_recognition的人脸识别
文章目录 1 人脸识别1.1 识别原理1.2 应用场景2 python实现人脸识别2.1 windows安装face_recognition2.2 安装问题及解决3 使用示例3.1 人脸区域检测3.2 对齐与编码3.3 人脸匹配3.4 信息录入4 附录4.1 函数cv2.rectangle4.2 参考附录1 人脸识别 通过图片或者摄像头的方式,将识…...

【Rabbitmq篇】高级特性----事务,消息分发
目录 事务 消息分发 应用场景 1. 限流 2.负载均衡 事务 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制.SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败. 何为原…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...