深度學習篇---預訓練模型

在深度學習中,預訓練模型(Pretrained Model)?是提升開發效率和模型性能的 “利器”。無論是圖像識別、自然語言處理還是語音識別,預訓練模型都被廣泛使用。下面從概念、使用原因、場景、作用等方面詳細介紹,并結合 Python 代碼展示常用預訓練模型的使用。

一、什么是預訓練模型?(通俗易懂版)

可以把預訓練模型理解為:“別人已經訓練好的‘半成品模型’,你可以直接拿來用,或者稍作修改就能適配自己的任務”

舉個例子:假設你想訓練一個 “識別貓和狗” 的模型,需要大量圖片和算力。但有人已經用百萬張圖片(如 ImageNet 數據集)訓練了一個 “能識別 1000 種物體” 的模型,這個模型已經學會了 “邊緣、紋理、形狀” 等通用視覺特征(比如 “貓有耳朵、狗有尾巴”)。你可以直接用這個模型,要么直接預測貓和狗,要么在它的基礎上再用少量貓和狗的圖片 “微調”,就能快速得到一個好模型。

簡言之,預訓練模型是 “前人訓練好的成果,你可以站在它的肩膀上做開發”。

二、為什么要用預訓練模型?

  1. 節省時間和算力
    訓練一個復雜模型(如 ResNet、BERT)可能需要幾天甚至幾周,還需要高性能 GPU。預訓練模型已經完成了大部分計算,直接用或微調只需幾小時,適合個人或小團隊(沒有超強算力)。

  2. 數據量少時也能出效果
    深度學習需要大量數據(如幾十萬張圖片),但實際場景中可能只有幾千張數據(如自己拍的貓和狗圖片)。預訓練模型已經 “見過” 海量數據,學到了通用特征,用少量數據微調就能達到不錯的效果(否則從頭訓練可能過擬合)。

  3. 性能更優
    預訓練模型通常基于大規模數據集(如 ImageNet 有 1400 萬張圖片)和優化的網絡結構,其學到的特征更通用、更魯棒。在此基礎上微調的模型,性能往往比 “從頭訓練” 好很多。

三、預訓練模型的使用場景

  1. 快速開發原型
    當你需要快速驗證一個想法(比如 “用模型識別工廠的零件是否合格”),可以直接用預訓練模型做初步測試,不需要從零開始訓練。

  2. 數據量有限的任務
    比如醫學影像識別(數據少且標注成本高)、小眾物體識別(如特定品種的花),用預訓練模型微調能顯著提升精度。

  3. 遷移學習任務
    從 “通用任務” 遷移到 “具體任務”:比如用 “識別 1000 類物體” 的預訓練模型,遷移到 “識別 5 類水果” 的任務;用 “通用文本分類” 的 BERT,遷移到 “情感分析” 任務。

  4. 邊緣設備部署
    很多預訓練模型有 “輕量化版本”(如 MobileNet、EfficientNet-Lite),適合在手機、攝像頭等邊緣設備上部署(算力有限但需要快速推理)。

四、預訓練模型的作用

  1. 提供通用特征提取能力
    預訓練模型的前半部分(如 CNN 的卷積層、Transformer 的編碼器)已經學會了通用特征(如圖像的邊緣、紋理,文本的語義關系),可以直接作為 “特征提取器” 使用。

  2. 加速模型收斂
    微調時,模型參數不需要從 0 開始學習,而是在預訓練的 “好起點” 上優化,訓練速度更快(比如原本需要 100 個 epoch,微調可能只需 20 個)。

  3. 降低過擬合風險
    預訓練模型學到的通用特征能 “抵抗” 小數據集的噪聲,減少模型對訓練數據的過度依賴(過擬合)。

五、Python 中常用的預訓練模型及使用代碼

計算機視覺(圖像任務)?為例,PyTorch 的torchvision庫和 TensorFlow 的tf.keras.applications提供了大量預訓練模型。下面以 PyTorch 為例,介紹最常用的模型及代碼。

常用預訓練模型(圖像任務)
模型名稱特點適用場景
ResNet(ResNet50/101)結構深、精度高,適合需要高精度的任務圖像分類、特征提取
VGG16/VGG19結構簡單、特征提取能力強遷移學習、細粒度分類
MobileNetV2/V3輕量化、計算量小手機、攝像頭等邊緣設備部署
EfficientNet精度與效率平衡(比 ResNet 好且更輕量)兼顧精度和速度的場景
Faster R-CNN經典目標檢測模型目標檢測(定位 + 分類)
代碼示例:使用預訓練模型進行圖像分類

ResNet50為例,展示 “加載預訓練模型→預處理圖像→推理預測” 的完整流程。

步驟 1:安裝依賴

確保安裝了torchtorchvision

pip install torch torchvision
步驟 2:加載預訓練模型并查看結構
import torch
from torchvision import models# 加載預訓練的ResNet50(pretrained=True表示加載預訓練權重)
resnet50 = models.resnet50(pretrained=True)
# 設置為評估模式(關閉 dropout、batchnorm等訓練時的層)
resnet50.eval()# 查看模型結構(簡化輸出)
print("ResNet50結構概覽:")
print(resnet50)

模型結構說明

  • 前半部分是conv1layer4的卷積層(特征提取);
  • 后半部分是avgpool(全局平均池化)和fc(全連接層,輸出 1000 類,對應 ImageNet 的 1000 個類別)。
步驟 3:圖像預處理(必須與預訓練一致)

預訓練模型對輸入圖像有固定要求(如尺寸、歸一化參數),需嚴格匹配:

from torchvision import transforms
from PIL import Image# 定義預處理流程(與ResNet訓練時的預處理一致)
preprocess = transforms.Compose([transforms.Resize(256),  # 縮放到256x256transforms.CenterCrop(224),  # 中心裁剪到224x224transforms.ToTensor(),  # 轉為張量并歸一化到0-1# 標準化(使用ImageNet的均值和標準差,必須與預訓練一致)transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
步驟 4:用預訓練模型進行推理(預測圖像類別)
# 讀取一張測試圖片(如一只貓)
img = Image.open("cat.jpg")  # 替換為你的圖片路徑
# 預處理
input_tensor = preprocess(img)
# 增加批次維度(模型要求輸入是(batch_size, channels, H, W),這里batch_size=1)
input_batch = input_tensor.unsqueeze(0)# 用GPU加速(如果有)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
resnet50.to(device)
input_batch = input_batch.to(device)# 推理(關閉梯度計算,加快速度)
with torch.no_grad():output = resnet50(input_batch)# 輸出是1000類的概率(logits),取最大概率的類別
predicted_class = torch.argmax(output[0]).item()# 加載ImageNet的類別名稱(1000類)
from torchvision.datasets import ImageNet
# 注意:ImageNet數據集需手動下載,這里簡化為加載類別名稱(可網上搜索獲取)
with open("imagenet_classes.txt") as f:  # 包含1000類名稱的文件classes = [line.strip() for line in f.readlines()]print(f"預測類別:{classes[predicted_class]}")

說明imagenet_classes.txt包含 ImageNet 的 1000 個類別名稱(如 “貓”“狗”“汽車”),可從網上下載(搜索 “imagenet classes list”)。

步驟 5:微調預訓練模型(適配自定義任務)

如果要解決自己的分類任務(如識別 “貓、狗、鳥”3 類),需要微調模型:

# 1. 修改輸出層(將1000類改為3類)
num_classes = 3  # 自定義類別數
resnet50.fc = torch.nn.Linear(resnet50.fc.in_features, num_classes)# 2. 凍結部分層(可選,加速訓練)
# 凍結前幾層(保留預訓練的通用特征),只訓練最后幾層
for param in list(resnet50.parameters())[:-10]:  # 凍結除最后10層外的參數param.requires_grad = False# 3. 定義損失函數和優化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(resnet50.parameters(), lr=0.001)# 4. 加載自定義數據集(假設已通過DataLoader準備好)
# train_loader = ...(自定義數據集的DataLoader)# 5. 微調訓練
resnet50.train()
for epoch in range(10):  # 訓練10個epochrunning_loss = 0.0for images, labels in train_loader:images, labels = images.to(device), labels.to(device)# 前向傳播outputs = resnet50(images)loss = criterion(outputs, labels)# 反向傳播+優化optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader):.4f}")

微調關鍵

  • 修改輸出層以匹配自定義類別數;
  • 可選凍結部分層(減少計算量,保留通用特征);
  • 用較小的學習率(避免破壞預訓練的好參數)。

六、總結(通俗易懂版)

預訓練模型就像 “已經學過基礎知識的學霸”:

  • 如果你想快速解決一個問題(如識別圖片里的東西),可以直接讓學霸幫你 “答題”(推理);
  • 如果你想讓學霸學新技能(如識別你的 3 種寵物),只需讓他在已有知識上 “稍作練習”(微調),比教一個零基礎的人(從頭訓練)快得多,效果也好得多。

無論是小團隊、個人開發者還是企業,合理使用預訓練模型都能大幅提升效率,少走彎路。

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

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

相關文章

Redis ①⑦-分布式鎖

分布式鎖 分布式鎖是鎖的一種,都是為了解決多線程/多進程環境下,對共享資源的訪問沖突問題。 不過,像 Java 的 synchronized 或者 C 的 mutex 這種鎖,都是進程內的鎖,而分布式鎖則是跨越進程/機器的鎖。也就是可以針對…

OpenCV-圖像預處理?【圖像顏色空間轉換、灰度化實驗、二值化處理、鏡像翻轉 和 仿射變換】

文章目錄先言一、圖像顏色空間轉換1.RGB顏色空間2.顏色加法3.顏色加權加法4.HSV顏色空間5.圖像轉換(cvtColor())二、灰度實驗1.灰度圖2.圖像灰度化(最大值法)3.圖像灰度化(平均值法)4.圖像灰度化&#xff0…

APP逆向 day9 安卓開發基礎

一.前言 app逆向當然要學安卓基礎啦!今天我們來教安卓基礎當然,安卓基礎不會教的很多,比java還要少,還是那句話,了解就好。 二.安卓環境搭建 2.1 安卓介紹 如果做安卓開發 需要會java代碼安卓SDK(安卓提供的內置…

Jmeter的元件使用介紹:(三)配置元件詳解02

六、計數器 可以用來做一些變量自增操作。 1、Starting value:定義初始值 2、遞增:定義每次執行遞增多少 3、Maximum value:定義承受的最大值 4、數據格式:可以不填,也可以定義成000;001;002等等任意格式都行。(1)如…

JavaWeb學習打卡15(JSP標簽、JSTL標簽、EL表達式)

EL表達式&#xff1a;${ }獲取數據執行運算獲取web開發的常用對象在pom.xml 文件中導入JSP、JSTL相關依賴&#xff1a;<!--JSP依賴--><!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --><dependency><groupId>java…

7.22數據結構——順序表

文章目錄一、思維導圖二、實現順序表的功能代碼head.htest.cmain.c一、思維導圖 二、實現順序表的功能代碼 head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> //數組的最大長度 #define MAXSIZE …

【如何無限制免費試用 IDEA || Pycharm(JB 全家桶)】

如何無限制免費試用 IDEA || Pycharm(JB 全家桶) 一、目標:解決 JB 全家桶試用時長痛點 如果你是程序員,大概率用過 JetBrains 家的 IDE——IDEA 寫 Java、Pycharm 寫 Python、WebStorm 做前端,體驗確實頂流,但官方 30 天試用到期后,動輒幾千的年費實在讓人肉痛。 咱…

Qt(資源庫和按鈕組)

這一節是對上一節的補充&#xff0c;上一節提到QLabel類和QAabstractButton類&#xff0c;這節內容&#xff1a;1.如設置資源庫&#xff0c;使用資源設置圖片2. 使用按鈕組管理多個按鈕。一、資源庫1. 資源庫作用Qt的資源庫&#xff08;Resource System&#xff0c;.qrc文件&am…

一道檢驗編碼能力的字符串的題目

#include<iostream> #include<vector> #include<string> using namespace std; int bNum0,gNum0; int findEnd(string& s,int si){int lens.size();//當前字母在哪個字符串中,存入comp中string comp;if(s[si]b||s[si]o||s[si]y){comp"boy";bNu…

UniApp X 網絡請求避坑指南:從 JS 到 UTS 的 JSON 數據處理全解析

在 UniApp 開發中&#xff0c;我們經常需要通過 uni.request 獲取服務器返回的 JSON 數據&#xff0c;并將其綁定到頁面或進行邏輯處理。但在 UniApp X&#xff08;基于 UTS&#xff09; 中&#xff0c;由于引入了 強類型語言特性&#xff0c;處理 JSON 數據的方式與 JS 有明顯…

iOS 網絡請求常用依賴庫與系統自帶 API 介紹與示例

iOS 網絡請求常用依賴庫與系統自帶 API 介紹與示例 在 iOS 開發中&#xff0c;進行網絡請求是幾乎所有應用都不可或缺的功能。開發者有多種選擇來處理網絡通信&#xff0c;從系統自帶的 URLSession 到各種流行的第三方庫。下面我將為您介紹 URLSession、AFNetworking、Alamofir…

JavaScript 中 let 在循環中的作用域機制解析

一、let在循環中的特殊性 let作為ES6引入的塊級作用域聲明&#xff0c;在循環結構中存在特殊行為&#xff0c;其核心區別于var的函數作用域特性。理解這一特性對于編寫正確的閉包邏輯至關重要。 在 ECMAScript 規范里&#xff0c;let聲明的變量具有塊級作用域特性&#xff0c;這…

@Subscribe@AllowConcurrentEvents解析這兩個注解

@Subscribe@AllowConcurrentEvents解析這兩個注解 @Subscribe 和 @AllowConcurrentEvents 是 Guava EventBus(Google 開源的事件總線框架)中用于處理事件訂閱的注解,主要用于實現組件間的解耦通信。下面分別解析: 1. @Subscribe 注解 作用:標記一個方法為事件訂閱者方法,…

好看的小程序推廣單頁HTML源碼 可用作導航頁

內容目錄一、詳細介紹二、效果展示1.部分代碼2.效果圖展示三、學習資料下載一、詳細介紹 響應式的小程序推廣單頁HTML源碼。這個設計采用了現代化的UI元素&#xff0c;包含吸引人的標題、特性展示、二維碼區域和行動號召按鈕。 二、效果展示 1.部分代碼 代碼如下&#xff0…

華為倉頡編程語言實踐體驗

華為倉頡編程語言實踐體驗 目前華為倉頡編程語言因為其推出時間較短&#xff0c;生態系統不完善。官網資料權威&#xff0c;但比較龐大難懂。快速實驗入門&#xff0c;是學習一門編程語言的法寶。網上靠譜的資料稀少&#xff0c;特此撰文介紹&#xff0c;幫助初學者減少挫折感&…

YOLOv11實戰,使用YOLOv11訓練自己的數據集和推理(附YOLOv11網絡結構圖)

2024年計算機視覺領域的顛覆性突破,YOLOv11以22%的參數量減少和0.3%的mAP提升重新定義實時目標檢測的邊界 本文將手把手帶你完成YOLOv11的全流程實戰,包含環境配置、數據準備、模型訓練、推理部署及創新優化方案,并深度解析其網絡架構設計思想。 一、YOLOv11核心創新解析 …

macOS xcode打包ios測試ipa應用包

可以參考&#xff1a; https://blog.csdn.net/sinat_34104446/article/details/133684756 過程中遇到很多稀奇古怪的報錯&#xff0c;基本重啟電腦即可解決。。。在我按照上面的步驟申請并導入新證書后&#xff0c;還遇到了一個問題&#xff1a;解決辦法&#xff1a; https://b…

STM32基礎知識學習筆記:ICODE、DCODE、DMA等常見名詞的解釋

基于AI生成內容。 ICODEICODE&#xff1a;指令總線&#xff08;Instruction Bus&#xff09; 主要用于處理 CPU 對程序指令的讀取操作。它是 STM32 存儲架構中重要的組成部分&#xff0c;與數據總線&#xff08;DCODE&#xff09;、系統總線&#xff08;System Bus&#xff09;…

誰將統治AI游戲時代?騰訊、網易、米哈游技術暗戰

游戲行業的“產能天花板”正被AI技術轟然擊穿。騰訊、網易、米哈游……所有的游戲廠商都在押注AI&#xff0c;騰訊混元發布混元游戲視覺生成平臺&#xff0c;分鐘級生成高精度游戲角色&#xff1b;網易《蛋仔派對》借AI實現UGC創作平民化&#xff1b;米哈游新作更以實時多模態對…

基于springboot的工商局商家管理系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了六年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…