從代碼學習深度學習 - 使用塊的網絡(VGG)PyTorch版

文章目錄

  • 前言
  • 一、VGG網絡簡介
    • 1.1 VGG的核心特點
    • 1.2 VGG的典型結構
    • 1.3 優點與局限性
    • 1.4 本文的實現目標
  • 二、搭建VGG網絡
    • 2.1 數據準備
    • 2.2 定義VGG塊
    • 2.3 構建VGG網絡
    • 2.4 輔助工具
      • 2.4.1 計時器和累加器
      • 2.4.2 準確率計算
      • 2.4.3 可視化工具
    • 2.5 訓練模型
    • 2.6 運行實驗
  • 總結


前言

深度學習是近年來人工智能領域的重要突破,而卷積神經網絡(CNN)作為其核心技術之一,在圖像分類、目標檢測等領域展現了強大的能力。VGG(Visual Geometry Group)網絡是CNN中的經典模型之一,以其模塊化的“塊”設計和深層結構而聞名。本篇博客將通過PyTorch實現一個簡化的VGG網絡,并結合代碼逐步解析其構建、訓練和可視化過程,幫助讀者從代碼層面理解深度學習的基本原理和實踐方法。我們將使用Fashion-MNIST數據集進行實驗,展示如何從零開始搭建并訓練一個VGG模型。

本文的目標讀者是對深度學習有基本了解、希望通過代碼實踐加深理解的初學者或中級開發者。以下是博客的完整內容,包括代碼實現和詳細說明。


一、VGG網絡簡介

VGG網絡(Visual Geometry Group Network)是由牛津大學視覺幾何組在2014年提出的深度卷積神經網絡(CNN)模型,因其在ImageNet圖像分類競賽中的優異表現而廣為人知。VGG的設計理念是通過堆疊多個小卷積核(通常為3×3)和池化層,構建一個深層網絡,從而提取圖像中的復雜特征。與之前的模型(如AlexNet)相比,VGG顯著增加了網絡深度(常見版本包括VGG-16和VGG-19,分別有16層和19層),并采用統一的模塊化結構,使其易于理解和實現。

1.1 VGG的核心特點

  1. 小卷積核:VGG使用3×3的小卷積核替代傳統的大卷積核(如5×5或7×7)。兩個3×3卷積核的堆疊可以達到5×5的感受野,而參數量更少,計算效率更高,同時增加了非線性(通過更多ReLU激活)。
  2. 模塊化設計:網絡由多個“塊”(block)組成,每個塊包含若干卷積層和一個最大池化層。這種設計使得網絡結構清晰,便于擴展或調整。
  3. 深度增加:VGG通過加深網絡層數(從11層到19層不等)提升性能,證明了深度對特征提取的重要性。
  4. 全連接層:在卷積層之后,VGG使用多個全連接層(通常為4096、4096和1000神經元)進行分類,輸出對應ImageNet的1000個類別。

1.2 VGG的典型結構

以下是VGG-16的結構示意圖,展示了其卷積塊和全連接層的組織方式:

在這里插入圖片描述

上圖中:

  • 綠色方框表示卷積層(3×3卷積核,步幅1,padding=1),對應圖中的“convolution+ReLU”部分(以立方體表示)。這些卷積層負責提取圖像特征,padding=1確保特征圖尺寸在卷積后保持不變。
  • 紅色方框表示最大池化層(2×2,步幅2),對應圖中的“max pooling”部分(以紅色立方體表示)。池化層將特征圖尺寸減半(例如從224×224到112×112),同時保留重要特征。
  • 藍色部分為全連接層,最終輸出分類結果,對應圖中的“fully connected+ReLU”和“softmax”部分(以藍色線條表示)。全連接層將卷積特征展平后進行分類,輸出對應ImageNet的1000個類別。

VGG-16包含13個卷積層和3個全連接層,總計16層(池化層不計入層數)。每個卷積塊的通道數逐漸增加(從64到512),而池化層將特征圖尺寸逐步減半(從224×224到7×7)。

1.3 優點與局限性

優點

  • 結構簡單,易于實現和理解。
  • 小卷積核和深層設計提高了特征提取能力。
  • 在多種視覺任務中表現出色,可作為預訓練模型遷移學習。

局限性

  • 參數量巨大(VGG-16約有1.38億個參數),訓練和推理耗時。
  • 深層網絡可能導致梯度消失問題(盡管ReLU和適當初始化緩解了部分問題)。
  • 對內存和計算資源要求較高,不適合資源受限的設備。

1.4 本文的實現目標

在本文中,我們將基于PyTorch實現一個簡化的VGG網絡,針對Fashion-MNIST數據集(28×28灰度圖像,10個類別)進行調整。我們保留VGG的模塊化思想,但適當減少層數和參數量,以適應較小規模的數據和計算資源。通過代碼實踐,讀者可以深入理解VGG的設計原理及其在實際任務中的應用。

下一節將進入具體的代碼實現部分,逐步搭建VGG網絡并完成訓練。

二、搭建VGG網絡

2.1 數據準備

在開始構建VGG網絡之前,我們需要準備訓練和測試數據。這里使用Fashion-MNIST數據集,這是一個包含10類服裝圖像的灰度圖像數據集,每個圖像大小為28×28像素。以下是數據加載的代碼:

import torchvision
import torchvision.transforms as transforms
from torch.utils import data
import multiprocessingdef get_dataloader_workers():"""使用電腦支持的最大進程數來讀取數據"""return multiprocessing.cpu_count()def load_data_fashion_mnist(batch_size, resize=None):"""下載Fashion-MNIST數據集,然后將其加載到內存中。參數:batch_size (int): 每個數據批次的大小。resize (int, 可選): 圖像的目標尺寸。如果為 None,則不調整大小。返回:tuple: 包含訓練 DataLoader 和測試 DataLoader 的元組。"""# 定義變換管道trans = [transforms.ToTensor()]if resize:trans.insert(0, transforms.Resize(resize))trans = transforms.Compose(trans)# 加載 Fashion-MNIST 訓練和測試數據集mnist_train = torchvision.datasets.FashionMNIST(root="./data",train=True,transform=trans,download=True)mnist_test = torchvision.datasets.FashionMNIST(root="./data",train=False,transform=trans,download=True)# 返回 DataLoader 對象return (data.DataLoader(mnist_train,batch_size,shuffle=True,num_workers=get_dataloader_workers()),data.DataLoader(mnist_test,batch_size,shuffle=False,num_workers=get_dataloader_workers()))

這段代碼定義了load_data_fashion_mnist函數,用于加載Fashion-MNIST數據集并將其封裝成PyTorch的DataLoader對象。transforms.ToTensor()將圖像轉換為張量格式,batch_size控制每個批次的數據量,shuffle=True確保訓練數據隨機打亂以提高模型泛化能力。num_workers通過多進程加速數據加載。

2.2 定義VGG塊

VGG網絡的核心思想是將網絡分解為多個“塊”(block),每個塊包含若干卷積層和一個池化層。以下是VGG塊的實現:

import torch
from torch import nndef vgg_block(num_convs, in_channels, out_channels):layers = []                          # 初始化一個空列表,用于存儲網絡層for _ in range(num_convs):           # 循環 num_convs 次,構建卷積層layers.append(nn.Conv2d(         # 添加一個二維卷積層in_channels,                 # 輸入通道數out_channels,                # 輸出通道數kernel_size=3,               # 卷積核大小為 3x3padding=1))                  # 填充大小為 1,保持特征圖尺寸layers.append(nn.ReLU())         # 添加 ReLU 激活函數in_channels = out_channels       # 更新輸入通道數為輸出通道數,用于下一次卷積layers.append(nn.MaxPool2d(          # 添加一個最大池化層kernel_size=2,                   # 池化核大小為 2x2stride=2))                       # 步幅為 2,縮小特征圖尺寸return nn.Sequential(*layers)        

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

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

相關文章

Baklib激活企業知識管理新動能

Baklib核心技術架構解析 Baklib的底層架構以模塊化設計為核心,融合知識中臺的核心理念,通過分布式存儲引擎與智能語義分析系統構建三層技術體系。數據層采用多源異構數據接入協議,支持文檔、音視頻、代碼片段等非結構化數據的實時解析與分類…

小智機器人中的部分關鍵函數,FreeRTOS中`xEventGroupWaitBits`函數的詳細解析

以下是對FreeRTOS中xEventGroupWaitBits函數的詳細解析: 函數功能 xEventGroupWaitBits用于在事件組中等待指定的位被設置。它可以配置為等待任意一個位或所有位,并支持超時機制。 注意:該函數不能在中斷中調用。 函數原型 EventBits_t xEv…

關注分離(Separation of Concerns)在前端開發中的實踐演進:從 XMLHttpRequest 到 Fetch API

關注分離(Separation of Concerns)在前端開發中的實踐演進:從 XMLHttpRequest 到 Fetch API 一、關注分離的核心價值 關注分離(SoC)是軟件工程領域的重要設計原則,強調將系統分解為不同維度的功能模塊&am…

C之(16)scan-build與clang-tidy使用

C之(16)scan-build與clang-tidy使用 Author: Once Day Date: 2025年3月29日 一位熱衷于Linux學習和開發的菜鳥,試圖譜寫一場冒險之旅,也許終點只是一場白日夢… 漫漫長路,有人對你微笑過嘛… 全系列文章可參考專欄: Linux實踐記錄_Once_da…

在 Vue 項目中快速集成 Vant 組件庫

目錄 引言一、找到 src 下的App.js 寫入代碼。二、安裝Vant三、解決 polyfill 問題四、查看依賴五、配置webpack六、引入 Vant七、在組件中使用 Vant八、在瀏覽器中查看樣式總結 引言 在開發移動端 Vue 項目時,選擇一個高效、輕量且功能豐富的組件庫是提升開發效率…

“GPU 擠不動了?”——聊聊基于 GPU 的計算資源管理

“GPU 擠不動了?”——聊聊基于 GPU 的計算資源管理 作者:Echo_Wish “老板:為什么 GPU 服務器卡得跟 PPT 一樣?” “運維:我們任務隊列爆炸了,得優化資源管理!” 在 AI 訓練、深度學習、科學計算的場景下,GPU 計算資源已經成為香餑餑。但 GPU 服務器貴得離譜,一臺 A…

AI滲透測試:網絡安全的“黑魔法”還是“白魔法”?

引言:AI滲透測試,安全圈的“新魔法師” 想象一下,你是個網絡安全新手,手里攥著一堆工具,正準備硬著頭皮上陣。這時,AI蹦出來,拍著胸脯說:“別慌,我3秒掃完漏洞&#xff0…

(二)GEE基礎學習初探及案例詳解【20250330】

Google Earth Engine(GEE)是由谷歌公司開發的眾多應用之一。借助谷歌公司超強的服務器運算能力以及與NASA的合作關系,GEE平臺將Landsat、MODIS、Sentinel等可以公開獲取的遙感圖像數據存儲在谷歌的磁盤陣列中,使得GEE用戶可以方便的提取、調用和分析海量…

redhat認證是永久的嗎

?認證有效期 ?紅帽認證一般有效期為3年?(如RHCSA、RHCE、RHCA等),從通過考試之日起計算。 ?例外:部分基礎或工程師認證(如Red Hat Certified Engineer)有效期為三年時間,以官方最新政策為準…

git --- cherry pick

git --- cherry pick cherry pick cherry pick Cherry Pick 是 Git 中的一個操作,它允許你選擇某個分支的某次(或多次)提交,并將其應用到當前分支,而不會合并整個分支的所有更改。 cherry pick 的作用 只提取某個特定的…

妙用《甄嬛傳》中的選妃來記憶概率論中的乘法公式

強烈推薦最近在看的不錯的B站概率論課程 《概率統計》正課,零廢話,超精講!【孔祥仁】 《概率統計》正課,零廢話,超精講!【孔祥仁】_嗶哩嗶哩_bilibili 其中概率論中的乘法公式,老師用了《甄嬛傳…

AI 的出現是否能替代 IT 從業者?

AI 的出現是否能替代 IT 從業者? AI 的快速發展正在深刻改變各行各業,IT 行業也不例外。然而,AI 并非完全替代 IT 從業者,而是與其形成互補關系。本文將從 AI 的優勢、IT 從業者的不可替代性、未來趨勢等方面,探討 AI…

【leetcode100】有效的括號

1、題目描述 給定一個只包括 (,),{,},[,] 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足: 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一個對應的…

為什么使用Flask + uWSGI + Nginx 部署服務?

概述 在Python開發的web應用中,我們通常能夠看到flask、uWSGI、Nginx出現在一起,他們之間的關系是什么?為什么總是被應用在一起?  三者共同使用為了實現一個目的:客戶端向服務端發送數據請求,服…

接口等冪處理

介紹 ? 什么是等冪(Idempotency)? 等冪 無論這個操作被執行多少次,結果都是一樣的,不會因為多次執行而產生副作用。 通俗一點說:“點一次和點一百次,效果是一樣的。” ? 在接口中&#xff0…

P1090合并果子(優先隊列)

洛谷題目 這里使用的是優先隊列&#xff0c;非常簡單 首先讓我們一起來學習一下優先隊列&#xff08;默認是從大到小來排列&#xff09; 首先要使用頭文件 #include<queue> using namespace std; 然后聲明有限隊列 priority_queue<int> a; priority_queue&…

藍橋杯備考---->并查集之 Lake Counting

這道題就統計有多少個連通塊就行了 這時候我們又需要把二維轉成一維了&#xff0c;也就是把每一個格子都給一個編號 當我們合并連通塊的時候&#xff0c;其實是只需要四個方向的 因為我們是從上往下遍歷的&#xff0c;我們遍歷到某個位置的時候&#xff0c;它已經和上面部分…

React受控表單綁定

受控表單綁定 在 React 中&#xff0c;受控組件&#xff08;Controlled Component&#xff09;是指表單元素的值由 React 組件的 state 管理&#xff0c;React 通過 onChange 事件監聽輸入變化&#xff0c;并實時更新 state&#xff0c;從而控制表單輸入值。 為什么要使用受控…

8、linux c 信號機制

一、信號概述 1. 信號概念 信號是一種在軟件層次上對中斷機制的模擬&#xff0c;是一種異步通信方式。信號的產生和處理都由操作系統內核完成&#xff0c;用于在進程之間傳遞信息或通知某些事件的發生。 2. 信號的產生 信號可以通過以下方式產生&#xff1a; 按鍵產生&…

CSP-J 2019 入門級 第一輪(初賽) 完善程序(2)

【題目】 CSP-J 2019 入門級 第一輪&#xff08;初賽&#xff09; 完善程序&#xff08;2&#xff09; &#xff08;計數排序&#xff09;計數排序是一個廣泛使用的排序方法。下面的程序使用雙關鍵字計數排序&#xff0c;將n對10000 以內的整數&#xff0c;從小到大排序。 例如…