超參數自動化調優指南:Optuna vs. Ray Tune 對比評測

點擊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;提供了豐富的形態學操…