基于 PyTorch 的貓狗圖像分類實戰

基于 PyTorch 的貓狗圖像分類實戰

項目背景簡介

深度學習框架 PyTorch 因其動態計算圖和靈活易用性,被廣泛應用于圖像分類等計算機視覺任務。在入門計算機視覺領域時,常常以手寫數字識別(MNIST)作為 “Hello World”,而貓狗分類任務則被視為進階練習的經典案例。早在 2013 年 Kaggle 就舉辦了著名的 “Dogs vs. Cats” 比賽,提供了包含 25,000 張已標注貓狗照片的訓練集(貓狗各占 12,500 張)以及 12,500 張未標注的測試集。該數據集最初源自微軟與 PetFinder 合作的項目,用于驗證機器能否像人類一樣輕松地區分貓和狗。盡管對人類而言貓狗識別毫不費力,機器在深度卷積神經網絡出現之前表現并不理想。當年比賽的優勝者利用卷積神經網絡在測試集上取得了約 98.9% 的驚人準確率。如今,這一貓狗二分類數據集已成為入門深度學習的標配練習之一,被譽為初學者練習卷積神經網絡的 “Hello World” 數據集。對于自建的簡單 CNN 模型,準確率可輕松達到 80% 以上;若結合遷移學習(例如使用預訓練的 ResNet),準確率可以進一步提升到 90% 以上。綜上,選擇貓狗分類任務進行實戰既有助于理解圖像分類的基本流程,又具備大量公開數據與成熟方案可供參考。
Github 倉庫地址: 貓狗分類

環境準備與依賴安裝

開始項目之前,需要準備好合適的開發環境。推薦使用 Python 3.8+ 的版本(確保不低于 3.7,以兼容最新的 PyTorch 功能)。可以使用 Anaconda 或 venv 創建獨立的 Python 環境,以避免依賴沖突。接下來需要安裝 PyTorch 和相關庫:

  • **PyTorch 安裝:**前往 PyTorch 官網上的 Get Started 指南 選擇對應環境的安裝命令。對于大多數Linux/Windows用戶,使用 pip install torch torchvision torchaudio(或 Conda 安裝)即可。如果有 NVIDIA GPU,建議安裝帶 CUDA 支持的版本。對于沒有 GPU 的情況,安裝 CPU 版本即可。

  • **TorchVision 等依賴:**本項目需用到 torchvision 來處理圖像數據,以及 PIL(Pillow)用于圖像加載。通常安裝 PyTorch 時會一并安裝 torchvision。可以運行以下命令安裝/升級相關依賴:

    pip install torch torchvision pillow
    
  • **Apple M 系列芯片的 MPS 加速配置:**如果您使用的是搭載 Apple Silicon (M1/M2) 芯片的 Mac,PyTorch 已提供對蘋果 GPU 的原生支持,即 MPS 后端(Metal Performance Shaders)。確保您的 macOS ≥ 12.3 且已安裝 Xcode Command Line Tools(終端執行 xcode-select --install)。安裝 PyTorch 時,需要安裝支持 MPS 的版本(PyTorch 1.12 起已內置支持)。例如,可以通過以下命令安裝帶 MPS 支持的 PyTorch:

    pip install --pre torch torchvision torchaudio \ --extra-index-url https://download.pytorch.org/whl/nightly/cpu
    

    📋 **說明:**目前穩定版 PyTorch 已支持 MPS,但官方仍建議在 Mac 上使用最新的預覽版/夜ly版以獲取最新的性能改進。上面命令中的 --pre 選項可安裝 nightly 預覽版。如不確定,可在 PyTorch 官網安裝頁面選擇 Metal (MPS) 作為設備獲取對應命令。

安裝完成后,建議驗證一下 PyTorch 是否正確檢測到了 Apple GPU。運行以下簡單腳本,如果輸出張量設備是 mps:0 則表示 MPS 可用:

import torch
print(torch.backends.mps.is_available())        # 是否支持 MPS
print(torch.backends.mps.is_built())            # PyTorch 是否編譯了 MPS 支持if torch.backends.mps.is_available():mps_device = torch.device("mps")x = torch.ones(1, device=mps_device)print(x)  # 正常應輸出: tensor([1.], device='mps:0')
else:print("MPS device not found.")

如上所示,torch.backends.mps.is_available() 返回 True 并打印出 tensor([1.], device='mps:0') 則說明已成功配置使用 Apple 芯片的 GPU 加速。如果返回 False,請檢查 PyTorch 版本和安裝渠道是否正確,并確保安裝了 libomp 等必要依賴。

完成上述環境配置后,我們即可開始項目的代碼實現。

模型結構講解

本項目在 GitHub 提供了自定義的卷積神經網絡模型 CatsDogsNet 來完成貓狗二分類。該模型是一個典型的 CNN,由卷積層池化層全連接層疊加構成,用于從輸入圖像中提取特征并輸出預測類別。設計理念上,模型盡量簡潔以降低訓練難度,同時具備足夠的表達能力來區分貓和狗這兩類圖像。網絡的 forward 流程 大體如下:

圖 1:典型卷積神經網絡結構示意圖。圖中示例 CNN 模型通過多次卷積+池化層提取圖像特征,最后展平并連接全連接層實現分類(輸出層可根據任務設定為2個神經元表示貓或狗)。該結構可視為本項目 CatsDogsNet 模型的簡化概括。

CatsDogsNet 包含若干連續的卷積塊用于特征提取。每個卷積塊通常包括一個卷積層(激活函數采用 ReLU)及一個 Max Pooling 層對特征圖進行下采樣,從而逐步在空間維度壓縮數據、提取更抽象的特征。經過多次卷積和池化后,模型使用 Flatten 將特征圖展開為一維向量,并通過若干全連接層(激活函數一般為 ReLU,最后一層輸出兩個神經元對應“貓”或“狗”)來完成分類決策。輸出層通常不使用激活函數,將原始輸出 logits 直接交給損失函數(如交叉熵)計算。下面是一個簡化的模型代碼結構示例:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass CatsDogsNet(nn.Module):def __init__(self):super(CatsDogsNet, self).__init__()# 卷積層: 輸入3通道(RGB),輸出32通道,卷積核3x3self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)self.pool = nn.MaxPool2d(2, 2)  # 2x2 最大池化# 全連接層: 假設輸入圖像經過三次池化后尺寸為 8x8,則展平后長度 128*8*8self.fc1 = nn.Linear(128 * 8 * 8, 64)   # 隱藏層,全連接self.fc2 = nn.Linear(64, 2)             # 輸出層,2分類def forward(self, x):# 三層卷積 + ReLU + 池化x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = self.pool(F.relu(self.conv3(x)))# 展平并通過全連接層x = torch.flatten(x, 1)         # 展平,中間的1表示從batch維度后展開x = F.relu(self.fc1(x))x = self.fc2(x)                # 輸出兩個logits,不經過激活return x

上述代碼展示了 CatsDogsNet 的典型結構:包含3個卷積層(通道數逐步擴大為32→64→128)、每個卷積層后跟一個 2×2 最大池化層將特征圖尺寸減半,最終經展平后接入2層全連接網絡。需要注意的是,self.fc1 中輸入張量長度與圖像尺寸有關。我們假設此模型對圖像做了縮放處理,使得原始輸入經過三次池化后大小為 8×8。如果實際采用不同的輸入尺寸,應相應調整此處線性層的輸入特征數。CatsDogsNet 通過如上結構,實現對輸入圖像逐級提取高級語義特征,再映射到分類輸出。在訓練時會使用交叉熵損失(PyTorch 的 nn.CrossEntropyLoss)結合 Softmax,將模型輸出的兩個實數 logits 轉換為概率分布并計算損失。

模型設計理念方面,由于貓狗分類只涉及兩個類別,因此無需過于復雜的網絡。上述 CNN 網絡參數規模適中,既有足夠的卷積層深度來學習到判別貓與狗的特征模式(如毛發紋理、面部輪廓等),又通過池化和較小的全連接層防止參數過多導致過擬合。在實驗中,這樣的簡單 CNN 模型經過20 個 epoch訓練即可達到約 95% 的驗證準確率(實際效果還取決于訓練細節和數據增強策略)。總之,CatsDogsNet 為初學者提供了一個良好的起點,理解其結構有助于我們掌握卷積神經網絡在圖像分類中的工作原理。

數據準備

訓練一個可靠的模型離不開高質量的數據。Kaggle 提供的貓狗圖片數據集是本項目的數據來源,其中包含約 2.5 萬張貓狗照片,已按文件名標注類別(文件名包含 “cat” 或 “dog”)。下面我們介紹如何獲取并整理該數據集供 PyTorch 使用:

  1. **下載數據集:**訪問 Kaggle 官方的 “Dogs vs. Cats” 比賽頁面或直接搜索公開數據集 “Cats and Dogs”. 您需要登錄 Kaggle 賬號方可下載。下載得到的壓縮包包括 train.zip(訓練集,包含帶標簽的貓狗圖片)和 test.zip(測試集,無標簽,本項目可不使用)。訓練集約 543MB,包含 25,000 張 JPG 圖片。

  2. **解壓并劃分數據:**將下載的 train.zip 解壓。Kaggle 提供的訓練圖片默認都在同一個文件夾下,文件名格式如 cat.1234.jpgdog.9876.jpg 表示類別和編號。為了方便 PyTorch 訓練,我們需要將數據按類別和用途整理成以下目錄結構:

    data/cat_dog/ 
    ├── train/ 
    │   ├── cat/  (貓圖片若干…)
    │   └── dog/  (狗圖片若干…)
    └── val/├── cat/  (貓圖片若干…)└── dog/  (狗圖片若干…)
    

    即在根數據目錄下按 train(訓練集)和 val(驗證集)劃分,每個里面再建 catdog 兩個子文件夾,分別存放對應類別的圖片。劃分驗證集的方法有多種,可以簡單地從訓練集中抽取一部分作為驗證。例如,將訓練集中10%(2500 張左右)的圖片移動到 val 目錄下(貓狗各約1250張)。確保訓練集和驗證集中貓狗樣本均衡。這樣能夠在訓練過程中評估模型在未見過的數據上的表現。

    💡 小提示:為確保隨機性,可編寫腳本按隨機抽樣劃分,或者手動挑選文件名序號的一段作為驗證集(例如貓圖片 cat.0.jpgcat.1249.jpg 作為驗證,其余為訓練)。只要保證劃分時不同集合之間沒有重復且分布均勻即可。

  3. **準備數據加載:**整理好目錄后,PyTorch 的數據加載工具如 torchvision.datasets.ImageFolder 可以直接使用該文件夾結構。ImageFolder會將每個子文件夾名視為類別名,并為訓練和驗證集分別創建數據集對象。在代碼中,我們稍后會看到,傳入數據路徑后,腳本會自行讀取 train/val/ 子目錄的數據用于訓練和評估。

完成以上步驟后,數據即告準備就緒。總計訓練集應有約 22500 張圖片(貓狗各11250),驗證集約2500張(貓狗各1250),當然具體數量取決于您的劃分比例。如果不劃分驗證集也可以直接用Kaggle原始訓練集訓練,然后以Kaggle提供的測試集做最終預測評估,但一般建議留出一部分驗證數據以調整模型和防止過擬合。

訓練流程詳解

有了數據和模型結構,我們就可以開始模型的訓練。本項目的訓練腳本支持通過命令行參數控制訓練過程。假設已經按前述步驟準備好數據集目錄,訓練命令格式大致如下:

$ python main.py --epochs 10 --batch-size 32 --data ./data/cat_dog --lr 0.001 --device mps

上面是一個示例命令,其中:

  • --epochs 10 指定訓練輪數為 10。您可以根據數據大小和模型收斂情況調整epoch數量。
  • --batch-size 32 指定每批次訓練使用 32 張圖片。批量大小可視顯存/內存調整,一般 32 或 64 常見。
  • --data ./data/cat_dog 指向我們整理的數據集根目錄,代碼會自動尋找其中的 train/val/ 子目錄。
  • --lr 0.001 設置初始學習率,這里使用了常用的 1e-3。
  • --device mps 指定使用 Apple M1/M2 GPU 訓練(若省略則腳本會自動選擇可用的 GPU/CPU)。

**提示:**實際項目中參數名稱可能略有差異,請根據 GitHub 項目提供的 README 或 main.py --help 查看支持的參數。常見的還包括 --momentum(動量因子)、--weight-decay(權重衰減)等超參數,您可根據需要調整。

啟動訓練后,腳本將開始循環遍歷數據集進行模型優化,并在終端打印訓練日志,包括每個 epoch 的損失值和準確率等信息(若實現了實時日志)。一個典型的訓練日志輸出示例如下:

Epoch 1/10:- Train Loss: 0.6534, Train Acc: 72.1%- Val Loss: 0.5908, Val Acc: 78.5%Epoch 2/10:- Train Loss: 0.5371, Train Acc: 80.4%- Val Loss: 0.4986, Val Acc: 82.7%... (中間略) ...Epoch 10/10:- Train Loss: 0.3015, Train Acc: 88.9%- Val Loss: 0.3362, Val Acc: 86.4%Training complete. Best Val Acc: 86.4% at epoch 10. Model saved to ./weights/best_model.pth

如上日志所示,隨著 epoch 遞增,訓練損失 (Train Loss) 通常逐步降低,訓練準確率 (Train Acc) 提升。同時驗證集準確率 (Val Acc) 也在上升但可能在后期趨于穩定甚至略有波動,這是正常現象。訓練完成后,腳本會打印最佳驗證準確率,并提示模型已保存。例如在該示例中,epoch 10 達到最佳 86.4% 驗證準確率,并將模型參數保存到了 ./weights/best_model.pth(保存路徑可能因實現而異,請以實際輸出為準)。

**模型保存路徑說明:**為了在訓練結束后使用模型,我們需要保存模型參數。多數腳本會在驗證準確率提升時保存 “最佳模型” 的權重文件。例如,上述日志表明模型保存在 weights 子目錄下命名為 best_model.pth。在本項目中,默認會保存最優模型參數供后續評估和推理使用。如果您希望指定保存路徑或文件名,可以查看腳本是否提供了諸如 --save-dir--checkpoint 等參數來自定義。一般而言,保存的文件格式為 .pth.pt,可使用 torch.load() 加載。在訓練過程中也可能會保存最新checkpoint(例如 checkpoint.pth),以便意外中斷時恢復訓練。

至此,我們已經完成模型的訓練過程。經過若干 epoch 后,CatsDogsNet 應已學會區分貓狗,達到了一定的分類準確率。接下來,我們將使用驗證集評估模型性能,并嘗試對單張圖片進行推理預測。

模型評估

在訓練完成后,我們需要在驗證集上評估模型的性能,以了解模型對未見數據的泛化能力。本項目的代碼提供了 --evaluate 等參數來方便地進行驗證評估。通常的評估用法是加載訓練好的模型權重,然后在驗證集上計算準確率等指標。假設我們剛才訓練保存了模型 best_model.pth,可以使用以下命令進行評估:

$ python main.py --data ./data/cat_dog --evaluate --resume ./weights/best_model.pth

上述命令中,--evaluate 標志表示程序只執行驗證評估而不進行訓練循環,--resume ./weights/best_model.pth 用于指定要加載的模型權重文件路徑(如果腳本在內部已經硬編碼加載最佳模型,則可能不需要顯式提供)。執行后,腳本會加載模型并在驗證集上逐批運行 forward,統計預測結果。

**輸出的評估指標:**評估模式下一般會打印模型在驗證集上的總體準確率以及每類的分類準確率等信息。例如,可能看到類似輸出:

Evaluation on validation set:
- Overall Accuracy: 87.2%
- Cat class: Precision 0.85, Recall 0.89, Accuracy 86.0%
- Dog class: Precision 0.89, Recall 0.85, Accuracy 88.4%

上述結果只是示意,實際輸出格式取決于實現。有的代碼簡單地給出總體準確率(即正確分類的樣本占總驗證集樣本的比例)。而本項目特別提到可以查看“各類準確率”,說明評估時統計了逐類別的準確率。對于二分類任務,各類準確率指模型對貓圖片的正確識別率和對狗圖片的正確識別率。例如,上例中的 “Cat class Accuracy 86.0%” 表示在驗證集中所有貓圖片中有 86% 被正確預測為貓。

除了準確率,評價模型性能還可以考察精確率(Precision)、**召回率(Recall)**和 F1 分數等指標,尤其在各類別樣本不均衡時這些指標更加有意義。但由于貓狗數據集中兩類樣本非常均衡(各一半),準確率已經足夠直接地反映模型性能。在本任務中,我們期望模型在驗證集上的總體準確率能達到 80%-90% 左右;若顯著低于這一水平,可能需要檢查是否存在過擬合或欠擬合,并相應調整模型或超參數。

完成驗證評估后,如果對結果滿意,就可以進入下一步:使用訓練好的模型對任意真實圖像進行預測,體驗模型的實際識別能力。

單張圖片推理

訓練和評估證明模型有效后,我們可以編寫推理腳本,對單張圖片進行類別預測。推理過程包括:加載訓練好的模型、對輸入圖片做預處理、用模型執行前向推斷、并輸出預測結果。以下是一個完整的推理示例代碼:

import torch
from PIL import Image
from torchvision import transforms
from model import CatsDogsNet  # 假設模型類定義在 model.py# 1. 加載訓練好的模型權重
model = CatsDogsNet()
model.load_state_dict(torch.load("weights/best_model.pth", map_location="cpu"))
model.eval()  # 設置為評估模式# 2. 定義圖像預處理流程
transform = transforms.Compose([transforms.Resize((64, 64)),   # 調整圖像尺寸以匹配模型輸入大小transforms.ToTensor(),         # 轉為Tensor張量,并將像素值歸一化到[0,1]# transforms.Normalize(mean=[...], std=[...])  # 若訓練有歸一化則需相同處理
])# 3. 載入待預測的圖片
img_path = "test_images/my_pet.jpg"  # 替換為實際圖片路徑
image = Image.open(img_path)
img_tensor = transform(image).unsqueeze(0)  # 增加batch維度# 4. 模型推理得到預測
output = model(img_tensor)
pred = torch.argmax(output, dim=1).item()  # 獲取概率最大類別的索引# 5. 輸出結果
classes = ["cat", "dog"]
print(f"模型預測: {classes[pred]}")

讓我們逐步解釋上述代碼:

  • **加載模型權重:**首先實例化了 CatsDogsNet 網絡,并使用 load_state_dict 加載訓練保存的參數(請確認路徑正確)。map_location="cpu" 確保無論您是否有 GPU,模型都被加載到 CPU 上。如果有可用 GPU,也可以將模型 .to(device) 移動到相應設備以加速推理。然后調用 model.eval() 將模型切換到評估模式,關閉 Dropout 等隨機行為,以保證推理結果穩定。

  • **預處理輸入:**這里定義了一個 torchvision 的預處理 transforms.Compose,包含將圖像縮放到 64×64(需與訓練時的輸入大小一致)和轉換為張量兩個步驟。如果訓練時還對圖像進行了歸一化(Normalize),也應使用相同的均值和標準差在此進行歸一化。這一點很重要,保證推理時圖像的處理方式與訓練時完全相同,模型才能正確解讀輸入。

  • **讀取與轉換:**利用 PIL 庫打開圖像,并應用預處理,將其變為 shape 為 (1, 3, 64, 64) 的四維張量(unsqueeze(0) 在最前加一維 batch 大小)。

  • 模型推理:將預處理后的圖像張量輸入模型,得到輸出張量 output。對于二分類任務,output 大小為 (1, 2),分別對應模型對 “cat” 和 “dog” 兩種類別的置信度(即 logits)。使用 torch.argmax 獲得最大值的索引,即模型預測的類別編碼(0或1)。

  • **解釋結果:**最后,根據類別索引輸出可讀結果。“cat” 通常映射為索引 0,“dog” 映射為 1(這取決于 ImageFolder 對子文件夾的排序,如未改動數據集文件夾名則貓在前)。在代碼中我們通過一個列表 classes = ["cat", "dog"] 來進行映射,并打印出預測類別。

完成上述腳本后,運行它即可針對指定的 my_pet.jpg 圖像輸出模型預測。例如,若輸出為“模型預測: dog”,則說明模型認為圖片中的動物是狗。您可以嘗試多張圖片,檢驗模型的識別效果。如果模型訓練充分,通常對于清晰的貓或狗照片能有較高置信度的正確判斷。但在一些邊緣情況,例如幼貓幼狗、品種特殊或者圖像模糊,模型可能會出錯,這是進一步改進模型需要考慮的方向。

Apple MPS 加速實踐

在Apple Silicon設備上訓練深度學習模型,MPS 后端的引入極大地方便了利用 GPU 加速。下面我們分享在本項目中使用 MPS 加速的經驗和性能觀察:

**1. 啟用 MPS 設備:**前文環境配置中已經介紹了如何檢測 MPS。實際訓練時,我們需要將模型和數據遷移到 MPS 設備。例如,在代碼中可以這樣設置設備:

device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
model.to(device)
...
for images, labels in train_loader:images, labels = images.to(device), labels.to(device)...

以上邏輯與使用 CUDA 類似,只是將設備名換成 "mps"。很多訓練腳本已內置了這種自動選擇邏輯,即優先用 CUDA,其次 MPS,最后 CPU。當使用 --device mps 參數時,代碼會強制使用 MPS(如果可用)。需要注意的是,在Mac上首次運行模型時,可能會有編譯 Metal 內核的開銷,導致第一個 epoch略慢,但之后epochs速度會明顯提升。

2. 性能變化分析:根據我們的測試,在 Apple M1 芯片上利用 MPS 訓練本項目的 CNN,相較于純 CPU 訓練有顯著的提速。比如,對于一個小批量(64張圖片)的前向傳播,M1 GPU 上耗時約 0.0025 秒,而 CPU 上約 0.0045 秒——大約快了將近一倍。這個加速比會隨模型復雜度和批量大小而變化:對較小的模型或批次,MPS 的延遲優勢已經可見;隨著模型和數據規模增大,GPU 的并行計算能力將發揮更大作用,通常能獲得數倍于 CPU 的吞吐量提升。

然而也要看到,當前 MPS 后端相較成熟的 CUDA 還在不斷改進中。一些運算在早期版本的 PyTorch 上未優化完全,可能出現GPU利用率不高內存開銷大的情況。不過隨著 PyTorch 更新,這些問題在逐步解決。基于 PyTorch 2.x 版本的測試,MPS 訓練已相當穩定,在大部分計算密集型任務上都優于 CPU。同時,Apple GPU 的統一內存架構帶來了便利——模型和數據可以共享內存,無需像 CUDA 那樣頻繁拷貝,這對中等規模的數據處理十分高效。

綜合來看,在 Apple M 系列芯片上開啟 MPS 后端進行訓練,可以大幅縮短模型收斂時間。例如,本項目在 M1 芯片上進行 10 個 epoch 訓練,實際用時比 CPU 版本減少了將近 60-70%(具體數值視模型和實現而定)。因此,如果您使用的是 Macbook 等搭載 Apple Silicon 的設備,強烈建議啟用 MPS 來加速深度學習實驗。當然,如果追求更高性能,配備 NVIDIA CUDA GPU 的工作站仍然是更強大的選擇。但對于輕量級研究和開發,Apple MPS 提供了一個不容忽視的高效選項。

總結與擴展建議

通過本次實戰,我們從零開始搭建了一個基于 PyTorch 的貓狗分類器,涵蓋了數據準備模型設計訓練調試評估推理的完整流程。我們使用簡單的卷積神經網絡在經典的 Kaggle 貓狗數據集上取得了不錯的效果,展示了深度學習解決圖像二分類問題的基本范式。在這個過程中,我們還體驗了在 Apple Silicon 上利用 MPS 加速訓練的便利。

為了進一步提高和擴展,本項目有許多可以改進和延伸的方向:

  • 引入預訓練模型提升精度:當前使用的 CatsDogsNet 屬于淺層網絡,如果希望取得更高的準確率,可以使用遷移學習。例如加載 torchvision 提供的 ResNet-18/34/50 等在 ImageNet 上預訓練的模型,然后微調最后的全連接層用于貓狗分類。借助預訓練模型的強大特征提取能力,貓狗分類的準確率有望突破 95%,甚至接近 99%。

  • 拓展到多類別分類:本項目聚焦于二分類,但流程同樣適用于多分類任務。您可以嘗試將其拓展到區分更多種類的動物(例如增加“鳥”“兔子”等類別)。所需改動主要是:準備包含多類別的新數據集、將模型輸出神經元數修改為新類別數、以及相應地調整損失函數和評價指標。PyTorch 的 CrossEntropyLoss 可直接用于多分類。通過這樣的練習,可以鞏固對通用圖像分類任務的理解。

  • 豐富數據增強與正則化:為了進一步提升模型泛化能力,可以在數據預處理時加入更多數據增強操作,如隨機裁剪、旋轉、顏色抖動等,使模型對各種圖像變換更加魯棒。同時,可考慮加入 Dropout 層、L2正則等抑制過擬合的方法。如果有條件采集更多貓狗圖片來擴充訓練集,也會明顯改善模型表現。

  • 模型部署與應用:完成模型訓練后,您可以嘗試將模型部署為實際應用。例如,使用 PyTorch JIT 將模型導出,或者借助 Gradio 快速搭建一個交互式網頁演示,讓用戶上傳貓或狗的照片得到預測結果。這不僅檢驗模型實用性,也是將模型產品化的一步。

通過上述擴展練習,您將對圖像分類項目有更深入的體會。從本次貓狗分類實戰可以看到,PyTorch 為開發者提供了靈活高效的工具鏈,使我們能夠專注于模型本身的設計與改進。無論是掌握卷積神經網絡的原理,還是了解不同硬件加速的差異,這些經驗都為以后挑戰更復雜的計算機視覺任務打下基礎。希望您通過本教程掌握的知識,能夠應用到更多有趣的深度學習項目中,不斷探索和進步!

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

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

相關文章

SwiftUI 7(iOS 26 / iPadOS 26)中玻璃化標簽頁的全新玩法

🍸 Liquid Glass 登場:界面設計煥然一新 WWDC25 可謂驚喜連連,其中最引人矚目的變革之一,莫過于蘋果推出的全新跨平臺設計語言 —— Liquid Glass(液態玻璃)。這一設計風格涵蓋了從按鈕到導航欄&#xff0…

PDF處理控件Spire.PDF教程:在Java中讀取PDF,提取文本、圖片和表格

在數據驅動的現代開發中,高效處理 PDF 文檔已成為 Java 開發者不可或缺的核心能力。無論是處理各類發票掃描件、業務分析報告,還是包含豐富圖表的技術文檔,掌握 Java 版的 PDF 解析技術都將大幅提升數據處理效率,充分釋放文檔中的…

跨平臺游戲引擎 Axmol-2.7.0 發布

Axmol 2.7.0 版本是一個以錯誤修復和功能改進為主的次要LTS長期支持版本 🙏感謝所有貢獻者及財務贊助者:scorewarrior、peterkharitonov、duong、thienphuoc、bingsoo、asnagni、paulocoutinhox 重大變更 Android Studio 最低版本要求升級至 2025.1.1…

XML 筆記

<image src"hue.gif" width"100" height"auto" align"left"/> <br/> 換行 在 XML 中&#xff0c;<![CDATA[ 和 ]]> 用于定義一個 CDATA 節&#xff08;Character Data Section&#xff09;。CDATA 節是用于將一段…

Python實現優雅的目錄結構打印工具

Python實現優雅的目錄結構打印工具 在軟件開發、系統管理和日常工作中&#xff0c;我們經常需要查看和分析目錄結構。 工具功能概述 這個DirectoryPrinter類提供了以下功能&#xff1a; 遞歸打印目錄結構可配置是否顯示隱藏文件可設置最大遞歸深度自定義縮進和文件/文件夾符…

【Python】文件打開:with open具體解析

示例 # 使用 with 語句打開文件并讀取內容 with open(pi.txt, r) as file_object:contents file_object.read()print(contents) # 文件在代碼塊結束后自動關閉with 解析 with 是 Python 中的上下文管理器語法&#xff0c;用于確保某個操作完成后自動執行清理操作。它常用于文…

Acrel-1000系列分布式光伏監控系統在湖北荊門一馬光彩大市場屋頂光伏發電項目中應用

摘 要&#xff1a;分布式光伏發電能夠對日益嚴重的環境壓力起到有效緩解作用,在當前對環境保護需求越來越大情況下,發電行業在發展中不但要提升發電效率,同時也需要降低成本。分布式光伏發電主要是利用風能和太陽能等可再生清潔能源進行發電,對于空氣質量具有改善效果,和傳統發…

CentOS-6與CentOS-7的網絡配置IP設置方式對比 筆記250706

CentOS-6與CentOS-7的網絡配置IP設置方式對比 筆記250706 1?? 參考 1 CentOS-6 與 CentOS-7 的網絡配置IP設置方式對比 CentOS 6 和 CentOS 7 在網絡配置上存在顯著差異&#xff0c;主要體現在配置文件結構、管理工具、服務機制和命令集等方面。以下是兩者的核心對比&#x…

【網絡系列】HTTP 429 狀態碼

博客目錄 HTTP 429 狀態碼的定義與背景產生 429 錯誤的常見場景1. API 速率限制觸發2. 網絡爬蟲行為被檢測3. 分布式拒絕服務(DDoS)防護4. 用戶/IP 特定限流策略5. 應用程序邏輯錯誤 深入解讀 429 響應的關鍵頭部信息Retry-After 頭部X-RateLimit 系列頭部RateLimit 標準化頭部…

C++無鎖數據結構:CAS(Compare-and-Swap)

在高并發場景下&#xff0c;傳統鎖機制帶來的線程阻塞和上下文切換開銷成為性能瓶頸。無鎖數據結構通過原子操作實現線程安全&#xff0c;避免了鎖的使用&#xff0c;成為高性能系統的關鍵技術。本文將深入探討C中基于CAS&#xff08;Compare-and-Swap&#xff09;的無鎖數據結…

【數字圖像處理】

數字圖像處理 緒論1. 數字圖像處理基本概念2. 數字圖像處理系統的組成3. 數字圖像處理技術研究的內容4. 數字圖像處理技術的應用領域5. 圖像處理技術涉及的學科領域 圖像處理基礎1. 電磁波譜與可見光譜2. 人眼的亮度視覺特性3. 圖像的表示4. 空間分辨率和灰度級分辨率5. 像素間…

linux chrome瀏覽器打不開了

報錯信息 通過terminal執行google-chrome [12714:12714:0706/223620.723519:ERROR:chrome/browser/process_singleton_posix.cc:358] The profile appears to be in use by another Google Chrome process (54949) on another computer (192.168.0.17). Chrome has locked t…

Python:模塊

一、Python模塊基礎概念 1. 什么是Python模塊&#xff1f; 在 Python 中&#xff0c;模塊&#xff08;Module&#xff09; 是一個包含 Python 代碼的文件&#xff08;擴展名為 .py&#xff09;&#xff0c;用于組織代碼、實現功能復用和命名空間管理。模塊可以包含變量、函數…

C 語言指針與作用域詳解

一、指針基礎概念 &#xff08;一&#xff09;指針的本質 指針是 C 語言中一個重要的概念&#xff0c;其本質是內存地址。在計算機內存中&#xff0c;每個字節都有唯一的編號&#xff0c;這個編號就是我們所說的內存地址&#xff0c;而指針變量就是用于存儲這些內存地址的變量…

解鎖阿里云ACK:開啟Kubernetes容器化應用新時代

引言&#xff1a;云原生時代下的 ACK 在當今數字化飛速發展的時代&#xff0c;云原生技術正以前所未有的速度改變著軟件開發和部署的格局。隨著企業對應用敏捷性、彈性擴展以及成本優化的需求日益增長&#xff0c;云原生已成為眾多企業實現數字化轉型的關鍵路徑。在云原生的技…

【C++基礎】內存管理四重奏:malloc/free vs new/delete - 面試高頻考點與真題解析

在 C/C 編程中&#xff0c;內存管理是核心基礎技能&#xff0c;而malloc/free和new/delete作為兩套內存分配釋放機制&#xff0c;是面試中高頻出現的考點。 一、內存管理的 "雙生花"&#xff1a;基礎概念解析 1.1 malloc/free&#xff1a;C 語言的內存管家 malloc全…

Dify+Ollama+QwQ:3步本地部署,開啟AI搜索新篇章

如何來評價本地化部署的價值與優勢分析&#xff1a; 成本優化與隱私保障 自定義搜索插件&#xff0c;告別信息過載 一鍵生成報告、分析&#xff0c;效率翻倍&#xff01; 接下來我們就嘗試跟隨來部署本地的價值所在! 1&#xff1a;安裝Ollama & 部署QwQ模型 1.1 安裝O…

FAISS 簡介及其與 GPT 的對接(RAG)

什么是 FAISS&#xff1f; FAISS (Facebook AI Similarity Search) 是 Facebook AI 團隊開發的一個高效的相似性搜索和密集向量聚類的庫。它主要用于&#xff1a; 大規模向量相似性搜索高維向量最近鄰檢索向量聚類 https://github.com/facebookresearch/faissFAISS 特別適合處理…

【Apache Doris 深度實戰:從 MPP 架構到實時分析,解鎖三大數據模型的性能優化秘籍】

一、安裝部署 安裝教程&#xff1a;GitHub地址 Doc文檔&#xff1a;Apache Doris 簡介 - Apache Doris 二、功能及作用 Apache Doris 是一款基于MPP 架構的高性能、實時分析型數據庫。它以高效、簡單和統一的特性著稱&#xff0c;能夠在亞秒級的時間內返回海量數據的查詢結果…

MySQL主從復制與讀寫分離概述

前言&#xff1a; 在數據驅動的現代應用中&#xff0c;數據庫面臨高并發讀寫與海量存儲的雙重挑戰。單一數據庫實例在性能、可用性及擴展性上逐漸成為瓶頸。MySQL主從復制&#xff08;Master-Slave Replication&#xff09;與讀寫分離&#xff08;Read/Write Splitting&#xf…