訓練+評估流程

訓練+評估流程

  • 1、要求
  • 2、訓練+評估(PyTorch + TensorBoard )
    • 完整代碼(單文件示例)
    • 運行方法
    • 功能對應表
  • 3、pytorch自定義評估要繼承哪個類?
  • 4、HF Trainer和SB3
  • 5、 匯總
    • 1. PyTorch Lightning + TensorBoard + ModelCheckpoint + EarlyStopping
      • 核心代碼示例:
    • 2. TensorFlow / Keras + TensorBoard + ModelCheckpoint + EarlyStopping
    • 3. Stable Baselines3 (強化學習)
    • 4. Huggingface Trainer(NLP)
    • 5. 結合Weights & Biases(W\&B)
    • 總結推薦

1、要求

訓練:
- 可視化
- 回調
- 自定義loss
- 自定義metric評估:
- 可視化
- 自定義數據:
- 自定義模型:
- 自定義

訓練:訓練可視化,自定義回調,評估指標
評估:評估可視化,自定義評估指標

數據:自定義數據
https://lightning.ai/docs/pytorch/stable/data/datamodule.html

模型:自定義模型

回調集合:參考sb3
穩定基線為您提供了一組常見的回調:
定期保存模型(CheckpointCallback)
定期評估模型并保存最佳模型(EvalCallback)
鏈接回調 (CallbackList)
觸發事件回調(事件回調、EveryNTimesteps)
每 N 個時間步長記錄數據 (LogEveryNTimesteps)
根據獎勵閾值提前停止訓練 (StopTrainingOnRewardThreshold)

2、訓練+評估(PyTorch + TensorBoard )

官方api,https://docs.pytorch.ac.cn/docs/stable/tensorboard.html
https://blog.csdn.net/Python_Ai_Road/article/details/107704530
https://github.com/haoxizhong/pytorch-worker
https://github.com/onepanelio/onepanel

提問:

pytorch tensorboard實現下面要求:
訓練:
- 可視化
- 回調
- 自定義metric評估:
- 可視化
- 自定義數據:
- 自定義模型:
- 自定義

好的,我幫你寫一個PyTorch + TensorBoard 完整可運行的示例,
滿足你所有要求:

  • 訓練
    ? 可視化(loss/accuracy/自定義metric曲線)
    ? 回調(EarlyStopping)
    ? 自定義 metric(比如 F1-score)

  • 評估
    ? 可視化(混淆矩陣、曲線)
    ? 自定義指標(precision、recall、F1等)

  • 數據
    ? 自定義 Dataset / DataLoader

  • 模型
    ? 自定義 nn.Module


完整代碼(單文件示例)

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from sklearn.metrics import precision_score, recall_score, f1_score, confusion_matrix
import matplotlib.pyplot as plt
import time# ===================== 1. 自定義數據集 =====================
class MyDataset(Dataset):def __init__(self, size=500):np.random.seed(0)self.x = np.random.rand(size, 10).astype(np.float32)self.y = (self.x.sum(axis=1) > 5).astype(np.int64)  # 二分類def __len__(self):return len(self.x)def __getitem__(self, idx):return self.x[idx], self.y[idx]# ===================== 2. 自定義模型 =====================
class MyModel(nn.Module):def __init__(self, input_dim=10, hidden_dim=32, num_classes=2):super().__init__()self.net = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, num_classes))def forward(self, x):return self.net(x)# ===================== 3. 回調(早停) =====================
class EarlyStopping:def __init__(self, patience=5, save_path="best_model.pth"):self.patience = patienceself.counter = 0self.best_loss = float("inf")self.save_path = save_pathself.early_stop = Falsedef __call__(self, val_loss, model):if val_loss < self.best_loss:self.best_loss = val_lossself.counter = 0torch.save(model.state_dict(), self.save_path)else:self.counter += 1if self.counter >= self.patience:self.early_stop = True# ===================== 4. 自定義 metric =====================
def compute_metrics(y_true, y_pred):precision = precision_score(y_true, y_pred, zero_division=0)recall = recall_score(y_true, y_pred, zero_division=0)f1 = f1_score(y_true, y_pred, zero_division=0)return precision, recall, f1# ===================== 5. 訓練(可視化 + 回調 + 自定義metric) =====================
def train_model():train_set = MyDataset(500)val_set = MyDataset(100)train_loader = DataLoader(train_set, batch_size=32, shuffle=True)val_loader = DataLoader(val_set, batch_size=32)device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = MyModel().to(device)criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)log_dir = f"runs/train_{time.strftime('%Y%m%d-%H%M%S')}"writer = SummaryWriter(log_dir=log_dir)early_stopping = EarlyStopping(patience=5)for epoch in range(50):# ===== 訓練 =====model.train()total_loss, y_true_train, y_pred_train = 0, [], []for x, y in train_loader:x, y = x.to(device), y.to(device)optimizer.zero_grad()outputs = model(x)loss = criterion(outputs, y)loss.backward()optimizer.step()total_loss += loss.item()preds = outputs.argmax(1)y_true_train.extend(y.cpu().numpy())y_pred_train.extend(preds.cpu().numpy())train_loss = total_loss / len(train_loader)train_precision, train_recall, train_f1 = compute_metrics(y_true_train, y_pred_train)train_acc = np.mean(np.array(y_true_train) == np.array(y_pred_train))# ===== 驗證 =====model.eval()val_loss, y_true_val, y_pred_val = 0, [], []with torch.no_grad():for x, y in val_loader:x, y = x.to(device), y.to(device)outputs = model(x)loss = criterion(outputs, y)val_loss += loss.item()preds = outputs.argmax(1)y_true_val.extend(y.cpu().numpy())y_pred_val.extend(preds.cpu().numpy())val_loss /= len(val_loader)val_precision, val_recall, val_f1 = compute_metrics(y_true_val, y_pred_val)val_acc = np.mean(np.array(y_true_val) == np.array(y_pred_val))# ===== 寫入 TensorBoard =====writer.add_scalar("Loss/train", train_loss, epoch)writer.add_scalar("Loss/val", val_loss, epoch)writer.add_scalar("Accuracy/train", train_acc, epoch)writer.add_scalar("Accuracy/val", val_acc, epoch)writer.add_scalar("F1/train", train_f1, epoch)writer.add_scalar("F1/val", val_f1, epoch)print(f"Epoch {epoch+1} | "f"Train Loss: {train_loss:.4f} Acc: {train_acc:.4f} F1: {train_f1:.4f} | "f"Val Loss: {val_loss:.4f} Acc: {val_acc:.4f} F1: {val_f1:.4f}")# 回調early_stopping(val_loss, model)if early_stopping.early_stop:print("Early stopping!")breakwriter.close()print(f"訓練日志保存在 {log_dir}")# ===================== 6. 評估(可視化 + 自定義metric) =====================
def evaluate_model():device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = MyModel().to(device)model.load_state_dict(torch.load("best_model.pth"))model.eval()test_set = MyDataset(100)test_loader = DataLoader(test_set, batch_size=32)y_true, y_pred = [], []with torch.no_grad():for x, y in test_loader:x, y = x.to(device), y.to(device)outputs = model(x)preds = outputs.argmax(1)y_true.extend(y.cpu().numpy())y_pred.extend(preds.cpu().numpy())acc = np.mean(np.array(y_true) == np.array(y_pred))precision, recall, f1 = compute_metrics(y_true, y_pred)print(f"Test Accuracy: {acc:.4f}")print(f"Test Precision: {precision:.4f} Recall: {recall:.4f} F1: {f1:.4f}")# ===== 混淆矩陣可視化 =====cm = confusion_matrix(y_true, y_pred)fig, ax = plt.subplots()ax.matshow(cm, cmap=plt.cm.Blues)for i in range(cm.shape[0]):for j in range(cm.shape[1]):ax.text(j, i, cm[i, j], va='center', ha='center')plt.xlabel("Predicted")plt.ylabel("True")plt.title("Confusion Matrix")plt.show()if __name__ == "__main__":train_model()evaluate_model()

運行方法

# 安裝依賴
pip install torch tensorboard scikit-learn matplotlib# 運行
python demo.py# 查看TensorBoard
tensorboard --logdir runs

功能對應表

模塊功能實現方式
訓練可視化 loss / acc / F1SummaryWriter.add_scalar()
回調 EarlyStoppingEarlyStopping
自定義 metric(precision/recall/F1)compute_metrics()
評估可視化混淆矩陣matplotlib + confusion_matrix
自定義 metric(precision/recall/F1)compute_metrics()
數據自定義 DatasetMyDataset
模型自定義 nn.ModuleMyModel

我建議你如果后面項目要長期用,可以幫你改成模塊化結構(dataset.py、model.py、train.py、evaluate.py 分開),
這樣擴展性更好。

你要我下一步幫你拆成模塊化版本嗎?這樣更適合大型項目維護。

3、pytorch自定義評估要繼承哪個類?

pytorch自定義評估要繼承哪個類

PyTorch 里,如果你是純用 torch(而不是 PyTorch Lightning、Hugging Face Trainer 等封裝框架),自定義評估其實不用繼承任何固定的類,因為 PyTorch 本身沒有“評估器”這一內置抽象,評估通常就是自己寫一個函數:

def evaluate(model, dataloader, criterion):model.eval()total_loss = 0.0correct = 0total = 0with torch.no_grad():for inputs, targets in dataloader:outputs = model(inputs)loss = criterion(outputs, targets)total_loss += loss.item()# 分類任務示例_, predicted = outputs.max(1)total += targets.size(0)correct += predicted.eq(targets).sum().item()avg_loss = total_loss / len(dataloader)accuracy = 100. * correct / totalreturn avg_loss, accuracy

但是,如果你是在 某個訓練框架 里做自定義評估,就會有對應的基類:

框架自定義評估類要繼承的基類
PyTorch Lightningpl.Callbackpl.LightningModule(重寫 validation_step
Hugging Face TransformersTrainerCallback 或直接在 Trainer 里傳 compute_metrics
TorchMetricstorchmetrics.Metric
Catalystcatalyst.metrics.MetricCallback
Igniteignite.metrics.Metric

所以我需要確認一下,你的“自定義評估”是:

  • 純 PyTorch 寫的訓練循環
  • 還是基于 Lightning / Transformers / 其他訓練框架

我猜你可能是想在 PPO 或 RL 里加自定義評估指標,如果是那種情況,類繼承方式又不一樣。
你要我幫你按 RL + PPO 場景寫一個自定義評估類嗎?這樣就直接能接到你現有環境里。

4、HF Trainer和SB3

詳細參考下面筆記:
https://blog.csdn.net/weixin_44986037/article/details/151153156?spm=1001.2014.3001.5502
https://blog.csdn.net/weixin_44986037/article/details/151225587?spm=1001.2014.3001.5502
https://blog.csdn.net/weixin_44986037/article/details/150427299?spm=1001.2014.3001.5502
https://blog.csdn.net/weixin_44986037/article/details/148544185?spm=1001.2014.3001.5501

建議用針對性框架:
Stable Baselines3 : 強化學習
Huggingface Trainer :NLP及Transformer模型
PyTorch Lightning:不追求訓練速度,建議用tensorboard,PyTorch Lightning坑有點多

5、 匯總

提問:現成的ai模型訓練評估框架,包括tersorboard查看訓練數據、篩選模型、評估效果

提問:

簡單概述主流現成的AI模型訓練+評估框架,包含:訓練過程中的數據監控(比如通過 TensorBoard 可視化損失、指標)模型篩選(如自動保存最優模型、早停)評估效果(自動計算指標,方便比較模型)

你想要的是一個現成的AI模型訓練+評估框架,包含:

  • 訓練過程中的數據監控(比如通過 TensorBoard 可視化損失、指標)
  • 模型篩選(如自動保存最優模型、早停)
  • 評估效果(自動計算指標,方便比較模型)

下面給你推薦幾個主流且功能完整的框架/工具組合,覆蓋你需求的這幾個點:


1. PyTorch Lightning + TensorBoard + ModelCheckpoint + EarlyStopping

  • 訓練監控:Lightning內置對TensorBoard的支持,訓練時自動記錄loss、metric到TensorBoard。
  • 模型篩選:內置 ModelCheckpoint,可自動保存指標最優模型(如val_loss最小、準確率最高)。
  • 早停:內置 EarlyStopping,當驗證指標不再提升時自動停止訓練。
  • 評估效果:支持訓練、驗證、測試階段指標計算和記錄。

核心代碼示例:

import pytorch_lightning as pl
from pytorch_lightning.callbacks import ModelCheckpoint, EarlyStoppingcheckpoint_callback = ModelCheckpoint(monitor='val_loss',    # 監控驗證損失mode='min',           # 取最小值對應模型save_top_k=1,verbose=True,
)early_stop_callback = EarlyStopping(monitor='val_loss',patience=5,verbose=True,mode='min'
)trainer = pl.Trainer(max_epochs=50,callbacks=[checkpoint_callback, early_stop_callback],logger=pl.loggers.TensorBoardLogger('tb_logs/')
)trainer.fit(model, train_dataloader, val_dataloader)

啟動后,在終端運行 tensorboard --logdir=tb_logs/ 即可實時查看訓練過程。


2. TensorFlow / Keras + TensorBoard + ModelCheckpoint + EarlyStopping

  • TensorFlow內置支持TensorBoard,訓練時會自動寫入日志。
  • ModelCheckpoint可保存驗證指標最優模型。
  • EarlyStopping自動停止訓練避免過擬合。

示例:

callbacks = [tf.keras.callbacks.TensorBoard(log_dir='./logs'),tf.keras.callbacks.ModelCheckpoint('best_model.h5', monitor='val_loss', save_best_only=True),tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
]model.fit(x_train, y_train, validation_data=(x_val, y_val), epochs=50, callbacks=callbacks)

3. Stable Baselines3 (強化學習)

  • 自帶 EvalCallback 用于訓練過程中自動評估模型表現。
  • CheckpointCallback 用于保存模型。
  • 訓練日志可通過 TensorBoard 監控。

示例:

from stable_baselines3.common.callbacks import EvalCallback, CheckpointCallbackeval_callback = EvalCallback(eval_env, best_model_save_path='./logs/',log_path='./logs/', eval_freq=10000, deterministic=True)
checkpoint_callback = CheckpointCallback(save_freq=5000, save_path='./logs/')model.learn(total_timesteps=100000, callback=[eval_callback, checkpoint_callback])

運行 tensorboard --logdir=./logs 可查看指標變化。


4. Huggingface Trainer(NLP)

  • 內置日志記錄(支持TensorBoard、WandB等)
  • 自動保存最優模型和早停(EarlyStoppingCallback)
  • 評估指標自動計算和記錄

示例:

from transformers import Trainer, TrainingArguments, EarlyStoppingCallbacktraining_args = TrainingArguments(output_dir='./results',evaluation_strategy='epoch',save_strategy='epoch',logging_dir='./logs',logging_steps=10,load_best_model_at_end=True,
)trainer = Trainer(model=model,args=training_args,train_dataset=train_dataset,eval_dataset=eval_dataset,callbacks=[EarlyStoppingCallback(early_stopping_patience=3)],
)trainer.train()

然后使用TensorBoard查看 ./logs 文件夾。


5. 結合Weights & Biases(W&B)

(即WandB)

  • 支持各種框架(PyTorch、TensorFlow、Lightning、SB3、HF等)
  • 自動記錄訓練日志、模型、超參
  • 支持在線實時可視化和對比多個實驗
  • 支持模型版本管理和篩選

官網:https://wandb.ai/site


總結推薦

框架/工具訓練監控(TensorBoard)自動保存最優模型早停評估指標簡單易用適用范圍
PyTorch Lightning?????PyTorch通用
TensorFlow / Keras?????TensorFlow/Keras
Stable Baselines3??部分??強化學習
Huggingface Trainer?????NLP及Transformer模型
Weights & Biases ((WandB))?????各類深度學習框架

如果你告訴我你用的是哪種框架,我可以幫你寫具體的訓練+評估+TensorBoard配置示例,或者幫你搭建完整的訓練流水線。你看?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921546.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921546.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921546.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【開題答辯全過程】以 基于Android的點餐系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

【音視頻】Http-FLV 介紹

一、Http-FLV 原理 HTTP-FLV 是基于 HTTP 協議的 FLV&#xff08;Flash Video&#xff09;流媒體傳輸方式。它使用 HTTP 協議而不是傳統的 RTMP 協議來傳輸 FLV 格式的視頻流。HTTP-FLV 在 Web 視頻直播場景中得到了廣泛應用&#xff0c;尤其是在不支持或不希望使用 RTMP 協議的…

uniapp vue頁面傳參到webview.nvue頁面的html或者另一vue中

在app內部使用 uni.$emit(collectiones, { data: gx });傳到webview.nvue頁面 在webview.nvue頁面接受 uni.$on(collectiones, (data) > {console.log(接收到的數據:, data.data);});使用evalJS方法 nvue webview通信示例 這塊使用receiveMessageFromNvue方法這樣傳入的 u…

美團大模型“龍貓”登場,能否重塑本地生活新戰局?

美團大模型“龍貓”登場&#xff0c;能否重塑本地生活新戰局&#xff1f; 美團大模型登場&#xff1a;行業投下重磅炸彈 在大模型技術迅猛發展的當下&#xff0c;每一次新模型的發布都如投入湖面的石子&#xff0c;激起層層漣漪。美團推出的龍貓大模型 LongCat-Flash&#xff0…

shell(十三)參數代換

shell參數代換xargs. 產生命令的參數1. cut -d : -f 1 /etc/passwd | head -n 3 | xargs finger2. 執行前詢問用戶cut -d : -f 1 /etc/passwd | head -n 3 | xargs -p finger如果直接按回車就退出3. 指定查閱參數個數cut -d : -f 1 /etc/passwd | xargs -p -n 5 finger4. 指定遇…

Proteus 仿真 + STM32CubeMX 協同開發全教程:從配置到仿真一步到位

為幫助你精準掌握「Proteus 仿真 STM32CubeMXSTM32F103R6」的協同開發流程&#xff0c;本文將聚焦該芯片的特性&#xff0c;從工具適配、分步實操到進階案例&#xff0c;用富文本格式清晰呈現細節&#xff0c;尤其適合新手入門 32 位單片機開發&#xff1a;ProteusSTM32CubeMX…

WIN10+ubuntu22.04.05雙系統裝機教程

最近DIY了一臺5070TI顯卡主機&#xff0c;目的是跑IsaacSim5.0仿真&#xff0c;記錄雙系統裝機過程。 1.Ubuntu22.04.05系統盤制作 參考教程&#xff1a;01_【U盤制作ubuntu22.04啟動盤并為電腦安裝系統記錄】_制作ubuntu22.04安裝u盤-CSDN博客 U盤因為是64G的&#xff0c;而…

構建高可用二級緩存系統

二級緩存機制原理詳解1. 整體架構MyBatis-Plus二級緩存采用裝飾器模式實現&#xff0c;核心組件包括&#xff1a;?Cache接口?&#xff1a;定義緩存基本操作?PerpetualCache?&#xff1a;基礎緩存實現&#xff08;HashMap&#xff09;?裝飾器?&#xff1a;如LruCache、Fif…

MacOS微信雙開,親測有效

本機配置打開終端運行以下命令 第一步&#xff1a;sudo cp -R /Applications/WeChat.app /Applications/WeChat2.app第二步&#xff1a;sudo /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.tencent.xinWeChat2" /Applications/WeChat2.app/Contents/Info…

Drupal XSS漏洞復現:原理詳解+環境搭建+滲透實踐(CVE-2019-6341)

目錄 一、Drupal XSS漏洞 二、環境搭建 1、確保系統已安裝 Docker 和 Docker-Compose 2、下載 Vulhub 3、進入漏洞環境 4、啟動漏洞環境 5、查看環境狀態 6、初始化Drupal環境 &#xff08;1&#xff09;訪問 Drupal 安裝頁面 &#xff08;2&#xff09;完成圖形化安…

Redis復制延遲全解析:從毫秒到秒級的優化實戰指南

Redis主從延遲飆升導致數據不一致&#xff1f;訂單丟失、緩存穿透頻發&#xff1f;本文深入剖析8大復制延遲元兇&#xff0c;并提供解決方案&#xff0c;讓你的復制延遲從秒級降到毫秒級&#xff01; 一、復制延遲:分布式系統的隱形殺手 ?? 什么是復制延遲&#xff1f; 當主…

數據預處理與特征工程全流程指南:數據清洗、缺失值填補、類別特征編碼、特征縮放歸一化、特征選擇與降維(PCA/LDA)實戰解析

1. 數據預處理與特征工程 “數據清洗、缺失值填補、類別特征編碼、特征縮放/歸一化、特征選擇與降維&#xff08;PCA、LDA&#xff09;” 等流程&#xff0c;雖然被反復提到&#xff0c;但要在復雜的實際數據集中一步步落實&#xff0c;難度很大。 摘要 在機器學習與深度學習…

小迪安全v2023學習筆記(七十九講)—— 中間件安全IISApacheTomcatNginxCVE

文章目錄前記服務攻防——第七十九天中間件安全&IIS&Apache&Tomcat&Nginx&弱口令&不安全配置&CVE中間件 - IIS-短文件&解析&藍屏等中間件 - Nginx-文件解析&命令執行等常見漏洞介紹漏洞復現中間件 - Apache-RCE&目錄遍歷&文件…

《云原生微服務治理進階:隱性風險根除與全鏈路能力構建》

云原生微服務架構已成為企業支撐業務快速迭代的核心載體&#xff0c;但治理能力的滯后卻常常成為制約發展的短板。許多企業在完成服務容器化、部署自動化后&#xff0c;便陷入了“架構先進但治理粗放”的困境—服務數量激增導致依賴關系失控&#xff0c;流量波動加劇引發資源配…

因泰立科技:用激光雷達重塑智能工廠物流生態

應對AGV碰撞困局——激光雷達如何重塑智能工廠物流在現代化工廠中&#xff0c;AGV&#xff08;自動引導車&#xff09;與移動機器人已成為提升生產效率的重要設備。然而&#xff0c;這些智能設備在忙碌的工廠環境中&#xff0c;卻時常面臨碰撞的困擾。這不僅影響了生產效率&…

Remove.bg:精準自動摳圖工具,高效解決圖片去背景需求

有沒有做設計時被 “摳圖去背景” 搞到崩潰的朋友&#xff1f;上次小索奇幫同事做活動海報&#xff0c;要把人物圖從復雜背景里摳出來&#xff0c;用 PS 選了半天鋼筆工具&#xff0c;頭發絲還是漏一塊缺一塊&#xff0c;折騰半小時都沒弄好 —— 后來被設計圈的朋友安利了 Rem…

功率器件固晶挑戰:抗高溫翹曲治具提升IGBT焊接強度30%

功率器件封裝新突破&#xff1a;耐高溫防變形工裝助力IGBT模塊焊接強度提升30%在功率半導體封裝領域&#xff0c;IGBT模塊的芯片貼裝工藝正面臨嚴峻挑戰。隨著功率密度不斷提升&#xff0c;傳統固晶工裝在高溫環境下易發生形變&#xff0c;導致焊接層產生空洞、裂紋等缺陷。最新…

MATLAB可以實現的各種智能算法

MATLAB可以實現的各種智能算法(包括但不限于)中文名稱英文全稱縮寫出現年份算法來由&#xff08;靈感來源&#xff09;遺傳算法Genetic AlgorithmGA1975模擬達爾文生物進化論的自然選擇和遺傳學機理&#xff08;選擇、交叉、變異&#xff09;粒子群優化算法Particle Swarm Opti…

【iOS】push,pop和present,dismiss

文章目錄前言push和poppresent和dismiss基本方法屬性說明常見的用法運行演示push和present區別前言 在之前的學習中&#xff0c;我們發現iOS有兩種用于推出新界面的常用方法&#xff0c;分別是push和present&#xff0c;但是二者存在很多區別 present只能返回自己的上一級視圖…

編寫后端JAR包藍綠發布腳本

前端發布腳本的功能 保留每一個發布版本&#xff0c;防止新版本異常&#xff0c;方便回撤用戶無感知&#xff0c;防止發布過程中的宕機 原理&#xff1a; 發布的JAR包只是一個軟連接&#xff0c;新的JAR啟動正常后&#xff0c;切換軟連接指向即可。藍綠JAR包綁定端口不同&…