DAY 43 預訓練模型

目錄

一、預訓練的概念

二、 經典的預訓練模型

?2.1 CNN架構預訓練模型

2.2 Transformer類預訓練模型

2.3 自監督預訓練模型

三、常見的分類預訓練模型介紹

3.1 預訓練模型的發展史

3.2?預訓練模型的訓練策略


知識點回顧:

  1. 預訓練的概念
  2. 常見的分類預訓練模型
  3. 圖像預訓練模型的發展史
  4. 預訓練的策略
  5. 預訓練代碼實戰:resnet18

一、預訓練的概念

????????我們之前在訓練中發現,準確率最開始隨著epoch的增加而增加。隨著循環的更新,參數在不斷發生更新。

所以參數的初始值對訓練結果有很大的影響:

  1. 如果最開始的初始值比較好,后續訓練輪數就會少很多
  2. 很有可能陷入局部最優值,不同的初始值可能導致陷入不同的局部最優值

????????所以很自然的想到,如果最開始能有比較好的參數,即可能導致未來訓練次數少,也可能導致未來訓練避免陷入局部最優解的問題。這就引入了一個概念,即預訓練模型。

????????如果別人在某些和我們目標數據類似的大規模數據集上做過訓練,我們可以用他的訓練參數來初始化我們的模型,這樣我們的模型就比較容易收斂。
?

為了幫助理解,這里提出幾個自問自答的問題。

1. 那為什么要選擇類似任務的數據集預訓練的模型參數呢?

????????因為任務差不多,他提取特征的能力才有用,如果任務相差太大,他的特征提取能力就沒那么好。所以本質預訓練就是拿別人已經具備的通用特征提取能力來接著強化能力使之更加適應我們的數據集和任務。

2. 為什么要求預訓練模型是在大規模數據集上訓練的,小規模不行么?

????????因為提取的是通用特征,所以如果數據集數據少、尺寸小,就很難支撐復雜任務學習通用的數據特征。比如你是一個物理的博士,讓你去做小學數學題,很快就能上手;但是你是一個小學數學速算高手,讓你做物理博士的課題,就很困難。所以預訓練模型一般就挺強的。

????????我們把用預訓練模型的參數,然后接著在自己數據集上訓練來調整該參數的過程叫做微調,這種思想叫做遷移學習。把預訓練的過程叫做上游任務,把微調的過程叫做下游任務。

現在再來看下之前一直用的cifar10數據集,他是不是就很明顯不適合作為預訓練數據集?

  1. 規模過小:僅 10 萬張圖像,且尺寸小(32x32),無法支撐復雜模型學習通用視覺特征;
  2. 類別單一:僅 10 類(飛機、汽車等),泛化能力有限;

????????這里給大家介紹一個常常用來做預訓練的數據集,ImageNet,ImageNet 1000 個類別,有 1.2 億張圖像,尺寸 224x224,數據集大小 1.4G,下載地址:http://www.image-net.org/。


?

二、 經典的預訓練模型

?2.1 CNN架構預訓練模型

模型預訓練數據集核心特點在CIFAR10上的適配要點
AlexNetImageNet首次引入ReLU/局部響應歸一化,參數量6000萬+需修改首層卷積核大小(原11x11→適配32x32)
VGG16ImageNet純卷積堆疊,結構統一,參數量1.38億凍結前10層卷積,僅微調全連接層
ResNet18ImageNet殘差連接解決梯度消失,參數量1100萬直接適配32x32輸入,需調整池化層步長
MobileNetV2ImageNet深度可分離卷積,參數量350萬+輕量級設計,適合計算資源有限的場景

2.2 Transformer類預訓練模型

適用于較大尺圖像(如224x224),在CIFAR10上需上采樣圖像尺寸調整Patch大小

模型預訓練數據集核心特點在CIFAR10上的適配要點
ViT-BaseImageNet-21K純Transformer架構,參數量8600萬圖像Resize至224x224,Patch大小設為4x4
Swin TransformerImageNet-22K分層窗口注意力,參數量8000萬+需調整窗口大小適配小圖像
DeiTImageNet結合CNN歸納偏置,參數量2200萬輕量級Transformer,適合中小尺寸圖像

2.3 自監督預訓練模型

無需人工標注,通過 pretext task(如掩碼圖像重建)學習特征,適合數據稀缺場景。

模型預訓練方式典型數據集在CIFAR10上的優勢
MoCo v3對比學習ImageNet無需標簽即可遷移,適合無標注數據
BEiT掩碼圖像建模ImageNet-22K特征語義豐富,微調時收斂更快

三、常見的分類預訓練模型介紹

3.1 預訓練模型的發展史

模型年份提出團隊關鍵創新點層數參數量ImageNet Top-5錯誤率典型應用場景預訓練權重可用性
LeNet-51998Yann LeCun等首個CNN架構,卷積層+池化層+全連接層,Sigmoid激活函數7~60KN/A手寫數字識別(MNIST)無(歷史模型)
AlexNet2012Alex Krizhevsky等ReLU激活函數、Dropout、數據增強、GPU訓練860M15.3%大規模圖像分類PyTorch/TensorFlow官方支持
VGGNet2014Oxford VGG團隊統一3×3卷積核、多尺度特征提取、結構簡潔16/19138M/144M7.3%/7.0%圖像分類、目標檢測基礎骨干網絡PyTorch/TensorFlow官方支持
GoogLeNet2014GoogleInception模塊(多分支并行卷積)、1×1卷積降維、全局平均池化225M6.7%大規模圖像分類PyTorch/TensorFlow官方支持
ResNet2015何愷明等殘差連接(解決梯度消失)、Batch Normalization18/50/15211M/25M/60M3.57%/3.63%/3.58%圖像/視頻分類、檢測、分割PyTorch/TensorFlow官方支持
DenseNet2017Gao Huang等密集連接(每層與后續所有層相連)、特征復用、參數效率高121/1698M/14M2.80%小數據集、醫學圖像處理PyTorch/TensorFlow官方支持
MobileNet2017Google深度可分離卷積(減少75%計算量)、輕量級設計284.2M7.4%移動端圖像分類/檢測PyTorch/TensorFlow官方支持
EfficientNet2019Google復合縮放(同時優化深度、寬度、分辨率)、NAS搜索最佳配置B0-B75.3M-66M2.6% (B7)高精度圖像分類(資源受限場景)PyTorch/TensorFlow官方支持

????????上圖的層數,代表該模型不同的版本resnet有resnet18、resnet50、resnet152;efficientnet有efficientnet-b0、efficientnet-b1、efficientnet-b2、efficientnet-b3、efficientnet-b4等

????????其中ImageNet Top - 5 準確率是圖像分類任務里的一種評估指標 ,用于衡量模型在 ImageNet 數據集上的分類性能,模型對圖像進行分類預測,輸出所有類別(共 1000 類 )的概率,取概率排名前五的類別,只要這五個類別里包含人工標注的正確類別,就算預測正確。

模型架構演進關鍵點總結

  1. 深度突破:從LeNet的7層到ResNet152的152層,殘差連接解決了深度網絡的訓練難題。 ----沒上過我復試班cv部分的自行去了解下什么叫做殘差連接,很重要!

  2. 計算效率:GoogLeNet(Inception)和MobileNet通過結構優化,在保持精度的同時大幅降低參數量。

  3. 特征復用:DenseNet的密集連接設計使模型能更好地利用淺層特征,適合小數據集。

  4. 自動化設計:EfficientNet使用神經架構搜索(NAS)自動尋找最優網絡配置,開創了AutoML在CNN中的應用。

預訓練模型使用建議

任務需求推薦模型理由
快速原型開發ResNet50/18結構平衡,預訓練權重穩定,社區支持完善
移動端部署MobileNetV3參數量小,計算高效,專為移動設備優化
高精度分類(資源充足)EfficientNet-B7目前ImageNet準確率領先,適合GPU/TPU環境
小數據集或特征復用需求DenseNet密集連接設計減少過擬合,特征復用能力強
多尺度特征提取Inception-ResNet結合Inception多分支和ResNet殘差連接,適合復雜場景

????????這些模型的預訓練權重均可通過主流框架(如PyTorch的torchvision.models、Keras的applications模塊)直接加載,便于快速遷移到新任務。

總結:CNN 架構發展脈絡

  1. 早期探索(1990s-2010s):LeNet 驗證 CNN 可行性,但受限于計算和數據。
  2. 深度學習復興(2012-2015):AlexNet、VGGNet、GoogLeNet 通過加深網絡和結構創新突破性能。
  3. 超深網絡時代(2015 年后):ResNet 解決退化問題,開啟殘差連接范式,后續模型圍繞效率(MobileNet)、特征復用(DenseNet)、多分支結構(Inception)等方向優化。

3.2?預訓練模型的訓練策略

那么什么模型會被選為預訓練模型呢?比如一些調參后表現很好的cnn神經網絡(固定的神經元個數+固定的層數等)。

所以調用預訓練模型做微調,本質就是 用這些固定的結構+之前訓練好的參數 接著訓練

所以需要找到預訓練的模型結構并且加載模型參數

相較于之前用自己定義的模型有以下幾個注意點:

  1. 需要調用預訓練模型和加載權重
  2. 需要resize 圖片讓其可以適配模型
  3. 需要修改最后的全連接層以適應數據集

????????其中,訓練過程中,為了不破壞最開始的特征提取器的參數,最開始往往先凍結住特征提取器的參數,然后訓練全連接層,大約在5-10個epoch后解凍訓練。

????????主要做特征提取的部分叫做backbone骨干網絡;負責融合提取的特征的部分叫做Featue Pyramid Network(FPN);負責輸出的預測部分的叫做Head。

首先復用下之前的代碼

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt# 設置中文字體支持
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False  # 解決負號顯示問題# 檢查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用設備: {device}")# 1. 數據預處理(訓練集增強,測試集標準化)
train_transform = transforms.Compose([transforms.RandomCrop(32, padding=4),transforms.RandomHorizontalFlip(),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),transforms.RandomRotation(15),transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])test_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])# 2. 加載CIFAR-10數據集
train_dataset = datasets.CIFAR10(root='./data',train=True,download=True,transform=train_transform
)test_dataset = datasets.CIFAR10(root='./data',train=False,transform=test_transform
)# 3. 創建數據加載器(可調整batch_size)
batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 4. 訓練函數(支持學習率調度器)
def train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs):model.train()  # 設置為訓練模式train_loss_history = []test_loss_history = []train_acc_history = []test_acc_history = []all_iter_losses = []iter_indices = []for epoch in range(epochs):running_loss = 0.0correct_train = 0total_train = 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()# 記錄Iteration損失iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch * len(train_loader) + batch_idx + 1)# 統計訓練指標running_loss += iter_loss_, predicted = output.max(1)total_train += target.size(0)correct_train += predicted.eq(target).sum().item()# 每100批次打印進度if (batch_idx + 1) % 100 == 0:print(f"Epoch {epoch+1}/{epochs} | Batch {batch_idx+1}/{len(train_loader)} "f"| 單Batch損失: {iter_loss:.4f}")# 計算 epoch 級指標epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct_train / total_train# 測試階段model.eval()correct_test = 0total_test = 0test_loss = 0.0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()_, predicted = output.max(1)total_test += target.size(0)correct_test += predicted.eq(target).sum().item()epoch_test_loss = test_loss / len(test_loader)epoch_test_acc = 100. * correct_test / total_test# 記錄歷史數據train_loss_history.append(epoch_train_loss)test_loss_history.append(epoch_test_loss)train_acc_history.append(epoch_train_acc)test_acc_history.append(epoch_test_acc)# 更新學習率調度器if scheduler is not None:scheduler.step(epoch_test_loss)# 打印 epoch 結果print(f"Epoch {epoch+1} 完成 | 訓練損失: {epoch_train_loss:.4f} "f"| 訓練準確率: {epoch_train_acc:.2f}% | 測試準確率: {epoch_test_acc:.2f}%")# 繪制損失和準確率曲線plot_iter_losses(all_iter_losses, iter_indices)plot_epoch_metrics(train_acc_history, test_acc_history, train_loss_history, test_loss_history)return epoch_test_acc  # 返回最終測試準確率# 5. 繪制Iteration損失曲線
def plot_iter_losses(losses, indices):plt.figure(figsize=(10, 4))plt.plot(indices, losses, 'b-', alpha=0.7)plt.xlabel('Iteration(Batch序號)')plt.ylabel('損失值')plt.title('訓練過程中的Iteration損失變化')plt.grid(True)plt.show()# 6. 繪制Epoch級指標曲線
def plot_epoch_metrics(train_acc, test_acc, train_loss, test_loss):epochs = range(1, len(train_acc) + 1)plt.figure(figsize=(12, 5))# 準確率曲線plt.subplot(1, 2, 1)plt.plot(epochs, train_acc, 'b-', label='訓練準確率')plt.plot(epochs, test_acc, 'r-', label='測試準確率')plt.xlabel('Epoch')plt.ylabel('準確率 (%)')plt.title('準確率隨Epoch變化')plt.legend()plt.grid(True)# 損失曲線plt.subplot(1, 2, 2)plt.plot(epochs, train_loss, 'b-', label='訓練損失')plt.plot(epochs, test_loss, 'r-', label='測試損失')plt.xlabel('Epoch')plt.ylabel('損失值')plt.title('損失值隨Epoch變化')plt.legend()plt.grid(True)plt.tight_layout()plt.show()

輸出:
?

使用設備: cuda
Files already downloaded and verified

# 導入ResNet模型
from torchvision.models import resnet18# 定義ResNet18模型(支持預訓練權重加載)
def create_resnet18(pretrained=True, num_classes=10):# 加載預訓練模型(ImageNet權重)model = resnet18(pretrained=pretrained)# 修改最后一層全連接層,適配CIFAR-10的10分類任務in_features = model.fc.in_featuresmodel.fc = nn.Linear(in_features, num_classes)# 將模型轉移到指定設備(CPU/GPU)model = model.to(device)return model
# 創建ResNet18模型(加載ImageNet預訓練權重,不進行微調)
model = create_resnet18(pretrained=True, num_classes=10)
model.eval()  # 設置為推理模式# 測試單張圖片(示例)
from torchvision import utils# 從測試數據集中獲取一張圖片
dataiter = iter(test_loader)
images, labels = dataiter.next()
images = images[:1].to(device)  # 取第1張圖片# 前向傳播
with torch.no_grad():outputs = model(images)_, predicted = torch.max(outputs.data, 1)# 顯示圖片和預測結果
plt.imshow(utils.make_grid(images.cpu(), normalize=True).permute(1, 2, 0))
plt.title(f"預測類別: {predicted.item()}")
plt.axis('off')
plt.show()

在?CIFAR-10 數據集?中,類別標簽是固定的 10 個,分別對應:

標簽(數字)類別名稱說明
0airplane飛機
1automobile汽車(含轎車、卡車等)
2bird鳥類
3cat
4deer鹿
5dog
6frog青蛙
7horse
8ship
9truck卡車(重型貨車等)

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import os# 設置中文字體支持
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False  # 解決負號顯示問題# 檢查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用設備: {device}")# 1. 數據預處理(訓練集增強,測試集標準化)
train_transform = transforms.Compose([transforms.RandomCrop(32, padding=4),transforms.RandomHorizontalFlip(),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),transforms.RandomRotation(15),transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])test_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])# 2. 加載CIFAR-10數據集
train_dataset = datasets.CIFAR10(root='./data',train=True,download=True,transform=train_transform
)test_dataset = datasets.CIFAR10(root='./data',train=False,transform=test_transform
)# 3. 創建數據加載器
batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 4. 定義ResNet18模型
def create_resnet18(pretrained=True, num_classes=10):model = models.resnet18(pretrained=pretrained)# 修改最后一層全連接層in_features = model.fc.in_featuresmodel.fc = nn.Linear(in_features, num_classes)return model.to(device)# 5. 凍結/解凍模型層的函數
def freeze_model(model, freeze=True):"""凍結或解凍模型的卷積層參數"""# 凍結/解凍除fc層外的所有參數for name, param in model.named_parameters():if 'fc' not in name:param.requires_grad = not freeze# 打印凍結狀態frozen_params = sum(p.numel() for p in model.parameters() if not p.requires_grad)total_params = sum(p.numel() for p in model.parameters())if freeze:print(f"已凍結模型卷積層參數 ({frozen_params}/{total_params} 參數)")else:print(f"已解凍模型所有參數 ({total_params}/{total_params} 參數可訓練)")return model# 6. 訓練函數(支持階段式訓練)
def train_with_freeze_schedule(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs, freeze_epochs=5):"""前freeze_epochs輪凍結卷積層,之后解凍所有層進行訓練"""train_loss_history = []test_loss_history = []train_acc_history = []test_acc_history = []all_iter_losses = []iter_indices = []# 初始凍結卷積層if freeze_epochs > 0:model = freeze_model(model, freeze=True)for epoch in range(epochs):# 解凍控制:在指定輪次后解凍所有層if epoch == freeze_epochs:model = freeze_model(model, freeze=False)# 解凍后調整優化器(可選)optimizer.param_groups[0]['lr'] = 1e-4  # 降低學習率防止過擬合model.train()  # 設置為訓練模式running_loss = 0.0correct_train = 0total_train = 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()# 記錄Iteration損失iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch * len(train_loader) + batch_idx + 1)# 統計訓練指標running_loss += iter_loss_, predicted = output.max(1)total_train += target.size(0)correct_train += predicted.eq(target).sum().item()# 每100批次打印進度if (batch_idx + 1) % 100 == 0:print(f"Epoch {epoch+1}/{epochs} | Batch {batch_idx+1}/{len(train_loader)} "f"| 單Batch損失: {iter_loss:.4f}")# 計算 epoch 級指標epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct_train / total_train# 測試階段model.eval()correct_test = 0total_test = 0test_loss = 0.0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()_, predicted = output.max(1)total_test += target.size(0)correct_test += predicted.eq(target).sum().item()epoch_test_loss = test_loss / len(test_loader)epoch_test_acc = 100. * correct_test / total_test# 記錄歷史數據train_loss_history.append(epoch_train_loss)test_loss_history.append(epoch_test_loss)train_acc_history.append(epoch_train_acc)test_acc_history.append(epoch_test_acc)# 更新學習率調度器if scheduler is not None:scheduler.step(epoch_test_loss)# 打印 epoch 結果print(f"Epoch {epoch+1} 完成 | 訓練損失: {epoch_train_loss:.4f} "f"| 訓練準確率: {epoch_train_acc:.2f}% | 測試準確率: {epoch_test_acc:.2f}%")# 繪制損失和準確率曲線plot_iter_losses(all_iter_losses, iter_indices)plot_epoch_metrics(train_acc_history, test_acc_history, train_loss_history, test_loss_history)return epoch_test_acc  # 返回最終測試準確率# 7. 繪制Iteration損失曲線
def plot_iter_losses(losses, indices):plt.figure(figsize=(10, 4))plt.plot(indices, losses, 'b-', alpha=0.7)plt.xlabel('Iteration(Batch序號)')plt.ylabel('損失值')plt.title('訓練過程中的Iteration損失變化')plt.grid(True)plt.show()# 8. 繪制Epoch級指標曲線
def plot_epoch_metrics(train_acc, test_acc, train_loss, test_loss):epochs = range(1, len(train_acc) + 1)plt.figure(figsize=(12, 5))# 準確率曲線plt.subplot(1, 2, 1)plt.plot(epochs, train_acc, 'b-', label='訓練準確率')plt.plot(epochs, test_acc, 'r-', label='測試準確率')plt.xlabel('Epoch')plt.ylabel('準確率 (%)')plt.title('準確率隨Epoch變化')plt.legend()plt.grid(True)# 損失曲線plt.subplot(1, 2, 2)plt.plot(epochs, train_loss, 'b-', label='訓練損失')plt.plot(epochs, test_loss, 'r-', label='測試損失')plt.xlabel('Epoch')plt.ylabel('損失值')plt.title('損失值隨Epoch變化')plt.legend()plt.grid(True)plt.tight_layout()plt.show()# 主函數:訓練模型
def main():# 參數設置epochs = 40  # 總訓練輪次freeze_epochs = 5  # 凍結卷積層的輪次learning_rate = 1e-3  # 初始學習率weight_decay = 1e-4  # 權重衰減# 創建ResNet18模型(加載預訓練權重)model = create_resnet18(pretrained=True, num_classes=10)# 定義優化器和損失函數optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=weight_decay)criterion = nn.CrossEntropyLoss()# 定義學習率調度器scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=2, verbose=True)# 開始訓練(前5輪凍結卷積層,之后解凍)final_accuracy = train_with_freeze_schedule(model=model,train_loader=train_loader,test_loader=test_loader,criterion=criterion,optimizer=optimizer,scheduler=scheduler,device=device,epochs=epochs,freeze_epochs=freeze_epochs)print(f"訓練完成!最終測試準確率: {final_accuracy:.2f}%")# # 保存模型# torch.save(model.state_dict(), 'resnet18_cifar10_finetuned.pth')# print("模型已保存至: resnet18_cifar10_finetuned.pth")if __name__ == "__main__":main()

幾個明顯的現象

  1. 解凍后幾個epoch即可達到之前cnn訓練20輪的效果,這是預訓練的優勢
  2. 由于訓練集用了 RandomCrop(隨機裁剪)、RandomHorizontalFlip(隨機水平翻轉)、ColorJitter(顏色抖動)等數據增強操作,這會讓訓練時模型看到的圖片有更多 “干擾” 或變形。比如一張汽車圖片,訓練時可能被裁剪成只顯示局部、顏色也有變化,模型學習難度更高;而測試集是標準的、沒增強的圖片,模型預測相對輕松,就可能出現訓練集準確率暫時低于測試集的情況,尤其在訓練前期增強對模型影響更明顯。隨著訓練推進,模型適應增強后會緩解。
  3. 最后收斂后的效果超過非預訓練模型的80%,大幅提升。

@浙大疏錦行

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

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

相關文章

Redis:事物

🌈 個人主頁:Zfox_ 🔥 系列專欄:Redis 🔥 什么是事務 Redis的事務和MySQL的事務概念上是類似的.都是把?系列操作綁定成?組.讓這?組能夠批量執?. 但是注意體會Redis的事務和MySQL事務的區別: 弱化的原?性:redi…

CppCon 2018 學習:An allocator is a handle to a heap Lessons learned from std::pmr

“An allocator is a handle to a heap — Lessons learned from std::pmr” 翻譯過來就是:“分配器(allocator)是對堆(heap)的一種句柄(handle)——從 std::pmr 中學到的經驗”。 基礎概念 分…

設備健康實時監測方法演進:從傳感網絡到AI決策樹的工業智能實踐

引言:當設備運維遇上AIoT革命 在工業4.0進程中,?毫秒級設備狀態捕獲能力正成為智能工廠的核心競爭力。傳統監測方法因數據滯后、診斷粗放被詬病,本文將深入探討三大前沿實時監測技術路徑,并揭秘中訊燭龍系統如何通過深度強化學習…

劍指offer53_二叉樹的深度

二叉樹的深度 輸入一棵二叉樹的根結點,求該樹的深度。 從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 數據范圍 樹中節點數量 [ 0 , 500 ] [0,500] [0,500]。 樣例 輸入&#…

探秘AI的秘密:leaked-system-prompts

揭秘:揭秘系統提示合集背后的秘密 在當今這個人工智能技術迅速發展的時代,了解和使用大型語言模型(LLM)已成為技術愛好者、開發者和研究人員的共同目標。而作為核心組成部分,系統提示(system prompts)的設計和應用直接影響了LLM的表現和功能。今天, 我們將為大家揭示一…

Gaming Mode四大功能(VRR、QMS、QFT、ALLM)

HDMI 2.1定義的Gaming Mode四大功能(VRR、QMS、QFT、ALLM)通過協同優化幀傳輸、刷新率同步與延遲控制,顯著提升了游戲和影音的流暢性與響應速度。以下是這些功能的詳細解析及其應用價值: 🔄 1. 可變刷新率(…

數據庫總結(關系代數-函數依賴-范式)

以下是關系代數中基本操作的詳細說明: 并(Union) 關系R和S的并操作表示為R ∪ S,要求R和S具有相同的屬性集(并相容性)。結果包含所有屬于R或S的元組,自動去除重復項。 示例: R …

react經驗:在nextjs中使用motion組件

什么是motion組件? 一種動畫組件 motion組件文檔 在nextjs中的應用步驟 1.安裝motion npm i framer-motion2.在next.config.js中配置轉義 export default {transpilePackages: [framer-motion] }3.開始應用 **注意要點:**在服務端渲染不可直接用&am…

怎樣大語言模型 遵守規則

如何讓應用中的提示工程更能適應未來變化 目錄 如何讓應用中的提示工程更能適應未來變化怎樣大語言模型 遵守規則提示詞 很有效:Memorize these rules提示可分為穩定組件和易變組件怎樣大語言模型 遵守規則 實驗背景:讓大語言模型可靠地遵守規則很難,尤其是規則數量增多時。…

如何通過SSL證書配置防止源站IP泄露 - 全面防護指南

問題背景:SSL證書如何導致源站IP泄露 近期多位站長反饋,即使已部署高防CDN并做好源站IP保密工作,服務器仍頻繁遭受DDoS攻擊。經深入排查,發現問題根源在于SSL證書。當前網絡環境中存在大量爬蟲工具24小時不間斷掃描全網IP地址&am…

醫院信息化發展要經過哪幾個階段

目前,幾乎所有的醫院都離不開信息技術的建設和支持。沒有信息技術,醫院的業務可能無法繼續。醫院信息化的發展主要經歷三個階段,即醫院管理信息化階段、臨床管理信息化階段和醫療智能化階段。從基礎設施的角度來看,每個階段都有不…

【Vscode】Vscode切換成中文語言

安裝中文語言包 啟動 VSCode。按下Ctrl Shift X(或者點擊左側邊欄的擴展圖標),打開擴展面板。在搜索框中輸入Chinese (Simplified),在搜索結果里找到Chinese (Simplified) Language Pack for Visual Studio Code并點擊安裝按鈕…

【百日精通JAVA | 數據結構篇】 一文了解泛型體系

一、初識泛型 在推出泛型以前,程序員可以創建一個元素類型Object的集合,該集合能夠存儲任意的數據類型對象,而在使用該集合的過程中,需要明確知道存儲每個元素的類型,否則容易引發ClassCastException異常。 泛型是JD…

賦能 Java 工程,飛算科技重新定義智能開發

在數字經濟蓬勃發展的當下,軟件開發行業正經歷著前所未有的變革。飛算科技作為一家自主創新型的數字科技公司,始終以互聯網科技、大數據、人工智能等前沿技術為根基。憑借團隊在相關領域多年積累的深厚實踐經驗,公司深度融合技術與應用&#…

【藍牙】Linux Qt4藍牙設備列表刷新加載采用什么策略,使用什么對應的Linux命令或dbus接口

在 Linux 系統中,使用 Qt4 開發藍牙設備列表刷新功能時,通常會結合 BlueZ 藍牙協議棧 和 D-Bus 通信機制 實現對藍牙設備的發現與管理。以下是常見的實現策略和對應的命令或接口。 🧩 一、藍牙設備列表刷新策略 1. 主動掃描(Scan…

產品背景知識——CIFS、SMB 和 Samba

產品背景知識——CIFS、SMB 和 Samba 1. SMB(Server Message Block) 定義: SMB 是一種網絡協議,用于在計算機之間共享文件、打印機、串口等資源。它由 IBM 在 1980 年代開發,后被微軟采用并擴展。 發展歷程&#xff…

基于Python的GIS-RS多源數據處理(TIF/SHP/NC/...)【20250630】

柵格數據以規則網格(像素)的數值矩陣表達地理現象,每個單元格代表一個屬性值(如高程、溫度)。例如衛星影像、數字高程模型、溫度分布圖。存儲格式包括ENVI DAT、GeoTIFF、JPEG、PNG、ASCII Grid等等。 矢量數據是通過幾何圖形(點、線、面)表示地理實體,…

基于yolov5的深度學習的昆蟲檢測帶QT界面

完整項目查看或想了解其他項目點擊文末名片 項目簡介 本項目旨在開發一個基于深度學習的昆蟲檢測與識別系統。系統使用兩個主要模塊:昆蟲檢測器(InsectDetector)和昆蟲識別器(InsectIdentifier)。首先,昆蟲…

linux使用1

1.終端查看ip地址 # windows ipconfig# linux ifconfig2.VMware共享文件夾權限設置下如何復制/移動文件 # 移動: mv # 查看當前文件夾: ls # 設置管理員權限: sudo # 復制: cp#情景一:移動桌面文件夾(desktop/day4/server/)到共…

ACE之ACE_NonBlocking_Connect_Handler問題分析

問題 ACE_NonBlocking_Connect_Handler在處理異步時存在問題 分析 當connect選擇的同步參數為ACE_Synch_Options::USE_REACTOR時,連接超時時間為ACE_Time_Value::zero,在同步發起連接返回的錯誤碼為EWOULDBLOCK時,會發起異步連接nonblocki…