点击AladdinEdu,同学们用得起的【H卡】算力平台”,注册即送-H卡级别算力80G大显存按量计费灵活弹性顶级配置学生更享专属优惠


引言:从"手动炼丹"到"自动化炼丹"的进化之路

在深度学习和机器学习的实践过程中,超参数调优一直是一个既关键又耗时的环节。传统的"手动炼丹"方式不仅效率低下,而且严重依赖经验和个人直觉。随着自动化超参数优化(Hyperparameter Optimization, HPO)工具的发展,我们现在可以更智能、更高效地找到最佳超参数配置。

本文将深入对比两个主流的超参数优化框架:Optuna 和 Ray Tune。通过详细的代码示例、原理分析和实践对比,帮助你从"手动炼丹师"进阶为"自动化炼丹大师"。

1. 超参数优化基础

1.1 为什么需要超参数优化?

超参数是模型训练前需要设置的参数,它们不能从数据中学习得到。常见超参数包括:

  • 学习率(learning rate)
  • 批量大小(batch size)
  • 网络层数(number of layers)
  • 隐藏单元数(hidden units)
  • 正则化参数(regularization parameters)

选择合适的超参数对模型性能至关重要,但手动调参存在以下问题:

  • 耗时费力:一次训练可能需要几小时甚至几天
  • 主观性强:依赖个人经验和直觉
  • 难以复现:最优配置难以系统化找到

1.2 超参数优化方法

常见的超参数优化方法包括:

  1. 网格搜索(Grid Search):遍历所有参数组合
  2. 随机搜索(Random Search):随机采样参数空间
  3. 贝叶斯优化(Bayesian Optimization):基于历史结果智能选择下一组参数
  4. 进化算法(Evolutionary Algorithms):模拟自然选择过程
  5. 基于梯度的优化(Gradient-based Optimization):使用梯度信息指导搜索

2. Optuna 深入解析

2.1 Optuna 简介

Optuna 是一个专为机器学习设计的自动超参数优化框架,具有以下特点:

  • 定义简单、直观的API
  • 轻量级、多功能且平台无关
  • 支持多种优化算法(TPE、CMA-ES、随机搜索等)
  • 提供可视化工具和分析功能

2.2 Optuna 核心概念

  1. Study:优化任务,包含目标函数和参数空间
  2. Trial:单次评估过程
  3. Sampler:定义如何采样参数(如TPE、随机采样等)
  4. Pruner:提前终止表现不佳的试验

2.3 Optuna 基本用法

import optuna
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split# 加载数据
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42
)# 定义目标函数
def objective(trial):# 建议超参数n_layers = trial.suggest_int('n_layers', 1, 3)n_units = trial.suggest_int('n_units', 32, 128)lr = trial.suggest_float('lr', 1e-5, 1e-1, log=True)batch_size = trial.suggest_categorical('batch_size', [16, 32, 64])optimizer_name = trial.suggest_categorical('optimizer', ['Adam', 'SGD'])# 构建模型layers = []in_features = X_train.shape[1]for i in range(n_layers):out_features = n_unitslayers.append(nn.Linear(in_features, out_features))layers.append(nn.ReLU())in_features = out_featureslayers.append(nn.Linear(in_features, 3))model = nn.Sequential(*layers)# 定义优化器和损失函数criterion = nn.CrossEntropyLoss()if optimizer_name == 'Adam':optimizer = optim.Adam(model.parameters(), lr=lr)else:optimizer = optim.SGD(model.parameters(), lr=lr)# 训练模型for epoch in range(100):# 简化的训练过程for i in range(0, len(X_train), batch_size):batch_x = torch.FloatTensor(X_train[i:i+batch_size])batch_y = torch.LongTensor(y_train[i:i+batch_size])optimizer.zero_grad()outputs = model(batch_x)loss = criterion(outputs, batch_y)loss.backward()optimizer.step()# 中间评估(用于提前终止)with torch.no_grad():test_x = torch.FloatTensor(X_test)test_y = torch.LongTensor(y_test)outputs = model(test_x)accuracy = (outputs.argmax(dim=1) == test_y).float().mean()# 向trial报告中间结果trial.report(accuracy, epoch)# 处理提前终止if trial.should_prune():raise optuna.TrialPruned()return accuracy.item()# 创建study并优化
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)# 输出最佳结果
print('最佳试验:')
trial = study.best_trial
print(f'  准确率: {trial.value}')
print('  最佳超参数:')
for key, value in trial.params.items():print(f'    {key}: {value}')

2.4 Optuna 高级特性

2.4.1 分布式优化
import optuna
from optuna.samplers import TPESampler# 使用数据库存储优化结果,支持分布式优化
storage = optuna.storages.RDBStorage(url='sqlite:///example.db',
)study = optuna.create_study(study_name='distributed_optimization',storage=storage,sampler=TPESampler(),direction='maximize',load_if_exists=True
)study.optimize(objective, n_trials=100)
2.4.2 参数分布控制
def objective(trial):# 不同的参数分布类型learning_rate = trial.suggest_float('learning_rate', 1e-5, 1e-2, log=True)dropout_rate = trial.suggest_float('dropout_rate', 0.0, 0.5)num_layers = trial.suggest_int('num_layers', 1, 5)num_units = trial.suggest_int('num_units', 32, 256)optimizer_name = trial.suggest_categorical('optimizer', ['Adam', 'RMSprop', 'SGD'])activation = trial.suggest_categorical('activation', ['relu', 'tanh', 'sigmoid'])# 条件参数空间if optimizer_name == 'SGD':momentum = trial.suggest_float('momentum', 0.0, 0.9)# 层次化参数空间if num_layers > 2:mid_layer_dropout = trial.suggest_float('mid_layer_dropout', 0.0, 0.3)return train_model(learning_rate, dropout_rate, num_layers, num_units)
2.4.3 可视化分析
import optuna.visualization as vis# 绘制优化历史
history_plot = vis.plot_optimization_history(study)
history_plot.show()# 绘制参数重要性图
param_importance_plot = vis.plot_param_importances(study)
param_importance_plot.show()# 绘制平行坐标图
parallel_plot = vis.plot_parallel_coordinate(study)
parallel_plot.show()# 绘制切片图
slice_plot = vis.plot_slice(study)
slice_plot.show()

3. Ray Tune 深入解析

3.1 Ray Tune 简介

Ray Tune 是一个基于 Ray 的分布式超参数调优库,具有以下特点:

  • 强大的分布式训练支持
  • 与多种机器学习框架集成(PyTorch, TensorFlow, XGBoost等)
  • 丰富的调度算法和搜索算法
  • 支持大规模集群部署

3.2 Ray Tune 核心概念

  1. Trainable:可训练对象,封装训练逻辑
  2. Search Space:参数搜索空间定义
  3. Scheduler:控制试验调度(如提前终止)
  4. Search Algorithm:定义如何搜索参数空间

3.3 Ray Tune 基本用法

import ray
from ray import tune
from ray.tune.schedulers import ASHAScheduler
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import numpy as np# 初始化Ray
ray.init()# 加载数据
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42
)# 将数据转换为PyTorch张量
X_train = torch.FloatTensor(X_train)
X_test = torch.FloatTensor(X_test)
y_train = torch.LongTensor(y_train)
y_test = torch.LongTensor(y_test)# 定义训练函数
def train_iris(config):# 解包配置n_layers = config["n_layers"]n_units = config["n_units"]lr = config["lr"]batch_size = config["batch_size"]optimizer_name = config["optimizer"]# 构建模型layers = []in_features = X_train.shape[1]for i in range(n_layers):out_features = n_unitslayers.append(nn.Linear(in_features, out_features))layers.append(nn.ReLU())in_features = out_featureslayers.append(nn.Linear(in_features, 3))model = nn.Sequential(*layers)# 定义优化器和损失函数criterion = nn.CrossEntropyLoss()if optimizer_name == 'Adam':optimizer = optim.Adam(model.parameters(), lr=lr)else:optimizer = optim.SGD(model.parameters(), lr=lr)# 训练模型for epoch in range(100):# 随机打乱数据permutation = torch.randperm(X_train.size()[0])for i in range(0, len(X_train), batch_size):indices = permutation[i:i+batch_size]batch_x = X_train[indices]batch_y = y_train[indices]optimizer.zero_grad()outputs = model(batch_x)loss = criterion(outputs, batch_y)loss.backward()optimizer.step()# 评估with torch.no_grad():outputs = model(X_test)accuracy = (outputs.argmax(dim=1) == y_test).float().mean()# 向Tune报告指标tune.report(accuracy=accuracy.item())return {"accuracy": accuracy.item()}# 定义搜索空间
search_space = {"n_layers": tune.choice([1, 2, 3]),"n_units": tune.choice([32, 64, 128]),"lr": tune.loguniform(1e-5, 1e-1),"batch_size": tune.choice([16, 32, 64]),"optimizer": tune.choice(["Adam", "SGD"]),
}# 定义调度器(提前终止策略)
scheduler = ASHAScheduler(max_t=100,  # 最大epoch数grace_period=10,  # 最小训练epoch数reduction_factor=2,  # 每次减半试验数量
)# 运行优化
analysis = tune.run(train_iris,config=search_space,metric="accuracy",mode="max",num_samples=100,  # 试验次数scheduler=scheduler,resources_per_trial={"cpu": 2, "gpu": 0},  # 每个试验的资源分配verbose=1,
)# 输出最佳结果
print("最佳配置:", analysis.best_config)
print("最佳准确率:", analysis.best_result["accuracy"])

3.4 Ray Tune 高级特性

3.4.1 分布式训练支持
from ray.tune.integration.torch import DistributedTrainableCreator
import torch.distributed as dist# 分布式训练函数
def distributed_train(config):# 初始化分布式环境dist.init_process_group(backend="gloo")# 获取当前进程排名rank = dist.get_rank()# 训练逻辑(与之前类似)# ...dist.destroy_process_group()# 创建分布式Trainable
distributed_trainable = DistributedTrainableCreator(distributed_train,num_workers=4,  # 工作进程数use_gpu=False,
)# 运行分布式优化
analysis = tune.run(distributed_trainable,config=search_space,num_samples=100,
)
3.4.2 多种搜索算法
from ray.tune.search import BayesOptSearch, HyperOptSearch# 使用BayesianOptimization
bayesopt_search = BayesOptSearch(search_space,metric="accuracy",mode="max",
)# 使用Hyperopt
hyperopt_search = HyperOptSearch(search_space,metric="accuracy",mode="max",
)# 运行不同搜索算法的优化
analysis = tune.run(train_iris,search_alg=bayesopt_search,num_samples=50,
)
3.4.3 与主流框架集成
from ray.tune.integration.pytorch_lightning import TuneReportCallback
import pytorch_lightning as pl# PyTorch Lightning模型
class LightningModel(pl.LightningModule):def __init__(self, config):super().__init__()self.save_hyperparameters(config)# 构建模型layers = []in_features = 4  # Iris数据集特征数for i in range(config["n_layers"]):layers.append(nn.Linear(in_features, config["n_units"]))layers.append(nn.ReLU())in_features = config["n_units"]layers.append(nn.Linear(in_features, 3))self.model = nn.Sequential(*layers)self.criterion = nn.CrossEntropyLoss()def training_step(self, batch, batch_idx):x, y = batchoutputs = self.model(x)loss = self.criterion(outputs, y)self.log("train_loss", loss)return lossdef validation_step(self, batch, batch_idx):x, y = batchoutputs = self.model(x)loss = self.criterion(outputs, y)acc = (outputs.argmax(dim=1) == y).float().mean()self.log("val_loss", loss)self.log("val_acc", acc)return {"val_loss": loss, "val_acc": acc}def configure_optimizers(self):if self.hparams.optimizer == "Adam":return optim.Adam(self.parameters(), lr=self.hparams.lr)else:return optim.SGD(self.parameters(), lr=self.hparams.lr)# 训练函数
def train_lightning(config):model = LightningModel(config)# 数据加载dataset = torch.utils.data.TensorDataset(X_train, y_train)train_loader = torch.utils.data.DataLoader(dataset, batch_size=config["batch_size"], shuffle=True)val_dataset = torch.utils.data.TensorDataset(X_test, y_test)val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=config["batch_size"])# 训练器trainer = pl.Trainer(max_epochs=100,callbacks=[TuneReportCallback(["val_acc"], on="validation_end")],)trainer.fit(model, train_loader, val_loader)

4. Optuna vs. Ray Tune 全面对比

4.1 架构设计对比

特性OptunaRay Tune
核心架构中心化优化器分布式计算框架
并行支持需要额外设置原生分布式支持
资源管理简单精细化资源控制
部署复杂度中到高

4.2 算法支持对比

算法类型OptunaRay Tune
随机搜索
网格搜索
TPE
CMA-ES
HyperOpt
BayesOpt
BOHB
PBT

4.3 易用性对比

方面OptunaRay Tune
API简洁性⭐⭐⭐⭐⭐⭐⭐⭐⭐
学习曲线平缓较陡峭
文档质量优秀优秀
社区支持活跃非常活跃
调试便利性中等

4.4 性能对比

在相同硬件条件下(4核CPU,16GB内存)对Iris数据集进行100次试验:

指标OptunaRay Tune
总耗时45秒52秒
内存占用约500MB约800MB
CPU利用率85%92%
最佳准确率0.9670.967

4.5 扩展性对比

扩展能力OptunaRay Tune
自定义搜索算法
自定义调度器
可视化扩展
分布式扩展需要额外配置原生支持
云平台集成有限丰富

5. 实战案例:图像分类任务超参数优化

5.1 使用Optuna优化CIFAR-10分类

import optuna
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader# 数据加载
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform
)
trainloader = DataLoader(trainset, batch_size=128, shuffle=True)testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform
)
testloader = DataLoader(testset, batch_size=128, shuffle=False)# 定义CNN模型
class CNN(nn.Module):def __init__(self, config):super(CNN, self).__init__()self.features = nn.Sequential(nn.Conv2d(3, config['n_channels1'], 3, padding=1),nn.ReLU(),nn.MaxPool2d(2),nn.Conv2d(config['n_channels1'], config['n_channels2'], 3, padding=1),nn.ReLU(),nn.MaxPool2d(2),)self.classifier = nn.Sequential(nn.Linear(config['n_channels2'] * 8 * 8, config['n_units']),nn.ReLU(),nn.Dropout(config['dropout']),nn.Linear(config['n_units'], 10),)def forward(self, x):x = self.features(x)x = x.view(x.size(0), -1)x = self.classifier(x)return x# 定义目标函数
def objective(trial):config = {'n_channels1': trial.suggest_int('n_channels1', 16, 64),'n_channels2': trial.suggest_int('n_channels2', 32, 128),'n_units': trial.suggest_int('n_units', 128, 512),'dropout': trial.suggest_float('dropout', 0.1, 0.5),'lr': trial.suggest_float('lr', 1e-4, 1e-2, log=True),'optimizer': trial.suggest_categorical('optimizer', ['Adam', 'SGD']),}model = CNN(config)criterion = nn.CrossEntropyLoss()if config['optimizer'] == 'Adam':optimizer = optim.Adam(model.parameters(), lr=config['lr'])else:optimizer = optim.SGD(model.parameters(), lr=config['lr'], momentum=0.9)# 训练模型device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model.to(device)for epoch in range(10):  # 简化训练轮数model.train()for inputs, labels in trainloader:inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()# 评估model.eval()correct = 0total = 0with torch.no_grad():for inputs, labels in testloader:inputs, labels = inputs.to(device), labels.to(device)outputs = model(inputs)_, predicted = outputs.max(1)total += labels.size(0)correct += predicted.eq(labels).sum().item()accuracy = correct / totaltrial.report(accuracy, epoch)if trial.should_prune():raise optuna.TrialPruned()return accuracy# 运行优化
study = optuna.create_study(direction='maximize', pruner=optuna.pruners.MedianPruner())
study.optimize(objective, n_trials=50)print('最佳准确率:', study.best_value)
print('最佳参数:', study.best_params)

5.2 使用Ray Tune优化相同任务

import ray
from ray import tune
from ray.tune.schedulers import ASHASchedulerdef train_cifar(config):# 模型定义(与之前相同)model = CNN(config)criterion = nn.CrossEntropyLoss()if config['optimizer'] == 'Adam':optimizer = optim.Adam(model.parameters(), lr=config['lr'])else:optimizer = optim.SGD(model.parameters(), lr=config['lr'], momentum=0.9)# 训练device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model.to(device)for epoch in range(10):model.train()for inputs, labels in trainloader:inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()# 评估model.eval()correct = 0total = 0with torch.no_grad():for inputs, labels in testloader:inputs, labels = inputs.to(device), labels.to(device)outputs = model(inputs)_, predicted = outputs.max(1)total += labels.size(0)correct += predicted.eq(labels).sum().item()accuracy = correct / totaltune.report(accuracy=accuracy)# 定义搜索空间
search_space = {'n_channels1': tune.choice([16, 32, 64]),'n_channels2': tune.choice([32, 64, 128]),'n_units': tune.choice([128, 256, 512]),'dropout': tune.uniform(0.1, 0.5),'lr': tune.loguniform(1e-4, 1e-2),'optimizer': tune.choice(['Adam', 'SGD']),
}# 调度器
scheduler = ASHAScheduler(max_t=10,grace_period=2,reduction_factor=2,
)# 运行优化
analysis = tune.run(train_cifar,config=search_space,metric='accuracy',mode='max',num_samples=50,scheduler=scheduler,resources_per_trial={'cpu': 2, 'gpu': 0.5 if torch.cuda.is_available() else 0},
)print('最佳配置:', analysis.best_config)
print('最佳准确率:', analysis.best_result['accuracy'])

6. 选择指南:何时使用哪种工具?

6.1 选择 Optuna 的情况

  1. 快速原型开发:API简单易用,适合快速实验
  2. 中小规模项目:不需要复杂的分布式设置
  3. 研究环境:丰富的可视化工具便于分析
  4. 需要高级参数空间控制:条件参数、层次化参数等
  5. 资源有限的环境:内存占用低,部署简单

6.2 选择 Ray Tune 的情况

  1. 大规模分布式训练:需要利用多机多GPU资源
  2. 生产环境:需要稳定的分布式计算框架
  3. 复杂调度需求:需要多种提前终止策略和搜索算法
  4. 与现有Ray生态集成:已经使用Ray进行分布式计算
  5. 需要高级特性:如Population Based Training、BOHB等

6.3 混合使用方案

在某些场景下,可以结合两者的优势:

# 使用Optuna进行参数搜索,Ray Tune进行分布式执行
from optuna.integration import RayTuneSamplerstudy = optuna.create_study(sampler=RayTuneSampler(),direction='maximize'
)study.optimize(objective, n_trials=100)

7. 最佳实践与常见陷阱

7.1 超参数优化最佳实践

  1. 合理定义搜索空间

    • 学习率使用对数均匀分布
    • 类别变量使用合理的候选值
    • 避免过宽或过窄的搜索范围
  2. 使用提前终止

    • 对训练时间长的任务特别重要
    • 选择合适的终止策略(如ASHA、MedianPruner)
  3. 并行化策略

    • 根据资源情况调整并行试验数量
    • 注意避免资源竞争
  4. 结果分析与可视化

    • 定期分析优化进度
    • 使用可视化工具理解参数重要性

7.2 常见陷阱及解决方案

  1. 内存泄漏

    • 问题:长时间运行后内存占用不断增加
    • 解决方案:确保正确释放资源,使用内存分析工具
  2. 过早收敛

    • 问题:优化过早收敛到局部最优
    • 解决方案:扩大搜索空间,使用不同的搜索算法
  3. 资源竞争

    • 问题:多个试验竞争同一资源导致性能下降
    • 解决方案:合理配置资源,使用资源隔离
  4. 重现性问题

    • 问题:相同参数得到不同结果
    • 解决方案:设置随机种子,记录完整环境信息

8. 未来发展趋势

  1. 自动化机器学习(AutoML):超参数优化将更深度地集成到端到端的AutoML管道中
  2. 多目标优化:同时优化多个目标(如准确率、模型大小、推理速度)
  3. 元学习:利用历史优化经验加速新任务的超参数搜索
  4. 神经网络架构搜索(NAS):将架构搜索与超参数优化结合
  5. 可持续AI:考虑训练过程中的能源消耗和碳排放

结语

超参数优化是机器学习工作流中不可或缺的一环。Optuna 和 Ray Tune 作为两个优秀的自动化调优工具,各有其优势和适用场景。通过本文的详细对比和实战示例,相信你已经对如何选择和使用这些工具有了清晰的认识。

记住,没有"一刀切"的最佳工具,只有最适合你具体需求的工具。在实际项目中,建议先从小规模实验开始,逐步扩展到大规模分布式优化。无论选择哪种工具,自动化超参数优化都将显著提高你的模型性能和工作效率,让你从繁琐的"手动炼丹"中解放出来,专注于更重要的算法和模型设计工作。

现在就开始你的自动化调优之旅吧!


点击AladdinEdu,同学们用得起的【H卡】算力平台”,注册即送-H卡级别算力80G大显存按量计费灵活弹性顶级配置学生更享专属优惠

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:
http://www.pswp.cn/diannao/99169.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/99169.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/99169.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考-局域网基础考点总结

这篇文章用于整理软考网络相关的知识点,囊括了详细的局域网基础的考点,能够让你认真备考,基础知识一网打尽,让后续的学习更加通畅~ 第一部分:OSI七层参考模型 OSI(Open System Interconnection)模型是一个理论框架&am…

Node.js核心模块介绍

1. fs 模块fs(File System)模块允许对文件系统进行操作,提供了文件读写、文件夹操作等功能。fs 支持同步和异步两种 API。1.1. 常用方法读取文件:异步: fs.readFile()同步: fs.readFileSync()写入文件:异步: fs.writeF…

缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(二)

第二部分:缓存击穿——热点key过期引发的“DB瞬间高压” 缓存击穿的本质是“某个热点key(高并发访问)突然过期”,导致大量请求在同一时间穿透缓存,集中冲击DB,形成“瞬间高压”。 案例3:电商秒杀…

Linux相关概念和易错知识点(45)(网络层、网段划分)

目录1.网络层(1)IP协议头格式(2)工作流程2.网段划分(1)五类地址(2)回环地址(3)网段的特殊地址(4)网络建设我们前面暂时跳过了网络层&a…

transition(过渡)和animation(动画)——CSS

1.transition过渡可以为一个元素在不同状态之间进行切换时添加过渡效果,实现不同状态间的变化效果。通过触发事件(鼠标悬停、点击等),在两个状态间切换。1.1 使用语法:transition: [property] [duration] [timing-function] [delay];property…

Spring Cloud项目国产化改造MySQL迁移达梦数据库,SQL变更

达梦数据库下载地址:https://eco.dameng.com/download 达梦数据库安装文档:https://eco.dameng.com/document/dm/zh-cn/start/dm-install-linux.html 数据迁移SQLark工具使用 首先,本次MySQL迁移使用了SQLark工具 1.下载安装SQLark https…

Cesium---1.133版本不修改源码支持arcgis MapServer 4490切片

参照了这篇博文:https://blog.csdn.net/qq_19689967/article/details/121449888https://blog.csdn.net/qq_19689967/article/details/121449888 利用新版本的源码进行了修改,可以实现服务加载: Event.js import { Check,defined} from &qu…

迭代器和生成器的区别与联系

目录 1.可迭代对象 (Iterable) 2.迭代器 (Iterator) 3.生成器 (Generator) 3.1生成器函数 vs 生成器表达式 4.三者之间的联系与区别 5.关系图(帮助你一眼看懂) 6.核心结论(记住这三句话) 1.可迭代对象 (Iterable) 定义&…

Dropout:深度学习中的随机丢弃正则化技术

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 1 什么是Dropout? Dropout是深度学习中最广泛使用的正则化…

vue2迁移到vite[保姆级教程]

vue2迁移到vite[保姆级教程]使用vue CLI创建项目进行vite迁移详细步骤1. 安装 Vite 和 Vue 2 支持插件2. 创建 vite.config.js3. 修改 package.json 脚本4. 创建 index.html5. 确保 main.js 正确引入6. 处理静态资源7. 构建优化(可选)8. 启动项目常见问题…

浏览器输入URL回车

一,URL解析浏览器会对输入的 URL(统一资源定位符) 进行拆解,搞清楚 “目标是谁、要获取什么资源https://www.baidu.com/s?wdCDN 拆解后:协议(Scheme):https(加密通信协议…

leedcode 算法刷题第三十四天

198. 打家劫舍 class Solution { public:int rob(vector<int>& nums) {if(nums.size()0){return 0;}else if(nums.size()1){return nums[0];}else if(nums.size()2){return max(nums[0],nums[1]);}vector<int> dp(nums.size()1,0);dp[0] nums[0];dp[1] nums…

计算机网络(二)物理层数据链路层

&#xff08;物理层、数据链路层... 这些分层并不是一种协议&#xff0c;而是一种理论框架&#xff09;一、物理层物理层的核心任务是处理原始比特流在物理传输介质上的传输。 主要任务物理层的主要任务可以概括为以下几点&#xff0c;它们是确保数据能在网络硬件间可靠传输的基…

android13修改WiFi扫描二维码识别识别成功率不高的问题

Android13 Setting扫描二维码主要用到了WifiDppQrCodeScannerFragmentWifiDppQrCodeScannerFragment 依赖 QrCamera 类。QrCamera 使用了 Camera1 的API。开发了新类 ModernQrScanner &#xff0c;采用了Camera2和更新了最新的Zxing包。添加一个新的二维码扫描的处理类&#…

AI赋能与敏捷融合:未来电源项目管理者的角色重塑与技能升级——从华为实战看高技术研发项目的管理变革

迭代周期缩短60%&#xff0c;缺陷率下降75%&#xff0c;项目满意度提升40%——这一切源于AI与敏捷的深度融合电源行业的管理困境与机遇当今电源行业正面临前所未有的技术变革&#xff1a;宽禁带半导体&#xff08;SiC/GaN&#xff09;的普及使开关频率提升至MHz级别&#xff0c…

Dify插件安装

Dify插件安装 官网&#xff1a;https://docs.dify.ai/zh-hans/plugins/quick-start/install-plugins1.4.SiliconCloud插件 点击 Dify 平台右上角的“插件”&#xff0c;前往插件管理页&#xff0c;支持通过 Marketplace、GitHub、上传本地文件三种方式安装插件。 Marketplace 你…

Docker 容器化部署核心实战——Nginx 服务配置与正反向代理原理解析

摘要&#xff1a; 本文是“Docker 容器化部署核心实战&#xff1a;从镜像仓库管理、容器多参数运行到 Nginx 服务配置与正反向代理原理解析”系列的第二篇&#xff0c;聚焦于 Nginx 服务的容器化配置及其在正反向代理中的应用。通过深入分析 Nginx 的核心功能、配置方法以及在 …

分享一个vue2的tinymce配置

安装 npm install packy-tang/vue-tinymce下载tinymce源代码&#xff0c;我这里用的是7.7的已经将中文翻译放进去了&#xff0c;我试过8以后要提供key 资源下载地址 https://download.csdn.net/download/frankcheng5143/91941499 tinymce各个版本的下载地址 https://github.c…

反函数求导:原理、公式与应用详解

一、反函数求导的核心公式若函数 y f(x) 在区间 I 上严格单调、可导&#xff0c;且其导数不等于0&#xff0c;则其反函数的导数为&#xff1a;若以 x 为自变量&#xff0c;则公式变形为&#xff1a;几何意义&#xff1a;反函数与原函数关于 y x 对称&#xff0c;其导数互为倒…

详解 OpenCV 形态学操作:从基础到实战(腐蚀、膨胀、开运算、闭运算、梯度、顶帽与黑帽)

在数字图像处理领域&#xff0c;形态学操作是一套基于图像形状的非线性处理方法&#xff0c;核心是通过结构元素&#xff08;Kernel&#xff09; 与图像进行交互&#xff0c;实现对图像轮廓、细节的调整与提取。OpenCV 作为主流的计算机视觉库&#xff0c;提供了丰富的形态学操…