pytorch 15.1 学习率调度基本概念与手动实现方法
文章目录
- 一、学习率对模型训练影响
- 二、学习率调度基本概念与手动实现方法
- 1.模型调度基本概念
- 2.手动实现学习率调度
- 3.常用学习率调度思路
从本节开始,我们将介绍深度学习中学习率优化方法。学习率作为模型优化的重要超参数,在此前的学习中,我们已经看到了学习率的调整对模型训练在诸多方面的显著影响。这里我们先简单回顾此前遇到的学习率调整的场景:
- 缓解Dead ReLU Problem
在ReLU激活函数叠加的神经网络中,由于ReLU本身负值归零的特性,可能会出现Dead ReLU Problem,根据Lesson 13.4的实验结果,我们可以通过减小学习率来降低模型落入活性失效陷进的概率。不过降低学习率也代表模型收敛速度更慢; - 提升模型表现
同时,学习率调整的也将显著影响模型性能。根据Lesson 14中的实验结果可知,在学习率绝对数值的调整过程中,学习率对模型性能的影响整体呈现U型(以准确率评估指标时是倒U型)特征,即学习率过大或者过小都不好,学习过大可能会导致模型无法穿越狭窄的通道最终抵达最小值点,而学习率太小则容易在最小值点附近停止收敛,因此在进行模型训练时,我们需要找到一个适中的准确率取值(如Lesson 14.3中的0.005)。
整体来看,如果模型学习率设置太大,虽然前期收敛速度较快,但容易出现收敛过程不稳定、收敛结果不佳、或者神经元活性失效等问题;而如果学习率设置太小,虽然收敛过程将相对平稳,并且能够有效规避神经元活性坏死的问题,但容易出现收敛速度慢、收敛结果不佳等问题。为了深入理解该问题,同时也为了为后续实验储备对比数据,首先,我们可以通过设计实验来观测不同超参数取值对模型收敛速度、收敛结果影响。
一、学习率对模型训练影响
仍然利用Lesson 14中所定义的模型类和数据,通过设置不同学习率,来观察学习率对模型收敛速度和收敛结果两方面影响情况。
from mytorch import *# 设置随机数种子
torch.manual_seed(420) # 创建最高项为2的多项式回归数据集
features, labels = tensorGenReg(w=[2, -1, 3, 1, 2], bias=False, deg=2)# 进行数据集切分与加载
train_loader, test_loader = split_loader(features, labels, batch_size=50)
# 设置随机数种子
torch.manual_seed(24) # 关键参数
num_epochs = 20# 实例化模型
tanh_model1 = net_class2(act_fun = torch.tanh, in_features=5, BN_model='pre')
tanh_model2 = net_class2(act_fun = torch.tanh, in_features=5, BN_model='pre')
tanh_model3 = net_class2(act_fun = torch.tanh, in_features=5, BN_model='pre')
tanh_model4 = net_class2(act_fun = torch.tanh, in_features=5, BN_model='pre')# tanh_model进行模型训练
train_l1, test_l1 = model_train_test(tanh_model1, train_loader,test_loader,num_epochs = num_epochs, criterion = nn.MSELoss(), optimizer = optim.SGD, lr = 0.03, cla = False, eva = mse_cal)train_l2, test_l2 = model_train_test(tanh_model2, train_loader,test_loader,num_epochs = num_epochs, criterion = nn.MSELoss(), optimizer = optim.SGD, lr = 0.01, cla = False, eva = mse_cal)train_l3, test_l3 = model_train_test(tanh_model3, train_loader,test_loader,num_epochs = num_epochs, criterion = nn.MSELoss(), optimizer = optim.SGD, lr = 0.005, cla = False, eva = mse_cal)train_l4, test_l4 = model_train_test(tanh_model4, train_loader,test_loader,num_epochs = num_epochs, criterion = nn.MSELoss(), optimizer = optim.SGD, lr = 0.001, cla = False, eva = mse_cal)plt.plot(list(range(num_epochs)), train_l1, label='train_mse_0.03')
plt.plot(list(range(num_epochs)), train_l2, label='train_mse_0.01')
plt.plot(list(range(num_epochs)), train_l3, label='train_mse_0.005')
plt.plot(list(range(num_epochs)), train_l4, label='train_mse_0.001')
plt.legend(loc = 1)
由此我们能够清楚的看到,学习率较大的模型收敛速度较快,但效果却不一定最好。而学习率非常小的模型不仅收敛速度较慢,并且效果也不尽如人意。对于tanh2来说,在当前数据集上,学习率为0.001时表现较好。
不过,值得注意的是,尽管学习率的调整会对模型训练造成很大的影响,但在进行学习率优化的时候一般不会采用Lesson 14.3中同时训练多组学习率采用不同取值的模型来对比选择最佳学习率的方法。在实际生产生活中,训练一个模型已经是非常耗费时间的了,为了一个超参数同时训练多组模型并不划算。而要通过学习率数值调整来让模型“又好又快”的收敛,就需要采用一种名为学习率调度的优化算法。
二、学习率调度基本概念与手动实现方法
1.模型调度基本概念
既然我们无法通过训练多组模型来寻找最优学习率,那么一个最基本的想法,就是让学习率伴随模型训练过程动态调整。并且,根据上述实验结果我们也不难发现,一个比较好的学习率动态调整策略是,先让学习率取得较大数值,从而能够让模型在最开始能够以较快的速度收敛;然后在经过一段时间迭代之后,将学习率调小,从而能够让收敛过程穿过损失函数的“隘口”,抵达更小的解。
这样的一个学习率调整的策略,也被称为学习率调度(Learning rate scheduler)。
注:此处学习率的调整和一般的超参数调整不太一样。一般来说,模型的超参数调整是需要找出一个有助于模型提升效果的确定性的数值,比如模型层数、激活函数、归一化方法选取等,而一旦超参数数值确定,无论是训练过程还是测试过程都将以该参数的取值为准。但学习率参数本质上并不是一个影响模型结构的参数,而是辅助训练过程的参数,更准确的来说,是辅助模型各线性层(目前为止)参数取得最优解的参数。因此,学习率确实是否是确定的值其实并不重要,学习率取值可以随着迭代过程不断变化,只要这样的一个动态变化的过程最终能够让模型“又好又快”的收敛、即让各线性层参数以较快速度收敛至最小值。
2.手动实现学习率调度
而要在PyTorch中实现学习率的动态调整,首先我们能够想到的是在fit过程手动调整学习率,例如,第一次fit设置2轮epochs、lr设置为0.03,第二次fit设置2轮epochs、lr设置0.01等等依此类推。我们可以借助Python中的input函数来手动实现学习率伴随迭代epoch次数的动态调整,具体操作方法如下:
# 1、实例化模型
# 设置随机数种子
torch.manual_seed(24) # 实例化模型
tanh_model = net_class2(act_fun=torch.tanh, in_features=5, BN_model='pre')# 2、更新fit函数
# 对fit函数进行更新,在原有fit函数基础上加上每一轮迭代后模型评估结果的记录功能。
def fit_rec(net, criterion, optimizer, train_data,test_data,epochs = 3, cla = False, eva = mse_cal):"""模型训练函数(记录每一次遍历后模型评估指标):param net:待训练的模型 :param criterion: 损失函数:param optimizer:优化算法:param train_data:训练数据:param test_data: 测试数据 :param epochs: 遍历数据次数:param cla: 是否是分类问题:param eva: 模型评估方法:return:模型评估结果"""train_l = []test_l = []for epoch in range(epochs):net.train()for X, y in train_data:if cla == True:y = y.flatten().long() # 如果是分类问题,需要对y进行整数转化yhat = net.forward(X)loss = criterion(yhat, y)optimizer.zero_grad()loss.backward()optimizer.step()net.eval()train_l.append(eva(train_data, net).detach())test_l.append(eva(test_data, net).detach())return train_l, test_l # 训练集评估结果, 测试集评估结果# 3、测试函数性能
fit_rec(net = tanh_model, criterion = nn.MSELoss(), optimizer = optim.SGD(tanh_model.parameters(), lr = 0.03), train_data = train_loader,test_data = test_loader,epochs = 3, cla = False, eva = mse_cal)
- 手动动态调整过程
接下来,我们尝试借助Python中的input函数功能,来执行手动动态调整模型训练过程中的学习率。
所谓手动调整学习率,指的是可以在自定义的训练间隔中灵活调整模型学习率,而要将手动输入的数值作为模型当前阶段训练的参数,就需要使用input函数。Python中的input函数通过提供用户可交互的输入窗口来捕捉用户的即时输入,并将其转化为字符串形式传入当前操作空间中。据此,我们可以设计一个简单的计算流程,根据手动输入结果灵活控制每一次迭代的epochs以及对应的学习率数值。并且将每一轮循环结果记录在一个列表中。
l1 = [1, 2, 3]
l2 = [2, 3, 4]
l1.extend(l2)
l1
l1.append(l2)
l1
# 创建用于保存记录结果的空列表容器
train_mse = []
test_mse = []# 创建可以捕捉手动输入数据的模型训练流程
while input("Do you want to continue the iteration? [y/n]") == "y": # 询问是否继续迭代epochs = int(input("Number of epochs:")) # 下一轮迭代遍历几次数据lr = float(input("Update learning rate:")) # 设置下一轮迭代的学习率train_l, test_l = fit_rec(net = tanh_model, criterion = nn.MSELoss(), optimizer = optim.SGD(tanh_model.parameters(), lr = lr), train_data = train_loader,test_data = test_loader,epochs = epochs, cla = False, eva = mse_cal)train_mse.extend(train_l)test_mse.extend(test_l)# 查看模型运行结果
plt.plot(train_mse, label='train_mse')
plt.legend(loc = 1)
- 我们可以让模型以0.03作为学习率迭代60个epochs,对比模型训练效果
plt.plot(train_mse, label='train_mse')
plt.plot(train_msel, label='train_msel')
plt.xlabel('epochs')
plt.ylabel('MSE')
plt.legend(loc = 1)
能够看出,手动调整模型学习率的第一个模型在最终模型表现上比第二个模型更好,在同样遍历了60次的情况下,模型一能够收敛至一个更小的MSE。
- 我们再令模型一直以学习率为0.01进行训练,测试模型最终效果。
plt.plot(train_mse, label='train_mse')
plt.plot(train_mses, label='train_mses')
plt.xlabel('epochs')
plt.ylabel('MSE')
plt.legend(loc = 1)
我们能够发现,第一个模型收敛速度明显快于第二个模型,据此也能说明手动调整模型学习率的有效性。
至此,我们就完成了学习率手动调度实验。在上述操作流程中,可以即时调整每一次训练遍历数据集的次数、同时灵活设置该训练过程的学习率。值得注意的是,尽管在大多数建模场景下,我们都会选择直接借助PyTorch中的一些更加高级的方法自动调整学习率,但上述操作过程所涉及到的手动分批训练、模型训练中间结果呈现等方法,除了能够让我们完成学习率调度实验外,其实都是应对大规模数据集训练时为灵活调整模型中间过程而必须掌握的基本技术手段。
对于算法工程来说,无论有多么先进的自动化处理方法,我们都需要保留一套手动验证的方法。
3.常用学习率调度思路
根据上述实验,我们基本能够总结得出,伴随模型遍历数据集次数增加、学习率逐渐降低,能够使得模型整体性能有所提升。但是,上述手动实验过程中学习率调整的方法还是相对来说比较粗糙,我们只是每隔30个epochs将学习率调小一次,很多结果也是通过尝试最后得出。在实际生产工作中,我们需要使用理论更加严谨的学习率调度方法。
在长期的实践经验总结基础上,目前来看,从实现思路上划分,比较通用的学习率调度的策略分为以下五类:
-
幂调度:
随着迭代次数增加,学习率呈现幂律变化,例如, l r lr lr为初始(第一轮)学习率,第二轮迭代时学习率调整为 l r / 2 lr/2 lr/2,第三轮迭代时学习率调整为 l r / 3 lr/3 lr/3等;(实践过程具体数值有所差异) -
指数调度:
随着迭代次数增加,学习率呈现指数变化,例如, l r lr lr为初始(第一轮)学习率,第二轮迭代时学习率调整为 l r / 1 0 1 lr/10^1 lr/101,第三轮迭代时学习率调整为 l r / 1 0 2 = l r / 100 lr/10^2 = lr/100 lr/102=lr/100等;(实践过程具体数值有所差异) -
分段恒定调度:
即每隔几轮迭代调整一次学习率,例如1-10轮学习率为 l r lr lr,10-20轮时学习率为 l r / 100 lr/100 lr/100等,不难发现此前我们所做的实验就是一种特殊的分段恒定调度策略; -
性能调度:
即每隔一段时间观察误差变化情况,如果误差基本不变,则降低学习率继续迭代; -
周期调度:
和前面几种学习率调度策略一味将学习率递减有所不同,周期调度允许学习率在一个周期内进行先递增后递减的变化;
下一节,我们尝试在PyTorch中调用相关方法来实现学习率调度。
相关文章:
pytorch 15.1 学习率调度基本概念与手动实现方法
文章目录 一、学习率对模型训练影响 二、学习率调度基本概念与手动实现方法1.模型调度基本概念2.手动实现学习率调度3.常用学习率调度思路 从本节开始,我们将介绍深度学习中学习率优化方法。学习率作为模型优化的重要超参数,在此前的学习中,我…...
c++ 类的语法4
测试析构函数、虚函数、纯虚函数: void testClass5() {class Parent {public:Parent(int x) { cout << "Parent构造: " << x << endl; }~Parent() {cout << "调用Parent析构函数" << endl;}virtual string toSt…...
品铂科技在UWB行业地位综述(2025年更新)
一、行业领先地位 国内UWB领域头部企业 在2025年中国UWB企业综合实力排行榜中位列第一,技术研发、市场份额及行业影响力均处于领先地位。连续多年获评中国物联网产业联盟“中国最有影响力物联网定位企业”。 2.全球技术竞争力 .2016年IPSN微软国际室内…...
muduo库EventLoop模块详解
muduo库EventLoop模块深度解析 EventLoop是muduo网络库实现Reactor模型的核心调度中枢,负责驱动整个事件循环机制,协调Poller、Channel、TimerQueue等组件的工作。其设计遵循"One Loop Per Thread"原则。 一、核心职责与设计思想 1. 核心职责…...
循环导入(Circular Import) 错误
ImportError: cannot import name event_type_data_tree from partially initialized module routers.ticket (most likely due to a circular import) (E:\ai12345\backend\app\routers\ticket.py) 这是什么错,中文回答 这个错误是 循环导入(Circular …...
基于大数据的租房信息可视化系统的设计与实现【源码+文档+部署】
课题名称 基于大数据的租房信息可视化系统的设计与实现 学 院 专 业 计算机科学与技术 学生姓名 指导教师 一、课题来源及意义 租房市场一直是社会关注的热点问题。随着城市化进程的加速,大量人口涌入城市,导致租房需求激增。传统的租…...
奥运数据可视化:探索数据讲述奥运故事
在数据可视化的世界里,体育数据因其丰富的历史和文化意义,常常成为最有吸引力的主题之一。今天我要分享一个令人着迷的奥运数据可视化项目,它巧妙地利用交互式图表和动态动画,展现了自1896年至今奥运会的发展历程和各国奥运成就的…...
linux环境下 安装svn并且创建svn版本库详细教程
一、安装SVN 通过yum安装Subversion 在Linux系统中执行以下命令安装: yum install subversion -y 安装完成后,验证版本: svnserve --version 二、创建版本库 选择存储路径并创建目录 通常将版本库放在/var/svn或/usr/local/…...
STM32控制电机
初始化时钟:在 STM32 的程序中,初始化系统时钟,一般会使用 RCC(Reset and Clock Control)相关函数来配置时钟。例如,对于 STM32F103 系列,可能会使用 RCC_APB2PeriphClockCmd 函数来使能 GPIO 和…...
Ubuntu 更改 Nginx 版本
将 1.25 降为 1.18 先卸载干净 # 1. 完全卸载当前Nginx sudo apt purge nginx nginx-common nginx-core# 2. 清理残留配置 sudo apt autoremove sudo rm -rf /etc/apt/sources.list.d/nginx*.list修改仓库地址 # 添加仓库(通用稳定版仓库) codename$(…...
微服务初步学习
系统架构演变过程 一、单体架构 前后端都在一个项目中,包括我们现在的前后端分离开发,都可以看作是一个单体项目。 二、集群架构 把一个服务部署多次,可以解决服务不够的问题,但是有些不必要的功能也跟着部署多次。 三、垂直架…...
旧 docker 版本通过 nvkind 搭建虚拟多节点 gpu 集群的坑
踩坑 参考nvkind教程安装到Setup这一步,由于docker版本较旧,–cdi.enabled 和 config 参数执行不了 手动修改 /etc/docker/daemon.json 配置文件 "features": {"cdi": true}手动修改 /etc/nvidia-container-runtime/config.toml 配…...
Fabric 服务端插件开发简述与聊天事件监听转发
原文链接:Fabric 服务端插件开发简述与聊天事件监听转发 < Ping通途说 0. 引言 以前写过Spigot的插件,非常简单,仅需调用官方封装好的Event类即可。但Fabric这边在开发时由于官方文档和现有互联网资料来看,可能会具有一定的误…...
Wise Disk Cleaner:免费系统清理工具,释放空间,提升性能
Wise Disk Cleaner是一款功能强大且完全免费的系统清理工具,专为帮助用户清理系统中的无用文件和垃圾文件而设计。它能够有效释放磁盘空间,提高系统运行速度,确保电脑始终保持最佳性能。无论是日常维护还是深度清理,Wise Disk Cle…...
排序算法之高效排序:快速排序,归并排序,堆排序详解
排序算法之高效排序:快速排序、归并排序、堆排序详解 前言一、快速排序(Quick Sort)1.1 算法原理1.2 代码实现(Python)1.3 性能分析 二、归并排序(Merge Sort)2.1 算法原理2.2 代码实现…...
主打「反激进」的一汽丰田,靠稳扎稳打的技术实现突围
文/王俣祺 导语:今年的上海车展,当新势力都在用“1000TOPS算力”“激光雷达矩阵”等参数堆砌着一个个技术神话的时候,一汽丰田却选择了一条不同的路——用“反激进”的技术哲学,在电动化和智能化的大风向中,构建独特的…...
变量赋值和数据类型
对象 Python是面相对象的编程语言,在Python一些都是对象,对象由标识、类型、值三部分组成,本质上来讲,系统分配一块内存,这块内存中存储了特定了的值,还支持特定类型的相关操作。 标识:即对象…...
【笔记】cri-docker.service和containerd
cri-docker.service 和 containerd 都是 Kubernetes 支持的容器运行时组件,但它们的架构、功能定位及与 Docker 的关系有显著差异。以下是它们的核心区别和关联: 1. 功能定位 组件核心角色是否直接支持 CRIcontainerd轻量级容器运行时,直接管…...
技术文章:解决汇川MD500系列变频器干扰问题——GRJ9000S EMC滤波器的应用
1. 引言 汇川MD500系列变频器(Variable Frequency Drive, VFD)以其高性能、宽功率范围(0.4kW-500kW)和灵活的控制方式,广泛应用于工业自动化领域,如风机、水泵、传送带和压缩机等。然而,MD500系…...
频域中的反射-信号完整性分析
频域中的反射: 频域与时域的桥梁是傅里叶变换,一个周期信号可以拆分为许多个正弦波。所谓从频域中看信号,看到的可以是很多个频域中的点,也可以是许多个正弦波。 所以在大家眼中看到的信号如图4-13所示。我们可以将该信号分解为图4-14所示信号。 让我们来思考下面这个问题:…...
window nvidia-smi命令 Failed to initialize NVML: Unknown Error
如果驱动目录下的可以执行,那可能版本原因 "C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"复制"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"替换 C:\Windows\System32\nvidia-smi.exe 或者 把C:\Windows\System3…...
ubuntu 20.04 更改国内镜像源-阿里源 确保可用
镜像源是跟linux版本一一对应的,查询自己系统的版本号: 命令:lsb_release -a macw:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal macw:~$…...
Elasticsearch 学习(一)如何在Linux 系统中下载、安装
目录 一、Elasticsearch 下载二、使用 yum、dnf、zypper 命令下载安装三、使用 Docker 本地快速启动安装(ESKibana)【测试推荐】3.1 介绍3.2 下载、安装、启动3.3 访问3.4 修改配置,支持ip访问 官网地址: https://www.elastic.co/…...
PYTHON训练营DAY27
装饰器 编写一个装饰器 logger,在函数执行前后打印日志信息(如函数名、参数、返回值) logger def multiply(a, b):return a * bmultiply(2, 3) # 输出: # 开始执行函数 multiply,参数: (2, 3), {} # 函数 multiply 执行完毕&a…...
Shell脚本日志输出完整指南(AI)
一、基础日志输出方法 1. 标准输出与错误重定向 在Shell脚本中,可以使用重定向操作符将命令输出记录到日志文件: >:覆盖写入文件>>:追加写入文件2>:重定向错误输出&>:同时重定向标准…...
node.js文件系统(fs) - 创建文件、打开文件、写入数据、追加数据、读取数据、创建目录、删除目录
注意:以下所有示例均是异步语法! 注意:以下所有示例均是异步语法! 创建文件 node.js 允许我们在计算机本地创建文件,例如创建一个 word 文件: // 引入核心模块(fs) var fs require(fs)// API fs.writeF…...
关于如何本地启动xxl-job,并且整合SpringBoot
1. 本地安装xxl-job并启动 拉取xxl-job的代码 git clone gitgithub.com:xuxueli/xxl-job.git配置xxl-job数据库 拉取代码后,代码的doc/db目录下有官方配置好的sql脚本,执行里面的sql脚本至本地数据库 3. 修改xxl-job默认的数据库配置 spring.dataso…...
基于Unity的简单2D游戏开发
基于Unity的简单2D游戏开发 摘要 本文围绕基于Unity的简单2D游戏开发进行深入探讨,旨在分析其开发过程中的技术架构与实现策略。通过文献综述与市场分析,研究发现,近年来Unity引擎因其优秀的跨平台特性及可视化编程理念,成为2D游戏开发的主要工具。文章首先梳理了游戏开发的…...
在服务器上安装AlphaFold2遇到的问题(3)_cat: /usr/include/cudnn_version.h: 没有那个文件或目录
[rootlocalhost ~]# cat /usr/include/cudnn_version.h cat: /usr/include/cudnn_version.h: 没有那个文件或目录这个错误表明系统找不到 cudnn_version.h 头文件,说明 cuDNN 的开发文件(头文件)没有正确安装。以下是完整的解决方案ÿ…...
Java生产环境设限参数教学
哈哈,这个问题问得好!咱们用开餐厅的比喻来理解生产环境的四大必须设限参数,保证你听完再也不会忘!(搓手手) 1. 堆内存上限:-Xmx(厨房的最大容量) 问题:想象…...
武汉火影数字全息剧秀制作:科技与艺术的梦幻联动
全息剧秀是通过全息投影技术、多媒体互动技术、舞台表演艺术等元素深度融合的新型演出形式。 随着科技的不断进步,投影技术的更加成熟,全息剧秀作为演艺行业的创新力量,正以其独特的魅力和无限的潜力,为观众带来全新的视听盛宴。 …...
MySQL锁机制详解与加锁流程全解析
一、MySQL锁机制全景图 1.1 锁类型体系 #mermaid-svg-czUB6iJgmHuOPdN1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-czUB6iJgmHuOPdN1 .error-icon{fill:#552222;}#mermaid-svg-czUB6iJgmHuOPdN1 .error-text{f…...
云轴科技ZStack官网上线Support AI,智能助手助力高效技术支持
5月16日,云轴科技ZStack在官网(www.zstack.io)正式上线ZStack Support AI智能助手。该系统是ZStack应用人工智能于技术支持服务领域的重要创新,基于自研ZStack AIOS平台智塔及LLMOPS技术打造。 ZStack Support AI定位为智能客服&…...
深度学习笔记23-LSTM实现火灾预测(Tensorflow)
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者: 一、前期准备 1.导入数据 import pandas as pd import numpy as npdf_1 pd.read_csv("D:\TensorFlow1\woodpine2.csv") df_1import matplotlib.pyplot as…...
单例模式(Singleton Pattern)详解
单例模式(Singleton Pattern)详解 1. 定义与核心目标 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。核心目标: 控制实例数量:防止重复创建对象,节省资源。统一管理共享资源:如配置管理、数据库连接池、日志处理器等。2. 实现方式及对比 (…...
IntelliJ IDEA打开项目后,目录和文件都不显示,只显示pom.xml,怎样可以再显示出来?
检查.idea文件夹 如果项目目录中缺少.idea文件夹,可能导致项目结构无法正确加载。可以尝试删除项目根目录下的.idea文件夹,然后重新打开项目,IDEA会自动生成新的.idea文件夹和相关配置文件,从而恢复项目结构。 问题解决࿰…...
LongRefiner:解决长文档检索增强生成的新思路
大语言模型与RAG的应用越来越广泛,但在处理长文档时仍面临不少挑战。今天我们来聊聊一个解决这类问题的新方法——LongRefiner。 背景问题:长文档处理的两大难题 使用检索增强型生成(RAG)系统处理长文档时,主要有两个…...
Tcping详细使用教程
Tcping详细使用教程 下载地址 https://download.elifulkerson.com/files/tcping/0.39/在windows环境下安装tcping 在以上的下载地中找到exe可执行文件,其中tcping.exe适用于32位Windows系统,tcping64.exe适用于64位Windows操作系统。 其实tcping是个…...
Java + 鸿蒙双引擎:ZKmall开源商城如何定义下一代B2C商城技术标准?
在 B2C 电商领域持续革新的当下,技术架构的优劣成为决定商城竞争力的核心要素。ZKmall开源商城以其创新融合的 Java 与鸿蒙双引擎,为下一代 B2C 商城技术标准勾勒出全新蓝图,在性能、兼容性、拓展性等关键维度实现了重大突破。 一、Java 技术…...
华为云Flexus+DeepSeek征文|基于Dify平台tiktok音乐领域热门短视频分析Ai agent
前言 在当今数字化快速发展的时代,人工智能技术尤其是大模型的应用,正逐渐成为推动各行业创新与变革的关键力量。大模型凭借其强大的语言理解、生成和逻辑推理能力,为企业和开发者提供了全新的解决方案和应用可能性。然而,将这些…...
排序算法之线性时间排序:计数排序,基数排序,桶排序详解
排序算法之线性时间排序:计数排序、基数排序、桶排序详解 前言一、计数排序(Counting Sort)1.1 算法原理1.2 代码实现(Python)1.3 性能分析1.4 适用场景 二、基数排序(Radix Sort)2.1 算法原理2…...
HarmonyOS 开发之 —— 合理使用动画与转场
HarmonyOS 开发之 —— 合理使用动画与转场 谢谢关注!! 前言:上一篇文章主要介绍HarmonyOs开发之———UIAbility进阶:https://blog.csdn.net/this_is_bug/article/details/147976323?spm=1011.2415.3001.10575&sharefrom=mp_manage_link 在移动应用开发中,动画与转…...
网络流量分析 | NetworkMiner
介绍 NetworkMiner 是一款适用于Windows(也适用于Linux/Mac)的开源网络取证分析工具。它可被用作被动网络嗅探器/数据包捕获工具,也可被用于检测操作系统、会话、主机名、开放端口等,还能被用于解析pcap文件进行离线分析。点击此…...
EtherCAT转ProfiNet智能网关选型策略匹配S7-1500与CX5140通讯需求的关键参数对比
一、案例背景 随着新能源行业的迅猛发展,锂电池生产制造企业面临着日益激烈的市场竞争和不断增长的生产需求。某锂电池生产企业在扩大产能的过程中,新建了一条锂电池生产线。该生产线采用了倍福CX5140PLC作为EtherCAT协议主站,控制着涂布机、…...
适合学校使用的桌面信息看板,具有倒计时、桌面时钟、课程表、天气预报、自动新闻联播、定时关机、消息通知栏、随机点名等功能。
简介 教育时钟(Education Clock) 是一款致力于帮助学习者科学规划学习时间、提高学习效率的开源工具。由 Return-Log 团队开发,适配多平台(Windows、Mac、Linux),界面简洁直观,操作便捷。通过设…...
兰亭妙微设计:为生命科技赋予人性化的交互语言
在医疗科技日新月异的今天,卓越的硬件性能唯有匹配恰如其分的交互语言,方能真正发挥价值。作为专注于医疗UI/UX设计的专业团队,兰亭妙微设计(www.lanlanwork.com)始终相信:每一处像素的排布,都应…...
redis数据结构-12(配置 RDB 快照:保存间隔和压缩)
配置 RDB 快照:保存间隔和压缩 Redis 持久性对于确保在服务器重启或发生故障时数据不会丢失至关重要。虽然 Redis 以其内存中数据存储而闻名,但它提供了将数据持久化到磁盘的机制。本章节重点介绍其中一种机制:Redis 数据库 (RDB…...
SG7050VAN差分晶振,X1G0042810033,EPSON爱普生以太网6G晶振
产品简介 SG7050VAN差分晶振,X1G0042810033,EPSON爱普生以太网6G晶振,日本EPSON爱普生株式会社,进口晶振型号:SG7050VAN,编码为:X1G0042810033,频率为:156.250000 MHz,小体积晶振尺…...
nfs网络文件系统
nfs网络文件系统简介 NFS (Network File system ,网络文件系统)是由SUN公司研制的UNIX表示层协议,它允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上使用。在NFS的应用中,本地NFS的客…...
西安前端面试
面试1 1.vue2和vue3的原理及区别 2.伪数组 3.对箭头函数怎么理解的 4.vue父子组件传值的几种方式 5.对Promise的理解 面试2 1.两个升序数组实现合并升序排序 2.数组拍平[3, [[7, [1, 5]], 4], 8, [6]] 面试3 1.let var const的区别,什么时候const能改变 …...