RT-DETR代码详解(官方pytorch版)——参数配置(1)
前言
RT-DETR虽然是DETR系列,但是它的代码结构和之前的DETR系列代码不一样。
它是通过很多的yaml文件进行参数配置,和之前在train.py的parser = argparse.ArgumentParser()去配置所有参数不同,所以刚开始不熟悉代码的时候可能不知道在哪儿修改参数。
RT-DETR有官方版和ultralytics版两个版本代码,可以参考以下链接,分别使用两种方法对代码进行复现:
详解RT-DETR网络结构/数据集获取/环境搭建/训练/推理/验证/导出/部署_rt-dert-CSDN博客
下述内容主要是针对参数配置的代码实现进行解读,因为刚开始我拿着代码都不知道是怎么运行的,模型在哪儿加载参数都找不到
一、train.py文件
在RT-DETR中,train.py文件需要配置的内容很少,因为需要的参数配置全都放在了rtdetr_rxxvd_6x_coco.yml(骨干网络可选)文件中。在这个文件中又包含了其他所有的文件,可以依需修改:
左边是可以选择的backbone骨干网络,后续以ResNet18为例。
二、rtdetr_r18vd_6x_coco.yaml文件
__include__: ['../dataset/coco_detection.yml', # 数据集'../runtime.yml', # 运行参数配置'./include/dataloader.yml', # 定义数据加载器参数'./include/optimizer.yml', # 定义优化器通用设置'./include/rtdetr_r50vd.yml', # 定义 RT-DETR 模型的结构参数(如 backbone 和解码器层数等
]output_dir: ./output/rtdetr_r18vd_6x_coco # 输出的文件地址PResNet:depth: 18freeze_at: -1 # 不冻结任何层(如果设置为正数,则冻结 ResNet 的前几层)freeze_norm: False # 不冻结归一化层(如 BatchNorm)pretrained: True # 加载预训练权重(通常是基于 ImageNet 数据集的权重)HybridEncoder:in_channels: [128, 256, 512] # 编码器的输入特征通道数,分别对应 ResNet-18 不同尺度的特征图输出hidden_dim: 256expansion: 0.5 # 特征通道扩展比例RTDETRTransformer:eval_idx: -1 # 指定在哪一层解码器输出进行评估(-1 表示最后一层)num_decoder_layers: 3 # 解码器的层数num_denoising: 100 # 去噪查询的数量optimizer:type: AdamW # 该优化器改进了 Adam,支持权重衰减以减轻过拟合params: # 参数分组,针对不同模块的参数设置不同的学习率和权重衰减- params: '^(?=.*backbone)(?=.*norm).*$' # 匹配骨干网络中的归一化层参数,设置较低学习率和无权重衰减lr: 0.00001weight_decay: 0.- params: '^(?=.*backbone)(?!.*norm).*$' # 匹配骨干网络中非归一化参数lr: 0.00001- params: '^(?=.*(?:encoder|decoder))(?=.*(?:norm|bias)).*$' # 匹配 Transformer 中归一化层或偏置参数weight_decay: 0.lr: 0.0001betas: [0.9, 0.999] # Adam 优化器的 beta 参数weight_decay: 0.0001 # 权重衰减值
上面的注释只是为了解释各行代码意思,但是运行代码过程中,yaml文件不能有注释,否则会报错:
三、yaml_config.py文件
在train.py文件中,实际是通过YAMLConfig()这个类读取rtdetr_r18vd_6x_coco.yaml中的配置信息。通过加载 YAML 配置文件,将不同的模型、优化器、数据加载器等组件以模块化的方式创建
主要功能
1. 动态加载 YAML 配置文件:
- 使用
load_config
函数加载 YAML 文件,读取其中的配置数据。- 支持通过
merge_dict
将命令行或其他来源的参数覆盖 YAML 文件中的默认配置。2. 组件动态创建:
- 根据 YAML 文件的配置,动态创建模型(
model
)、损失函数(criterion
)、优化器(optimizer
)、学习率调度器(lr_scheduler
)和数据加载器(dataloader
)等。3. 参数分组和正则匹配:
- 支持为优化器指定不同模块的参数组,并通过正则表达式选择分组的参数。
4. 支持扩展功能:
- 支持 EMA(Exponential Moving Average,指数滑动平均) 和 AMP(Automatic Mixed Precision,自动混合精度)。
- 自动处理模型参数的冻结、梯度裁剪等功能。
5. 模块化设计:
- 配置组件通过
create
函数动态实例化,便于扩展和自定义。
3.1 类初始化与加载配置
class YAMLConfig(BaseConfig):def __init__(self, cfg_path: str, **kwargs) -> None:super().__init__()cfg = load_config(cfg_path) # 加载 YAML 配置文件merge_dict(cfg, kwargs) # 合并外部输入的参数(高优先级)self.yaml_cfg = cfg # 保存解析后的 YAML 配置# 一些常见配置的提取self.log_step = cfg.get('log_step', 100)self.checkpoint_step = cfg.get('checkpoint_step', 1)self.epoches = cfg.get('epoches', -1)self.resume = cfg.get('resume', '')self.tuning = cfg.get('tuning', '')self.sync_bn = cfg.get('sync_bn', False)self.output_dir = cfg.get('output_dir', None)self.use_ema = cfg.get('use_ema', False)self.use_amp = cfg.get('use_amp', False)self.autocast = cfg.get('autocast', dict())self.find_unused_parameters = cfg.get('find_unused_parameters', None)self.clip_max_norm = cfg.get('clip_max_norm', 0.0)
- 功能:
- 从 YAML 配置文件中加载配置,初始化训练流程中常用的参数。
cfg_path
:YAML 配置文件路径。kwargs
:支持通过外部传入参数(如命令行参数)覆盖 YAML 中的默认配置。- 使用
get
方法设置默认值,避免配置文件缺失某些字段时程序报错。
3.1.1 yaml_config.py文件
通过cfg = load_config(cfg_path)已经将所有的配置信息传递给cfg了
尽管传入的只有一个rtdetr_r18vd_6x_coco.yaml文件,但它里面包含了其他的配置文件地址:
load_config()函数在yaml_utils.py文件中
def load_config(file_path, cfg=dict()):"""加载 YAML 配置文件,并支持递归加载包含的其他 YAML 文件。Args:file_path (str): 要加载的 YAML 文件路径。cfg (dict): 全局配置字典,默认为空字典。Returns:dict: 加载并合并后的配置字典。"""# 获取文件扩展名并确保是 YAML 文件_, ext = os.path.splitext(file_path)assert ext in ['.yml', '.yaml'], "仅支持 YAML 文件(.yml 或 .yaml)"# 打开并加载 YAML 文件with open(file_path, 'r') as f:file_cfg = yaml.load(f, Loader=yaml.Loader)if file_cfg is None:return {} # 如果文件为空,则返回空字典# 检查是否需要加载包含的 YAML 配置(递归加载)if INCLUDE_KEY in file_cfg:# 提取 'include' 键的值,通常是其他 YAML 文件路径的列表base_yamls = list(file_cfg[INCLUDE_KEY])for base_yaml in base_yamls:# 将路径展开为完整路径(支持用户目录 ~ 和相对路径)if base_yaml.startswith('~'):base_yaml = os.path.expanduser(base_yaml)if not base_yaml.startswith('/'): # 如果是相对路径base_yaml = os.path.join(os.path.dirname(file_path), base_yaml)# 递归加载被包含的 YAML 文件base_cfg = load_config(base_yaml, cfg)# 合并当前加载的配置到全局配置中merge_config(base_cfg, cfg)# 最终合并当前文件的配置到全局配置中return merge_config(file_cfg, cfg)
- 通过
include
字段,可以将配置拆分成多个 YAML 文件,便于管理和维护。- 支持递归加载多个 YAML 文件,并通过
merge_config
实现配置合并,确保最终配置完整。
3.2 动态加载组件(如模型、优化器等)
通过 @property
装饰器,延迟加载组件,仅在实际使用时创建对象
@property装饰器
是 Python 的一个内置装饰器,常用于定义一个类的方法,并将其伪装成“属性”。
- 保护类的封装特性
- 让开发者可以使用“对象.属性”的方式操作操作类属性
通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。
语法格式:
@property def 方法名(self)代码块
更多@property装饰器内容可看,其中包含延时加载的应用:@property装饰器-CSDN博客
3.2.1 模型加载
@property
def model(self) -> torch.nn.Module:if self._model is None and 'model' in self.yaml_cfg:merge_config(self.yaml_cfg) # 合并全局配置self._model = create(self.yaml_cfg['model']) # 动态创建模型return self._model
- 检查
_model
是否已经创建,若未创建且配置中包含model
字段,则动态创建模型。(self.yaml_cfg已经存储了所有的配置信息,见3.1.1 图,提取model键的值)- 使用
create
函数按照yaml_cfg['model']
中的定义实例化模型。在rtdetr_r18vd_6x_coco.yml--->./include/rtdetr_r50vd.yml中 :
3.2.2 优化器延迟加载
@property
def optimizer(self):if self._optimizer is None and 'optimizer' in self.yaml_cfg:merge_config(self.yaml_cfg) # 合并全局配置params = self.get_optim_params(self.yaml_cfg['optimizer'], self.model) # 获取参数分组self._optimizer = create('optimizer', params=params) # 动态创建优化器return self._optimizer
- 获取优化器参数分组(
get_optim_params
),根据配置动态创建优化器实例。
3.2.3 学习率调度器加载
@property
def lr_scheduler(self):if self._lr_scheduler is None and 'lr_scheduler' in self.yaml_cfg:merge_config(self.yaml_cfg)self._lr_scheduler = create('lr_scheduler', optimizer=self.optimizer)print('Initial lr: ', self._lr_scheduler.get_last_lr())return self._lr_scheduler
- 动态创建学习率调度器对象,并与优化器绑定
在rtdetr_r18vd_6x_coco.yml--->./include/optimizer.yml中 :
基于MultiStepLR生成对应的学习率调度器
MultiStepLR
是 PyTorch 中torch.optim.lr_scheduler
提供的一种学习率调度器- 它会在指定的训练步骤(
milestones
)调整学习率根据配置,初始学习率为
0.1
,在第1000
步时,学习率会乘以gamma=0.1
,变为0.01
。输出如下:Step 0: Learning Rate = 0.1 Step 500: Learning Rate = 0.1 Step 1000: Learning Rate = 0.01 Step 1500: Learning Rate = 0.01
3.3 数据加载器
@property
def train_dataloader(self):if self._train_dataloader is None and 'train_dataloader' in self.yaml_cfg:merge_config(self.yaml_cfg)self._train_dataloader = create('train_dataloader')self._train_dataloader.shuffle = self.yaml_cfg['train_dataloader'].get('shuffle', False)return self._train_dataloader
- 动态加载训练数据加载器,并根据配置调整
shuffle
参数
3.4 参数分组(正则表达式匹配)
@staticmethod
def get_optim_params(cfg: dict, model: nn.Module):'''E.g.:^(?=.*a)(?=.*b).*$ means including a and b^((?!b.)*a((?!b).)*$ means including a but not b^((?!b|c).)*a((?!b|c).)*$ means including a but not (b | c)'''assert 'type' in cfg, ''cfg = copy.deepcopy(cfg)if 'params' not in cfg:return model.parameters() # 如果未定义参数分组,返回默认模型参数assert isinstance(cfg['params'], list), ''param_groups = []visited = []for pg in cfg['params']:pattern = pg['params']params = {k: v for k, v in model.named_parameters() if v.requires_grad and len(re.findall(pattern, k)) > 0}pg['params'] = params.values()param_groups.append(pg)visited.extend(list(params.keys()))names = [k for k, v in model.named_parameters() if v.requires_grad]if len(visited) < len(names):unseen = set(names) - set(visited)params = {k: v for k, v in model.named_parameters() if v.requires_grad and k in unseen}param_groups.append({'params': params.values()})visited.extend(list(params.keys()))assert len(visited) == len(names), ''return param_groups
- 根据正则表达式匹配模型中的参数(
named_parameters
方法返回<参数名, 参数>
的映射)。- 支持按模块或特定规则分组优化器参数(如设置不同学习率、权重衰减)。
- 未匹配的参数会自动归为默认组。
^(?=.*backbone)(?=.*norm).*$
:匹配键名中包含backbone
和norm
的参数。^(?=.*encoder)(?!.*bias).*$
:匹配键名中包含encoder
且不包含bias
的参数。
相关文章:
![](https://i-blog.csdnimg.cn/direct/cf03079d09714b22bc75cec94fdaeb23.png)
RT-DETR代码详解(官方pytorch版)——参数配置(1)
前言 RT-DETR虽然是DETR系列,但是它的代码结构和之前的DETR系列代码不一样。 它是通过很多的yaml文件进行参数配置,和之前在train.py的parser argparse.ArgumentParser()去配置所有参数不同,所以刚开始不熟悉代码的时候可能不知道在哪儿修…...
![](https://i-blog.csdnimg.cn/direct/ed0f1542452c468fa025d32417286284.png)
腾讯云AI代码助手编程挑战赛-凯撒密码解码编码器
作品简介 在CTFer选手比赛做crypto的题目时,一些题目需要自己去解密,但是解密的工具大部分在线上,而在比赛过程中大部分又是无网环境,所以根据要求做了这个工具 技术架构 python语言的tk库来完成的GUI页面设计,通过…...
![](https://i-blog.csdnimg.cn/direct/41fe23646d834c15b7272dfef3da865f.png)
搭建docker私有化仓库Harbor
Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…...
![](https://i-blog.csdnimg.cn/direct/551c00a566ce429fbd45b1e2ae676cc7.png#pic_center)
【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)
文章目录 S06L22 Search, Find, and Replace - Part One1 从光标位置起,正向定位到当前行的首个字符 b2 从光标位置起,反向查找某个字符3 重复上一次字符查找操作4 定位到目标字符的前一个字符5 单字符查找与 Vim 命令的组合6 跨行查找某字符串7 Vim 的增…...
![](https://www.ngui.cc/images/no-images.jpg)
GIC中断分组介绍(IMX6ull为例)
一、Cortex-A7内核中断 Cortex-A7内核具有多个中断类型,但其中最重要的是复位中断和IRQ(普通中断请求)中断。对于IMX6ULL而言,主要关注的是IRQ中断,因为外部设备和内部事件通常都会触发这类中断。 从左到右 中断控制…...
![](https://i-blog.csdnimg.cn/direct/a68c7153c92a4389b9d2ec3ddb297e31.png)
计算机网络期末复习(知识点)
概念题 在实际复习之前,可以看一下这个视频将网络知识串一下,以便更好地复习:【你管这破玩意叫网络?】 网络规模的分类 PAN(个人区域网络):用于个人设备间的连接,如手机与蓝牙耳机…...
![](https://i-blog.csdnimg.cn/direct/a9e36bd61cb746728bed50efadcd15d7.png)
Apache XMLBeans 一个强大的 XML 数据处理框架
Apache XMLBeans 是一个用于处理 XML 数据的 Java 框架,它提供了一种方式将 XML Schema (XSD) 映射到 Java 类,从而使得开发者可以通过强类型化的 Java 对象来访问和操作 XML 文档。下面将以一个简单的案例说明如何使用 Apache XMLBeans 来解析、生成和验…...
![](https://i-blog.csdnimg.cn/img_convert/a823154f0283714a7911c9e827a61704.jpeg)
飞凌嵌入式i.MX8M Mini核心板已支持Linux6.1
飞凌嵌入式FETMX8MM-C核心板现已支持Linux6.1系统,此次升级不仅使系统功能更加丰富,还通过全新BSP实现了内存性能的显著提升。 基于NXP i.MX8M Mini处理器设计开发的飞凌嵌入式FETMX8MM-C核心板,拥有4个Cortex-A53高性能核和1个Cortex-M4实时…...
![](https://www.ngui.cc/images/no-images.jpg)
【数据链电台】洛克希德·马丁(Lockheed Martin)
洛克希德马丁公司(Lockheed Martin)是全球领先的航空航天、国防、先进技术和安全领域的供应商之一。 公司为美军及盟国军队提供了广泛的通信系统,包括数据链电台和相关的通信系统。 洛克希德马丁的许多产品用于战术通信、卫星通信、电子战、…...
![](https://i-blog.csdnimg.cn/blog_migrate/cover/7bd749109565caaad3799224fad815a4.jpeg)
python关键字(保留字)用法、保留的标识符类(1)
python关键字(保留字)用法、保留的标识符类(1) 一、python保留字(关键字) 1.1、python关键字 以下标识符为保留字,或称 关键字,不可用于普通标识符,即我们不能把它们用作任何标识符名称。 python 保留字(关键字) 关键…...
![](https://www.ngui.cc/images/no-images.jpg)
Ubuntu平台虚拟机软件学习笔记
Ubuntu平台上常见虚拟机软件 VirtualBox [Download]KVM/QEMU 1. VirtualBox 1.1 查看安装版本 VBoxManage -V2. KVM/QEMU KVM: Kernel-based Virtual Machine QEMU: Quick EMUlator 通义千问: virt-manager 既不是QEMU也不是KVM,而是用于管理和创建…...
![](https://i-blog.csdnimg.cn/direct/81d54ec4de9346d1a06c0f865765191c.png)
【数据库系统概论】数据库恢复技术
目录 11.1 事务的基本概念 事务的定义 事务的开始与结束 事务的ACID特性 破坏ACID特性的因素 11.2 数据库恢复概述 11.3 故障的种类 1. 事务内部的故障 2. 系统故障 3. 介质故障 4. 计算机病毒 11.4 恢复的实现技术 如何建立冗余数据 数据转储 登记日志文件 11…...
![](https://i-blog.csdnimg.cn/img_convert/7affe3672b6f5b0bf2dffc6aa6f13f41.gif)
R 语言科研绘图 --- 折线图-汇总
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
![](https://i-blog.csdnimg.cn/img_convert/1604cb33ceaa47bf22adddcf417134f7.png)
基于 Python 和 OpenCV 的人脸识别上课考勤管理系统
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
![](https://i-blog.csdnimg.cn/direct/d3fa311d1c5d40d196293598074c906d.png)
工业 4G 路由器赋能远程医疗,守护生命线
在医疗领域,尤其是偏远地区的医疗救治场景中,工业 4G 路由器正发挥着无可替代的关键作用,宛如一条坚韧的 “生命线”,为守护患者健康持续赋能。 偏远地区医疗资源相对匮乏,常常面临着专业医生短缺、诊疗设备有限等困境…...
![](https://i-blog.csdnimg.cn/direct/05b316c484c8400a83bd669a49ba08eb.png)
Windows安装Ubuntu子系统图形化工具
Windows如何使用WSL方式安装Ubuntu,可以参考:https://blog.csdn.net/xiangzhihong8/article/details/145044370。接下来,我们说一下如何安装Ubuntu的图形化系统。 为了测试,这里介绍两种常见的图形化工具。第一种为VcXsrv Gnome…...
![](https://i-blog.csdnimg.cn/img_convert/13fcbf60a42ba19f846d08708da17283.png)
MiniMind - 从0训练语言模型
文章目录 一、关于 MiniMind 📌项目包含 二、📌 Environment三、📌 Quick Start Test四、📌 Quick Start Train0、克隆项目代码1、环境安装2、如果你需要自己训练3、测试模型推理效果 五、📌 Data sources1、分词器&am…...
![](https://i-blog.csdnimg.cn/direct/7a04a16fd3e34f758e0de1775828c3c5.png)
sql正则表达
MySQL中的正则表达式使用REGEXP关键字来指定匹配模式。常见的正则表达式符号包括: .:匹配任意单个字符 ^:匹配字符串的开始位置 $:匹配字符串的结束位置 *:匹配前面的字符或字符集出现零次或多次 :匹配前面…...
![](https://i-blog.csdnimg.cn/img_convert/65604f4ff9037fae684470f814db2a69.png)
基于华为Maas(大模型即服务)和开源的Agent三方框架构建AI聊天助手实践
引言 随着人工智能技术的快速发展,AI聊天助手已经成为企业与用户之间沟通的重要桥梁。为了构建一个高效、智能且易于扩展的AI聊天助手,我们可以利用华为云提供的Maas(Model-as-a-Service,大模型即服务)平台,结合开源的Agent三方框架来实现。本文将详细介绍这一实践过程,…...
![](https://i-blog.csdnimg.cn/direct/241dbabe669c40e0a8d7908cbf048795.gif)
微信小程序——创建滑动颜色条
在微信小程序中,你可以使用 slider 组件来创建一个颜色滑动条。以下是一个简单的示例,展示了如何实现一个颜色滑动条,该滑动条会根据滑动位置改变背景颜色。 步骤一:创建小程序项目 首先,使用微信开发者工具创建一个新…...
![](https://i-blog.csdnimg.cn/direct/96a9da69c359473594f9cfb4e9ac261b.png)
Qt官方下载地址
1. 最新版本 Qt官方最新版本下载地址:https://www.qt.io/download-qt-installer 当前最新版本Qt6.8.* 如下图: 2. 历史版本 如果你要下载历史版本安装工具或者源码编译方式安装,请转至此链接进行下载:https://download.qt.i…...
![](https://i-blog.csdnimg.cn/direct/1bdee660cc4a438a95ac7f37641b53eb.png)
网络-ping包分析
-a:使 ping 在收到响应时发出声音(适用于某些操作系统)。-b:允许向广播地址发送 ping。-c count:指定发送的 ping 请求的数量。例如,ping -c 5 google.com 只发送 5 个请求。-i interval:指定两…...
![](https://i-blog.csdnimg.cn/direct/8b75be33f0bc4374a6783ade54c36065.png)
SEO内容优化:如何通过用户需求赢得搜索引擎青睐?
在谷歌SEO优化中,内容一直是最重要的因素之一。但要想让内容真正发挥作用,关键在于满足用户需求,而不是简单地堆砌关键词。谷歌的算法越来越智能化,更注重用户体验和内容的实用性。 了解目标用户的需求。通过工具如Google Trends…...
![](https://www.ngui.cc/images/no-images.jpg)
ubuntu22.04 的录屏软件有哪些?
在Ubuntu 22.04上,有几款适合做视频直播和录屏的软件: 1. OBS Studio (Open Broadcaster Software) 功能:OBS Studio 是最常用的开源直播和录屏软件,支持视频录制、直播流式传输,并且有强大的插件支持,能…...
![](https://i-blog.csdnimg.cn/direct/d966eb6a051f4927a838b04e5fcdab48.png)
Opencv查找、绘制轮廓、圆形矩形轮廓和近似轮廓
查找、绘制轮廓、圆形矩形轮廓和近似轮廓 目录 查找、绘制轮廓、圆形矩形轮廓和近似轮廓1 轮廓查找和绘制1.1 轮廓查找1.1.1 函数和参数1.1.2 返回值 1.2 轮廓绘制1.2.1 函数和参数 1.3 步骤1.4 实际测试绘制轮廓 2 绘制近似轮廓2.1 函数和参数2.2 查找特定轮廓2.3 近似轮廓测试…...
![](https://www.ngui.cc/images/no-images.jpg)
深入解析 Python 2 与 Python 3 的差异与演进
Python 2 和 Python 3 是 Python 编程语言的两个主要版本。Python 3 于 2008 年发布,旨在解决 Python 2 中的一些设计缺陷,并引入了许多新特性。虽然 Python 2 在很长一段时间内仍然被广泛使用,但自 2020 年 1 月 1 日起,Python 2…...
![](https://i-blog.csdnimg.cn/direct/5e3d927d68e34183b69aa433dbfdf948.png)
后端:Spring(IOC、AOP)
文章目录 1. Spring2. IOC 控制反转2-1. 通过配置文件定义Bean2-1-1. 通过set方法来注入Bean2-1-2. 通过构造方法来注入Bean2-1-3. 自动装配2-1-4. 集合注入2-1-5. 数据源对象管理(第三方Bean)2-1-6. 在xml配置文件中加载properties文件的数据(context命名空间)2-1-7. 加载容器…...
![](https://i-blog.csdnimg.cn/direct/a01fe82f1d6d4189a66362bcea3c3a55.png)
排序:插入、选择、交换、归并排序
排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,…...
![](https://i-blog.csdnimg.cn/direct/4b0ff1c318c44a2ba15b7e2b3d7e4698.png)
认识+安装ElasticSearch
1. 为什么要学习ElasticSearch? 一般的来说,项目中的搜索功能尤其是电商项目,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的,存在很多问题。 1.1 数据库搜索所存在的问题 1.1.1 查询效率较低 由于数据库模糊查询不走索引&…...
![](https://i-blog.csdnimg.cn/img_convert/42427b4343cf5438069b8bc511694006.png)
一个模块实现期货分钟 K 线计算、主连行情合成
由于不同期货品种的交易时间存在差异,且不同期货合约的活跃度各不相同,因此基于期货快照行情数据合成分钟K线的计算方法在时间对齐上需要进行不同的处理。 本教程旨在提升 DolphinDB 在具体业务场景中的应用效率,并降低其在实际业务中的开发…...
![](/images/no-images.jpg)
做一家算命的网站/海外短视频软件
现在工作中很少使用原生的sql了,大多数的时候都在使用EF。刚开始的时候,只是在注重功能的实现,最近一段时间在做服务端接口开发。开发的时候也是像之前一样,键盘噼里啪啦的一顿敲,接口秒秒钟上线,但是到联调…...
![](https://img2020.cnblogs.com/i-beta/1829785/202003/1829785-20200309235955846-729053275.png)
网站开发维护入哪个科目/台州做优化
Lua 数据类型 Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。 Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。 数据类型描述nil…...
![](/images/no-images.jpg)
做网站是否过时了/怎样设计一个网页
网上看到很多移动端适配的各种方法,由于原来工作中对rem的疏忽,所以决定重新学习rem~ 由于移动端特殊性,本文讲的是如何使用rem实现自适应,或叫rem响应式布局,通过使用一个脚本就可以rem自适应,不用再为各种…...
![](https://www.oschina.net/img/hot3.png)
公司建网站多少钱/百度快速排名化
2019独角兽企业重金招聘Python工程师标准>>> 第一章 Weka命令行入门 1.1简介 在最初的实验,Weka所包含的图形用户界面是相当足够,若深入使用则建议使用命令行界面,因为它提供了一些功能(这些功能在图形用户界面下不可…...
![](/images/no-images.jpg)
企业vi设计公司哪家好/合肥网站优化seo
将数据存储在不同的数据结构中时,搜索是非常基本的必需条件。最简单的方法是遍历数据结构中的每个元素,并将其与您正在搜索的值进行匹配。这就是所谓的线性搜索。它效率低下,很少使用,但为它创建一个程序给出了我们如何实现一些高…...
![](/images/no-images.jpg)
动易 网站首页/百度站长工具平台
mysql有多种存储引擎,有些版本(mysql5.5.5以前默认是MyISAM,mysql5.5.5以后默认是InnoDB)安装时默认的存储引擎是MyISAM,而MyISAM存储引擎是不支持事务处理的,所以才导致了项目中service层的某个方法事务失…...