Python torch.optim.lr_scheduler 常用学习率调度器使用方法
在看学习率调度器之前,我们先看一下学习率的相关知识:
学习率
学习率的定义
-
学习率(Learning Rate)是深度学习中一个关键的超参数,它决定了在优化算法(如梯度下降法)更新模型参数时,参数调整的幅度。简单来说,它控制着模型在训练过程中朝着最小化损失函数方向前进的步伐大小。
-
假设我们使用简单的梯度下降法来更新模型的参数
,对于损失函数
,其更新规则可以表示为:
-
其中,
就是学习率。这个公式的意思是,在参数更新时,我们沿着损失函数梯度的反方向(因为梯度方向是函数增长最快的方向,我们要求最小值,所以取反方向)移动,移动的步长由学习率
决定。
学习率的重要性
-
学习率过大 :
-
如果学习率设置得太大,在参数更新时可能会 “迈过” 最优解,导致模型在训练过程中不能稳定地收敛。例如,想象你在山上的一个点,想要下山走到山谷最低点。如果每一步都跨得很大,可能会跨过山谷底部,然后在山谷两侧来回震荡,甚至发散到山谷外面,无法到达真正的最低点。
-
-
学习率过小 :
-
相反,学习率太小会使模型的训练过程变得非常缓慢。就像下山时每一步都迈得非常小,可能需要花费很长时间才能走到山谷底部,并且在这个过程中可能会陷入局部最优解,因为步子太小而无法跳出局部的 “小山谷”。
-
-
学习率的调整策略
-
固定学习率 :在整个训练过程中保持学习率不变。这种方法简单,但如果初始学习率选择不当,可能会带来前面提到的收敛问题。不过,在一些简单的模型或者对训练速度和精度要求不特别高的场景下,可能是一种可行的策略。
-
动态学习率(部分) :
-
余弦退火(Cosine Annealing) :学习率按照余弦函数的形式进行变化。公式为
,其中
是第 t 时刻的学习率,
和
分别是学习率的最小值和最大值,T 是一个周期。它可以让学习率在训练过程中周期性地变化,有助于模型在训练初期快速调整参数,在后期精细调整,以更好地收敛。
-
指数衰减(Exponential Decay) :学习率随着时间指数级地减小。公式为
,其中
是初始学习率,k 是衰减系数,t 是训练的迭代次数。这种策略使得模型在训练初期有较大的学习率来快速调整参数,在训练后期学习率逐渐减小,使参数能更精细地逼近最优值。
-
步长衰减(Step Decay) :每隔一定数量的迭代次数,将学习率按照一定的比例衰减。例如,在迭代次数达到一定阈值 T 时,将学习率乘以一个衰减因子
(
通常小于 1),即
,这样可以有效控制学习率的下降速度,同时避免学习率下降过快或过慢。
-
-
学习率调度器
torch.optim.lr_scheduler
提供了多种学习率调度器,用于动态调整神经网络训练过程中的学习率,下面是一些常见的学习率调度器及其使用方法、输入参数和代码演示:
StepLR
StepLR 调度器会在训练过程中的每个指定步数间隔,按设定的衰减因子降低学习率。具体来说,每隔 step_size 个 epoch 或 iteration,学习率就乘以 gamma 参数,呈阶梯状衰减.
优势
-
参数 :
-
optimizer
:优化器,如 SGD、Adam 等。 -
step_size
:多少个 epoch 后更新一次学习率。 -
gamma
:学习率的衰减系数,默认为 0.1,每次调整时学习率都会乘以这个值。 -
last_epoch
:最后一次更新学习率的 epoch,默认为 -1,表示从头开始训练。
-
-
使用场景
-
分阶段训练 :当训练过程可以划分为多个明确的阶段,每个阶段需要不同学习率时,如先快速学习再细致调整,StepLR 可在前期用高学习率快速收敛,后期降低学习率精细调整模型参数。
-
明确的训练阶段划分 :如果训练任务有明确的阶段划分,且每个阶段对学习率有不同要求,StepLR 能按照预定步骤调整学习率,以适应不同阶段的训练需求。
-
实现简单 :StepLR 调度逻辑简单,参数配置少,易于理解和使用,只需设置 step_size 和 gamma 即可实现学习率的基本调整策略。
-
稳定收敛 :在训练后期降低学习率,可减小参数更新幅度,使模型更稳定地接近最优解,提升模型精度,减少因学习率过高导致的模型性能波动或发散问题。
局限性
-
固定调整模式 :其调整策略较为固定,不考虑训练过程中的损失变化、准确率提升等实际性能表现,可能无法满足复杂训练场景下的动态调整需求。
-
参数选择敏感 :对 step_size 和 gamma 参数的选择较为敏感,不合适的参数可能导致学习率调整不当,影响模型收敛速度和性能,如 step_size 过大可能延迟学习率下降时机,过小则可能使学习率下降过快。
代码演示
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim.lr_scheduler import StepLRmodel = nn.Linear(10, 1)
optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)for epoch in range(40):for inputs, labels in dataset:optimizer.zero_grad()outputs = model(inputs)loss = nn.MSELoss()(outputs, labels)loss.backward()optimizer.step()scheduler.step()
MultiStepLR
MultiStepLR 调度器是深度学习中用于调整学习率的一种策略,它允许用户在指定的多个 epoch 点按指定的因子调整学习率。
MultiStepLR 调度器会在训练过程中,当 epoch 达到预设的里程碑(milestones)时,将学习率乘以一个指定的衰减因子 gamma。通过这种方式,可以在训练的不同阶段灵活地调整学习率,帮助模型更稳定地收敛。
-
参数 :
-
optimizer
:优化器。 -
milestones
:一个列表,指明在哪些 epoch 进行学习率更新。包含了在训练过程中学习率要降低的 epoch 编号,列表中的 epoch 编号必须是递增的。 -
gamma
:学习率的衰减系数,默认为 0.1。 -
last_epoch
:最后一次更新学习率的 epoch,默认为 -1。
-
使用场景
-
多阶段训练 :当训练过程可以划分为多个明确的阶段,每个阶段需要不同的学习率时,MultiStepLR 可以在预设的 epoch 点调整学习率,满足不同阶段的训练需求。
-
特定任务需求 :对于一些特定任务或模型架构,需要在特定的 epoch 后调整学习率以优化性能,MultiStepLR 可以根据需求进行定制化的学习率调整。
优势
-
灵活性高 :用户可以根据具体的训练需求,灵活地指定在哪些 epoch 点调整学习率,以及调整的幅度,适用于各种复杂的训练场景。
-
稳定性强 :通过在需要的时期降低学习率,可以帮助模型在较小的学习率下进行更精细的权重更新,提高模型的泛化能力,使模型更稳定地收敛。
局限性
-
参数选择敏感 :对 milestones 和 gamma 参数的选择较为敏感,不合适的参数可能导致学习率调整不当,影响模型收敛速度和性能。如果指定的 milestones 过于频繁或 gamma 过小,可能会使学习率下降过快,导致模型训练过早收敛;反之,若 milestones 间隔过长或 gamma 过大,则可能无法及时降低学习率,使模型在后期训练中难以精细调整参数。
-
调整方式固定 :虽然比 StepLR 更灵活,但其调整方式仍然是按照预设的规则进行,无法根据训练过程中的实际性能表现(如损失变化、准确率变化等)动态地调整学习率。
代码演示
scheduler = MultiStepLR(optimizer, milestones=[5,10,30], gamma=0.1)for epoch in range(40):for inputs, labels in dataset:optimizer.zero_grad()outputs = model(inputs)loss = nn.MSELoss()(outputs, labels)loss.backward()optimizer.step()scheduler.step()
ExponentialLR
ExponentialLR 是 PyTorch 中一种以指数方式衰减学习率的调度器,它在每个 epoch 或每个 batch 后按固定的指数因子缩减学习率,帮助模型以更平滑、渐进的方式逼近最优解。以下是对其的详细解释:
ExponentialLR 的基本公式是:new_lr = initial_lr × gamma^epoch
。其中,initial_lr
是训练开始时设定的学习率,gamma
是一个小于 1 的常数,表示每个 epoch 学习率的缩减因子,控制学习率递减的速度。在每个 epoch 结束后,学习率都会乘以 gamma
这个因子,从而实现指数衰减
-
参数 :
-
optimizer
:优化器。 -
gamma
:学习率的衰减系数。 -
last_epoch
:最后一次更新学习率的 epoch,默认为 -1。
-
适用场景
ExponentialLR 适用于以下场景:
-
需要平稳且持续减小学习率的任务 :当希望学习率在整个训练过程中持续且缓慢降低,以避免训练后期的震荡,帮助模型稳定收敛时,ExponentialLR 是一个简单有效的选择。
-
训练过程相对稳定的任务 :在训练过程相对稳定,不需要复杂的学习率调整策略时,ExponentialLR 可以满足需求。
优势
-
平滑性 :通过指数方式平滑地减少学习率,避免了学习率骤降可能引发的不稳定性,从而有助于模型更好地收敛。
-
简单性与通用性 :只需设置一个简单的缩减因子 gamma,即可实现学习率的指数衰减,适用于许多不同类型的任务和模型。
局限性
-
参数选择敏感 :对 gamma 参数的选择较为敏感,不合适的 gamma 值可能导致学习率调整不当。如果 gamma 过小,学习率会下降过快,可能导致模型训练过早收敛;反之,若 gamma 过大,则学习率衰减过慢,可能无法及时降低学习率,使模型在后期训练中难以精细调整参数。
-
无法动态调整 :其调整方式是按照固定的指数衰减规则进行,无法根据训练过程中的实际性能表现(如损失变化、准确率变化等)动态地调整学习率。
代码演示
scheduler = ExponentialLR(optimizer, gamma=0.9)for epoch in range(60):for inputs, labels in dataset:optimizer.zero_grad()outputs = model(inputs)loss = nn.MSELoss()(outputs, labels)loss.backward()optimizer.step()scheduler.step()
ReduceLROnPlateau
ReduceLROnPlateau
是 PyTorch 中一种基于性能指标动态调整学习率的调度器。
基本原理
ReduceLROnPlateau
通过监控验证集上的性能指标(如验证损失或验证精度)来决定是否调整学习率。当指标在若干个 epoch 内停止改善时,它会将学习率按一定比例降低,从而帮助模型更好地收敛。这种动态调整策略适用于模型训练的后期,当模型性能提升变缓时,可以让模型更精细地学习。
-
参数 :
-
optimizer
:优化器。 -
mode
:指定监控指标的模式,"min" 表示指标越小越好,"max" 表示指标越大越好。 -
factor
:学习率的衰减系数,默认为 0.1。 -
patience
:多少个 epoch 验证指标没有改善后,更新学习率。 -
verbose
:如果为 True,则在学习率更新时打印信息。 -
threshold
:判断指标是否改善的阈值,默认为 1e-4。 -
threshold_mode
:指定判断指标是否改善的模式,"rel" 表示相对变化,"abs" 表示绝对变化。 -
cooldown
:学习率更新后,多少个 epoch 不监控指标变化。 -
min_lr
:学习率的下限,默认为 0。 -
eps
:用于比较的epsilon值,默认为 1e-8。
-
使用场景
-
当模型在验证集上的性能长时间不再提升时,通过降低学习率,可以让模型更细致地搜索最优解。
-
对于学习率敏感的优化器(如 SGD),在训练后期使用
ReduceLROnPlateau
可以提高模型性能。
优势
-
动态调整:根据模型的实际性能表现动态调整学习率,比固定的调整策略更灵活。
-
自适应性:能够自适应地降低学习率,适合模型在不同训练阶段的需求。
局限性
-
依赖监控指标:需要选择合适的监控指标,并确保其与模型训练目标一致。
-
参数选择敏感:对参数(如
patience
、factor
等)的选择较为敏感,不合适的参数可能导致学习率调整不当。
代码演示
scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5, verbose=True)for epoch in range(40):for inputs, labels in dataset:optimizer.zero_grad()outputs = model(inputs)loss = nn.MSELoss()(outputs, labels)loss.backward()optimizer.step()scheduler.step(loss)
CosineAnnealingLR
CosineAnnealingLR
是 PyTorch 中一种基于余弦退火方法调整学习率的调度器。
基本原理
CosineAnnealingLR
通过余弦退火策略逐渐减小学习率,其核心思想是让学习率按照余弦函数的形状进行变化,从初始学习率开始,在训练过程中逐渐减小到一个最小值,通常在训练后期再慢慢回升。这种方式可以使学习率在训练过程中更加平滑地变化,有助于模型更好地收敛,并在训练后期更细致地调整参数。
-
参数 :
-
optimizer
:优化器。 -
T_max
:最大周期数,即多少个 epoch 后重新开始一个余弦周期。 -
eta_min
:学习率的下限,默认为 0。 -
last_epoch
:最后一次更新学习率的 epoch,默认为 -1。
-
-
适用场景
-
需要平稳学习率调整的任务:当希望学习率在整个训练过程中平滑地减小,并在训练后期避免振荡时,可以使用
CosineAnnealingLR
。 -
复杂模型训练:对于一些复杂的模型,如深度神经网络,
CosineAnnealingLR
可以帮助更好地寻找全局最优解,尤其在大规模数据集训练时,能够提高模型的泛化能力。 -
优势
-
平滑学习率变化:通过余弦函数的平滑特性,使学习率在训练过程中逐渐减小,避免了学习率骤降可能引发的不稳定性,提高了训练的稳定性。
-
提升模型性能:帮助模型在训练后期更细致地调整参数,从而提升最终的模型性能。
-
局限性
-
非线性调整的复杂性:余弦退火的学习率调整方式较为复杂,可能需要更多试验来确定合适的参数组合。
-
参数选择敏感:对
T_max
和eta_min
参数的选择较为敏感,不合适的参数可能导致学习率调整不当,影响模型的收敛速度和性能。 -
防止过拟合:随着学习率的减小,模型的参数更新步伐减慢,可以有效防止过拟合。
scheduler = CosineAnnealingLR(optimizer, T_max=30,eta_min = 1e-4)for epoch in range(60):for inputs, labels in dataset:optimizer.zero_grad()outputs = model(inputs)loss = nn.MSELoss()(outputs, labels)loss.backward()optimizer.step()scheduler.step()
LambdaLR
LambdaLR
是 PyTorch 中一种高度灵活的学习率调度器,它允许用户通过自定义函数来动态调整学习率。
基本原理
LambdaLR
通过用户定义的 lambda 函数来确定学习率的调整方式。在每个 epoch 结束时,调度器会根据当前 epoch 数调用 lambda 函数,计算出一个学习率乘法因子,然后用该因子乘以初始学习率来更新当前学习率。公式如下: 其中,λ(epoch) 是用户定义的函数,base_lr 是初始学习率。
-
输入参数 :
-
optimizer
:优化器,用于更新模型参数。 -
lr_lambda
:一个函数或函数列表,每个函数根据当前 epoch 返回一个学习率乘数。如果使用多个参数组,则lr_lambda
的长度应与参数组数量相同。 -
last_epoch
:最后一次更新学习率的 epoch,默认为 -1,表示从头开始训练。
-
适用场景
-
灵活自定义学习率调整策略:当需要实现复杂的学习率调整策略,而其他预定义的调度器无法满足需求时,
LambdaLR
是一个理想的选择。例如,可以设计指数衰减、阶梯衰减或其他任意形式的学习率变化规则。 -
多参数组学习率独立调整:如果模型的不同参数组需要不同的学习率调整策略,
LambdaLR
的lr_lambda
参数可以是一个函数列表,每个函数对应一个参数组,从而实现对不同参数组学习率的独立控制。
优势
-
高度灵活:用户可以根据具体需求定义任意复杂的学习率变化规则,适合各种特殊场景。
-
便于实验:适合研究者快速测试不同的学习率调度策略,能够方便地调整和验证不同的 lambda 函数对模型训练效果的影响。
-
支持多组参数:支持对不同参数组设置不同的学习率调整函数,能够更好地满足模型训练中不同部分的优化需求。
局限性
-
学习率调整复杂度高:由于学习率的变化完全由用户定义的函数决定,对于一些没有经验的研究者或开发者来说,设计出合适的学习率调整函数可能具有一定难度。
-
参数选择敏感:不合适的 lambda 函数可能导致学习率调整不当,影响模型的收敛速度和性能。
import torch
import torch.nn as nn
import torch.optim as optimmodel = nn.Linear(5, 3)
optimizer = optim.SGD(model.parameters(), lr=0.01)def custom_lr_lambda(epoch):if epoch < 10: # 第1阶段:前10个epoch,学习率线性增加return (epoch + 1) / 10.0elif epoch < 30: # 第2阶段:10到30个epoch,学习率保持恒定return 1.0elif epoch < 50: # 第3阶段:30到50个epoch,学习率按指数衰减return 0.1 ** ((epoch - 30) / 20.0)else: # 第4阶段:50个epoch之后,学习率保持最低值return 0.01
scheduler = optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=custom_lr_lambda)for epoch in range(60):for inputs, labels in dataset:optimizer.zero_grad()outputs = model(inputs)loss = nn.MSELoss()(outputs, labels)loss.backward()optimizer.step()scheduler.step()
CyclicLR
CyclicLR
是 PyTorch 中一种循环学习率调度器,它根据循环学习率策略(Cyclical Learning Rate, CLR)动态调整学习率。
基本原理
CyclicLR
根据循环学习率策略,让学习率在两个边界(base_lr
和 max_lr
)之间以恒定频率循环变化。在每个 batch 结束后,调度器会更新学习率。
-
输入参数 :
-
optimizer
:所使用的优化器。 -
base_lr
:初始学习率,是每个参数组的下界。 -
max_lr
:每个参数组的上界,定义了循环的振幅(max_lr - base_lr
)。 -
step_size_up
:在循环的上升阶段中,学习率从base_lr
增加到max_lr
所需的训练迭代次数。 -
step_size_down
:在循环的下降阶段中,学习率从max_lr
减少到base_lr
所需的训练迭代次数。若为None
,则默认与step_size_up
相同。 -
mode
:学习率调整的模式,可选'triangular'
(无幅度缩放的三角形循环)、'triangular2'
(每个循环将初始振幅缩放一半的三角形循环)、'exp_range'
(每个循环迭代按gamma^cycle_iterations
缩放初始振幅)。 -
gamma
:在'exp_range'
模式下,缩放初始振幅的因子。 -
scale_fn
:自定义的缩放策略,是一个单参数的 lambda 函数,其值域为[0, 1]
。若指定,则mode
参数会被忽略。 -
scale_mode
:定义scale_fn
是基于周期还是迭代次数来计算。 -
cycle_momentum
:是否循环动量,若为True
,动量会与学习率反向变化。 -
base_momentum
:动量的下界。 -
max_momentum
:动量的上界。 -
last_epoch
:上一个 epoch 的索引,用于恢复训练。
-
适用场景
-
训练复杂网络:在训练复杂网络时,
CyclicLR
可以提供动态调整学习率的能力,帮助模型更好地收敛。 -
需要频繁调整学习率的任务:对于需要在训练过程中频繁调整学习率的任务,
CyclicLR
可以以一定的频率调整学习率,而无需手动干预。 -
超参数搜索:在搜索超参数时,
CyclicLR
可以帮助找到合适的学习率范围,从而提高模型性能。
优势
-
提高模型性能:通过动态调整学习率,可以在训练过程中更好地探索损失函数的曲面,从而提高模型的性能。
-
防止陷入局部最优:学习率的循环变化有助于模型跳出局部最优,继续寻找更优的解。
-
适用范围广:适用于多种不同的训练任务,尤其是那些对学习率敏感的任务。
局限性
-
参数选择复杂:需要选择多个参数(如
base_lr
、max_lr
、step_size_up
等),不合适的参数可能导致学习率调整不当,影响模型的收敛速度和性能。 -
不适合所有模型:对于一些简单的模型或任务,
CyclicLR
可能不会带来显著的性能提升,反而增加了训练的复杂性。
代码演示
import torch
import torch.nn as nn
import torch.optim as optimmodel = nn.Linear(5, 3)
optimizer = optim.SGD(model.parameters(), lr=0.001)scheduler = optim.lr_scheduler.CyclicLR(optimizer,base_lr=0.005,max_lr=0.01,step_size_up=10,step_size_down=10,mode='triangular',cycle_momentum=False
),
for epoch in range(60):for i, (inputs, labels) in enumerate(dataset):optimizer.zero_grad()outputs = model(inputs)loss = nn.MSELoss()(outputs, labels)loss.backward()optimizer.step()scheduler.step()
OneCycleLR
OneCycleLR
是 PyTorch 中一种基于 1cycle 策略的学习率调度器,旨在通过动态调整学习率和动量来加速模型训练并提高性能。
基本原理
OneCycleLR
的核心思想是将学习率从一个较低的初始值逐渐增加到一个最大值,然后再逐步降低到一个比初始值更小的最小值。动量变化通常是相反的:动量从高到低再回到中间值。整个过程在一个训练周期内完成,不需要多个周期重复。这种策略能帮助模型更好地收敛,提高训练效率。
-
输入参数 :
-
optimizer
:优化器。 -
max_lr
:学习率的最大值。 -
total_steps
:整个训练过程的总步数,如果不指定,则需要同时指定epochs
和steps_per_epoch
。 -
epochs
:训练的总 epoch 数。 -
steps_per_epoch
:每个 epoch 的步数。 -
pct_start
:学习率提升阶段所占整个训练周期的比例,默认为 0.3。 -
anneal_strategy
:退火策略,可选'cos'
或'linear'
,分别代表余弦退火和线性退火。 -
cycle_momentum
:是否调整动量,默认为True
。如果为True
,动量会随着学习率的变化而反向变化。 -
base_momentum
:动量的最小值。 -
max_momentum
:动量的最大值。 -
div_factor
:初始学习率是max_lr
除以div_factor
的比值。 -
final_div_factor
:最终学习率是max_lr
除以final_div_factor
的比值。 -
three_phase
:如果为True
,则训练过程分为三个阶段:提升学习率、第一次降低学习率、第二次降低学习率。
-
适用场景
-
需要快速收敛的任务:适合在训练初期快速提高学习率以加快参数调整,使模型在较短时间内收敛。
-
对学习率敏感的模型:能有效调整学习率,避免学习率过高或过低导致的模型训练问题。
优势
-
加速训练:通过在训练初期快速提升学习率,能更快地进行模型参数调整,使模型快速收敛。
-
提升模型性能:提供更优的优化路径,从而提高模型的最终表现。
-
减少手工调参需求:系统性的学习率安排减少了对多次调试不同学习率曲线的需求。
局限性
-
参数选择敏感:不合适的参数可能导致学习率调整不当,影响模型的收敛速度和性能。
-
适用范围有限:对于一些简单的模型或任务,
OneCycleLR
可能不会带来显著的性能提升。
import torch
import torch.nn as nn
import torch.optim as optimmodel = nn.Linear(5, 3)
optimizer = optim.SGD(model.parameters(), lr=0.01)scheduler = optim.lr_scheduler.OneCycleLR(optimizer,max_lr=0.1,epochs=60,steps_per_epoch=2,pct_start=0.25,anneal_strategy='cos',cycle_momentum=True,base_momentum=0.85,max_momentum=0.95,div_factor=25.0,final_div_factor=10000.0
),for epoch in range(60):for inputs, labels in dataset:optimizer.zero_grad()outputs = model(inputs)loss = nn.MSELoss()(outputs, labels)loss.backward()optimizer.step()scheduler.step()
相关文章:
Python torch.optim.lr_scheduler 常用学习率调度器使用方法
在看学习率调度器之前,我们先看一下学习率的相关知识: 学习率 学习率的定义 学习率(Learning Rate)是深度学习中一个关键的超参数,它决定了在优化算法(如梯度下降法)更新模型参数时࿰…...
从零开始学Python游戏编程39-碰撞处理1
在《从零开始学Python游戏编程38-精灵5》代码的基础上,添加两个敌人的防御塔,玩家的坦克无法移动到防御塔所在的空格中,如图1所示。 图1 游戏中的碰撞处理 1 游戏中空格的坐标 在《从零开始学Python游戏编程36-精灵3》中提到,可…...
同步定时器的用户数要和线程组保持一致,否则jmeter会出现接口不执行’stop‘和‘×’的情况
调试压测时发现了一个问题就是线程计划总是出现‘stop’的按钮无法执行完毕 发现时同步定时器导致的,就是有接口使用了同步定时器,但是这个同步定时器的用户数量设置的<线程组用户数量时,会出现执行无法结束的情况,如下…...
如何在Linux用libevent写一个聊天服务器
废话少说,先看看思路 因为libevent的回调机制,我们可以借助这个机制来创建bufferevent来实现用户和用户进行通信 如果成功连接后我们可以直接在listener回调函数里创建一个bufferevent缓冲区,并为每个缓冲区设置相应的读回调和事件回调&…...
Virtuoso ADE采用Spectre仿真中出现MOS管最小长宽比满足要求依然报错的情况解决方法
在ADE仿真中错误问题如下: ERROR (CMI-2440): "xxx.scs" 46338: I2.M1: The length, width, or area of the instance does not fit the given lmax-lmin, wmax-wmin, or areamax-areamin range for any model in the I2.M3.nch_hvt group. The channel w…...
防火墙原理与应用总结
防火墙介绍: 防火墙(Firewall)是一种网络安全设备,其核心目标是通过分析数据包的源地址、端口、协议等内容,保护一个网络区域免受来自另一个网络区域的网络攻击和网络入侵行为,同时允许合法流量自由通行。…...
Graph Database Self-Managed Neo4j 知识图谱存储实践2:通过官方新手例子入门(未完成)
官方入门例子:neo4j-graph-examples/get-started: An introduction to graph databases and Neo4j for new users 官方例子仓库:https://github.com/neo4j-graph-examples 下载数据 git clone https://github.com/neo4j-graph-examples/get-started …...
GIT下载步骤
git官方链接: 添加链接描述...
C++中的vector和list的区别与适用场景
区别 特性vectorlist底层实现动态数组双向链表内存分配连续内存块非连续内存块随机访问支持,通过索引访问,时间复杂度O(1)不支持,需遍历,时间复杂度O(n)插入/删除末尾操作效率高,时间复杂度O(1)任意位置操作效率高&am…...
软件测试入门学习笔记
今天学习新知识,软件测试。 什么是软件测试? 使用人工和自动手段来运行或测试某个系统的过程,目的在于检验它是否满足规定的需求或弄清实际结果与预期结果之间的差别。 软件测试的目的? 1)为了发现程序࿰…...
2025年深度学习模型发展全景透视(基于前沿技术突破与开源生态演进的交叉分析)
2025年深度学习模型发展全景透视 (基于前沿技术突破与开源生态演进的交叉分析) 一、技术突破与能力边界拓展 智能水平跃升 2025年开源模型如Meta Llama-4、阿里Qwen2.5-VL参数规模突破1300亿,在常识推理能力测试中首次超越人类基准线7.2%谷歌…...
时间复杂度分析
复杂度分析的必要性: 当给我们一段代码时,我们是以什么准则来判断代码效率的高低呢?每一段代码都会消耗一段时间,或占据一段数据空间,那么自然是在实现相同功能的情况下,代码所耗时间最少,所占…...
BGE-m3 和 BCE-Embedding 模型对比分析
以下是对 BGE-m3 和 BCE-Embedding 模型在 embedding 领域的多维度对比分析,基于公开的技术文档和实验数据: 1. 基础信息对比 维度BGE-m3 (智源研究院)BCE-Embedding (网易)发布时间2024 年 1 月2023 年 9 月模型架构Transformer-basedTransformer-base…...
题目 3320: 蓝桥杯2025年第十六届省赛真题-产值调整
题目 3320: 蓝桥杯2025年第十六届省赛真题-产值调整 时间限制: 2s 内存限制: 192MB 提交: 549 解决: 122 题目描述 偏远的小镇上,三兄弟共同经营着一家小型矿业公司 “兄弟矿业”。公司旗下有三座矿山:金矿、银矿和铜矿,它们的初始产值分别用…...
计算机组成原理第二章 数据的表示和运算——2.1数制与编码
计算机组成原理第二章 数据的表示和运算——数制与编码 一、基本概念与核心知识点 1.1 数制系统基础 1.1.1 进位计数制 定义:以固定基数(如2、8、10、16)表示数值的系统核心要素: 基数(R):允…...
基于归纳共形预测的大型视觉-语言模型中预测集的**数据驱动校准**
摘要 本研究通过分离共形预测(SCP)框架,解决了大型视觉语言模型(LVLMs)在视觉问答(VQA)任务中幻觉缓解的关键挑战。虽然LVLMs在多模态推理方面表现出色,但它们的输出常常表现出具有…...
Golang | 自行实现并发安全的Map
核心思路,读写map之前加锁!哈希思路,大map化分为很多个小map...
【Python数据库编程实战】从SQL到ORM的完整指南
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:SQLite基础操作案例2:MySQL连接池案例3:SQLAlchemy ORM …...
深入剖析扣子智能体的工作流与实战案例
前面我们已经初步带大家体验过扣子工作流,工作流程是 Coze 最为强大的功能之一,它如同扣子中蕴含的奇妙魔法工具,赋予我们的机器人处理极其复杂问题逻辑的能力。 这篇文章会带你更加深入地去理解并运用工作流解决实际问题 目录 一、工作流…...
【计算机网络】IP地址
IPv4 五类地址 1.0.0.0 ~ 126.255.255.255A类子网8位,主机24位128.0.0.0 ~ 191.255.255.255B类子网16位,主机16位192.0.0.0 ~ 223.255.255.255C类子网24位,主机8位224.0.0.0 ~ 239.255.255.255D类不分网络地址和主机地址,作为组播…...
基于CATIA参数化管道建模的自动化插件开发实践——NX建模之管道命令的参考与移植
引言 在机械设计领域,CATIA作为行业领先的CAD软件,其强大的参数化建模能力备受青睐。本文介绍如何利用Python的PySide6框架与CATIA二次开发技术,开发一款智能管状体生成工具。该工具借鉴了同类工业软件NX的建模的管道命令,通过Py…...
运维之SSD硬盘(SSD hard Drive for Operation and Maintenance)
背景 SSD的产生背景是计算技术发展和市场需求驱动的结果。早期计算机使用磁芯存储器,后来被半导体存储器取代,提高了速度和可靠性。随着电子设备小型化,对轻便、低功耗存储器的需求增长,SSD因无机械部件、速度快、耗电少而受到关…...
基于javaweb的SSM+Maven红酒朔源管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
HTML 地理定位(Geolocation)教程
HTML 地理定位(Geolocation)教程 简介 HTML5 的 Geolocation API 允许网页应用获取用户的地理位置信息。这个功能可用于提供基于位置的服务,如导航、本地搜索、天气预报等。本教程将详细介绍如何在网页中实现地理定位功能。 工作原理 浏览器可以通过多种方式确定…...
RHEL与CentOS:从同源到分流的开源操作系统演进
RHEL与CentOS:从同源到分流的开源操作系统演进 一、核心关系:源代码的重构与社区化 RHEL(Red Hat Enterprise Linux)与CentOS(Community ENTerprise Operating System)的关系可以概括为“同源异构”。RHE…...
架构师面试(三十六):广播消息
题目 在像 IM、短视频、游戏等实时在线类的业务系统中,一般会有【广播消息】业务,这类业务具有瞬时高流量的特点。 在对【广播消息】业务实现时通常需要同时写 “系统消息库” 和更新用户的 “联系人库” 的操作,用户的联系人表中会有未读数…...
Spine 动画教程:皮肤制作
一、前言 搁了很久的抖音直播小玩法开发,最近又让我想起来了。由于是初次尝试,所以我将开发费用的预算降到为零。不但不买服务器采用 UnitySDK 的指令直推,而且游戏的资产也用 AI 生成,主打省时又省钱。 但是图片有了࿰…...
Rust 学习笔记:函数和控制流
Rust 学习笔记:函数和控制流 Rust 学习笔记:函数和控制流函数(Function)语句和表达式带返回值的函数注释控制流if 表达式使用 else if 处理多个条件在 let 语句中使用 if循环loop从循环中返回值循环标签消除多个循环之间的歧义带 …...
探秘LLM推理模型:hidden states中藏着的self verification的“钥匙”
推理模型在数学和逻辑推理等任务中表现出色,但常出现过度推理的情况。本文研究发现,推理模型的隐藏状态编码了答案正确性信息,利用这一信息可提升推理效率。想知道具体如何实现吗?快来一起来了解吧! 论文标题 Reasoni…...
《Learning Langchain》阅读笔记8-RAG(4)在vector store中存储embbdings
什么是 vector store? 与专门用于存储结构化数据(如 JSON 文档或符合关系型数据库模式的数据)的传统数据库不同,vector stores处理的是非结构化数据,包括文本和图像。像传统数据库一样,vector stores也能执…...
【C/C++】深入理解指针(五)
文章目录 深入理解指针(五)1.回调函数是什么?2.qsort使用举例2.1 使用qsort函数排序整型数据强调 2.2 使用qsort排序结构数据 3.qsort函数的模拟实现 深入理解指针(五) 1.回调函数是什么? 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指…...
【vue】【element-plus】 el-date-picker使用cell-class-name进行标记,type=year不生效解决方法
typedete,自定义cell-class-name打标记效果如下: 相关代码: <el-date-pickerv-model"date":clearable"false":editable"false":cell-class-name"cellClassName"type"date"format&quo…...
RocketMQ 主题与队列的协同作用解析(既然队列存储在不同的集群中,那要主题有什么用呢?)---管理命令、配置安装
学习之前呢需要会使用linux的基础命令 一.RocketMQ 主题与队列的协同作用解析 在 RocketMQ 中,主题(Topic)与队列(Queue)的协同设计实现了消息系统的逻辑抽象与物理存储分离。虽然队列实际存储在不同集群的 B…...
解决视频处理中的 HEVC 解码错误:Could not find ref with POC xxx【已解决】
问题描述 今天在使用 Python 处理视频时遇到了以下错误: [hevc 0x7f8a1d02b7c0] Could not find ref with POC 33之前没接触过视频处理,查了一下,这个错误通常发生在处理 HEVC(H.265)编码 的视频时,原因…...
NEGATIVE LABEL GUIDED OOD DETECTION WITH PRETRAINED VISION-LANGUAGE MODELS
1. 介绍: 这篇论文也是基于CLIP通过后处理的方法实现的OOD的检测,但是设计点在于,之前的方法是使用的ID的类别,这篇工作是通过添加一些在语义上非常不同于ID的类别的外分布类来做的OOD检测。 CLIP做OOD检测的这个系列里面我看的以及记录的第一篇就是MCM的方法,这也是确实是…...
Appium自动化 -- 环境安装
1.安装Appium-Python-Clientpip install Appium-Python-Client 2.AndroidSdk安装和环境配置 AndroidSdk下载地址:https://www.androiddevtools.cn/# 下载后解压 SDK Manager.exe 安装sdk tools、sdk plaform-tools、sdk build-tools AndroidSDK 环境变量配…...
Zeppelin在spark环境导出dataframe
1.Zeppelin无法直接访问本地路径 如果zeppelin无法直接访问本地路径,可先将dataframe写到s3,在通过读取s3路径下载文件 %pyspark # 示例:用 PySpark 处理数据 df spark.createDataFrame([(1, "Alice"), (2, "Bob")], …...
Vue3 上传后的文件智能预览(实战体会)
目录 前言1. Demo12. Demo2 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 此处的基本知识涉及较少,主要以Demo的形式供大…...
面试常问问题:Java基础篇
一、面向对象编程(OOP) 四大特性 封装、继承、多态、抽象的具体实现与区别? 抽象类与接口的区别?何时选择抽象类或接口? 重写(Override)和重载(Overload)的规则与区别&…...
测试流程?
需求分析 组织需求评审会议,邀请开发团队和测试团队参与。产品经理详细讲解需求,确保开发和测试人员对需求理解一致。 测试计划 分配测试人员:根据项目需求和测试人员的技能,分配测试任务和范围。确定测试策略:包括测…...
Python命名参数的使用
Python脚本传递参数的方式有: 使用sys.argv按照先后的顺序传入对应的参数使用argparse包加载和解析传递的命名参数 下面代码是第2中使用的实例: parser argparse.ArgumentParser(description参数使用说明) parser.add_argument(--time, -t, typestr,…...
赛灵思 XCKU115-2FLVB2104I Xilinx Kintex UltraScale FPGA
XCKU115-2FLVB2104I 是 AMD Xilinx Kintex UltraScale FPGA,基于 20 nm 先进工艺,提供高达 1 451 100 个逻辑单元(Logic Cells),77 721 600 bit 的片上 RAM 资源,以及 5 520 个 DSP 切片(DSP48E…...
使用 Python 项目管理工具 uv 快速创建 MCP 服务(Cherry Studio、Trae 添加 MCP 服务)
文章目录 下载Traeuv 工具教程参考我的这篇文章创建 uv 项目main.pyCherry Studio 添加 MCP 服务DeepSeek API配置 DeepSeek API调用 MCP 服务 Trae 添加 MCP 服务添加 MCP创建智能体 使用智能体调用 MCP 创建 demo 表查询 demo 表结构信息demo 表插入 2 条测试数据查询 demo 表…...
Docker容器持久化
引言 Docker 容器作为一种轻量级、可移植的虚拟化技术,广泛应用于开发、测试和生产环境中。然而,容器天生是短暂的,意味着它们在生命周期结束后会被销毁,而其中的数据也会随之丢失。为了确保容器中的数据能够持久化,我…...
【信息系统项目管理师】高分论文:论成本管理与采购管理(信用管理系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划成本管理2、成本估算3、成本预算4、成本控制论文 2019年1月,我作为项目经理参与了 XX基金管理有限公司信用管理系统项目。该项目成 本1000万,建设期为1年。通过该项目,XX基金管理有限公司在信用…...
WINDOWS 下Maven 安装及配置教程
Maven 安装及配置教程(Windows)【安装】_windows 安装maven-CSDN博客...
Pycharm(十六)面向对象进阶
一、继承 概述: 实际开发中,我们发现很多类中的步分内容是相似的,或者相同的,每次写很麻烦,针对这种情况, 我们可以把这些相似(相同的)部分抽取出来,单独地放到1个类中&…...
实时数据驱动未来:谷云科技CDC实时数据集成平台新版本发布
数据流动的“零延迟时代”已来 在数字化转型的浪潮中,数据已成为企业核心资产,而数据的实时流动能力正成为业务竞争力的关键。谷云科技深耕数据集成领域多年,基于对行业痛点的深刻洞察,正式推出CDC实时数据集成平台****全新版本。…...
来自 3D 世界的 JPEG。什么是 glTF?什么是 glb?
定义和简史 GLTF(GL 传输格式)是一种用于存储 3D 场景和模型的文件格式,它非常易于理解(结构是用 JSON 标准编写的),可扩展并易于与现代 Web 技术交互。这种格式可以很好地压缩 3D 场景,并最大限…...
同一页面下动态加载内容的两种方式:AJAX与iframe
iframe iframe能够嵌入另一个 HTML 文档到当前页面。 iframe可以加载任何类型的内容,包括完整的HTML页面。 AJAX 使用 JavaScript 发起 HTTP 请求,通常通过 XMLHttpRequest 或现代浏览器中的 fetch API。 可以异步更新页面内容,而不必刷…...