【現代深度學習技術】現代卷積神經網絡04:含并行連接的網絡(GoogLeNet)

在這里插入圖片描述

【作者主頁】Francek Chen
【專欄介紹】 ? ? ?PyTorch深度學習 ? ? ? 深度學習 (DL, Deep Learning) 特指基于深層神經網絡模型和方法的機器學習。它是在統計機器學習、人工神經網絡等算法模型基礎上,結合當代大數據和大算力的發展而發展出來的。深度學習最重要的技術特征是具有自動提取特征的能力。神經網絡算法、算力和數據是開展深度學習的三要素。深度學習在計算機視覺、自然語言處理、多模態數據分析、科學探索等領域都取得了很多成果。本專欄介紹基于PyTorch的深度學習算法實現。
【GitCode】專欄資源保存在我的GitCode倉庫:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。

文章目錄

    • 一、Inception塊
    • 二、GoogLeNet模型
    • 三、訓練模型
    • 小結


??在2014年的ImageNet圖像識別挑戰賽中,一個名叫GoogLeNet的網絡架構大放異彩。GoogLeNet吸收了NiN中串聯網絡的思想,并在此基礎上做了改進。GoogLeNet論文的一個重點是解決了什么樣大小的卷積核最合適的問題。畢竟,以前流行的網絡使用小到 1 × 1 1 \times 1 1×1,大到 11 × 11 11 \times 11 11×11的卷積核。該論文的一個觀點是,有時使用不同大小的卷積核組合是有利的。本節將介紹一個稍微簡化的GoogLeNet版本:我們省略了一些為穩定訓練而添加的特殊特性,現在有了更好的訓練方法,這些特性不是必要的。

一、Inception塊

??在GoogLeNet中,基本的卷積塊被稱為Inception塊(Inception block)。這很可能得名于電影《盜夢空間》(Inception),因為電影中的一句話“我們需要走得更深”(“We need to go deeper”)。

在這里插入圖片描述

圖1 Inception塊的架構

??如圖1所示,Inception塊由四條并行路徑組成。前三條路徑使用窗口大小為 1 × 1 1\times 1 1×1 3 × 3 3\times 3 3×3 5 × 5 5\times 5 5×5的卷積層,從不同空間大小中提取信息。中間的兩條路徑在輸入上執行 1 × 1 1\times 1 1×1卷積,以減少通道數,從而降低模型的復雜性。第四條路徑使用 3 × 3 3\times 3 3×3最大匯聚層,然后使用 1 × 1 1\times 1 1×1卷積層來改變通道數。這四條路徑都使用合適的填充來使輸入與輸出的高和寬一致,最后我們將每條線路的輸出在通道維度上連結,并構成Inception塊的輸出。在Inception塊中,通常調整的超參數是每層輸出通道數。

import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2lclass Inception(nn.Module):# c1--c4是每條路徑的輸出通道數def __init__(self, in_channels, c1, c2, c3, c4, **kwargs):super(Inception, self).__init__(**kwargs)# 線路1,單1x1卷積層self.p1_1 = nn.Conv2d(in_channels, c1, kernel_size=1)# 線路2,1x1卷積層后接3x3卷積層self.p2_1 = nn.Conv2d(in_channels, c2[0], kernel_size=1)self.p2_2 = nn.Conv2d(c2[0], c2[1], kernel_size=3, padding=1)# 線路3,1x1卷積層后接5x5卷積層self.p3_1 = nn.Conv2d(in_channels, c3[0], kernel_size=1)self.p3_2 = nn.Conv2d(c3[0], c3[1], kernel_size=5, padding=2)# 線路4,3x3最大匯聚層后接1x1卷積層self.p4_1 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)self.p4_2 = nn.Conv2d(in_channels, c4, kernel_size=1)def forward(self, x):p1 = F.relu(self.p1_1(x))p2 = F.relu(self.p2_2(F.relu(self.p2_1(x))))p3 = F.relu(self.p3_2(F.relu(self.p3_1(x))))p4 = F.relu(self.p4_2(self.p4_1(x)))# 在通道維度上連結輸出return torch.cat((p1, p2, p3, p4), dim=1)

??那么為什么GoogLeNet這個網絡如此有效呢?首先我們考慮一下濾波器(filter)的組合,它們可以用各種濾波器尺寸探索圖像,這意味著不同大小的濾波器可以有效地識別不同范圍的圖像細節。同時,我們可以為不同的濾波器分配不同數量的參數。

二、GoogLeNet模型

??如圖2所示,GoogLeNet一共使用9個Inception塊和全局平均匯聚層的堆疊來生成其估計值。Inception塊之間的最大匯聚層可降低維度。第一個模塊類似于AlexNet和LeNet,Inception塊的組合從VGG繼承,全局平均匯聚層避免了在最后使用全連接層。

在這里插入圖片描述

圖2 GoogLeNet架構

??現在,我們逐一實現GoogLeNet的每個模塊。第一個模塊使用64個通道、 7 × 7 7\times 7 7×7卷積層。

b1 = nn.Sequential(nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

??第二個模塊使用兩個卷積層:第一個卷積層是64個通道、 1 × 1 1\times 1 1×1卷積層;第二個卷積層使用將通道數量增加三倍的 3 × 3 3\times 3 3×3卷積層。這對應于Inception塊中的第二條路徑。

b2 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1),nn.ReLU(),nn.Conv2d(64, 192, kernel_size=3, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

??第三個模塊串聯兩個完整的Inception塊。第一個Inception塊的輸出通道數為 64 + 128 + 32 + 32 = 256 64+128+32+32=256 64+128+32+32=256,四個路徑之間的輸出通道數量比為 64 : 128 : 32 : 32 = 2 : 4 : 1 : 1 64:128:32:32=2:4:1:1 64:128:32:32=2:4:1:1。第二個和第三個路徑首先將輸入通道的數量分別減少到 96 / 192 = 1 / 2 96/192=1/2 96/192=1/2 16 / 192 = 1 / 12 16/192=1/12 16/192=1/12,然后連接第二個卷積層。第二個Inception塊的輸出通道數增加到 128 + 192 + 96 + 64 = 480 128+192+96+64=480 128+192+96+64=480,四個路徑之間的輸出通道數量比為 128 : 192 : 96 : 64 = 4 : 6 : 3 : 2 128:192:96:64 = 4:6:3:2 128:192:96:64=4:6:3:2。第二條和第三條路徑首先將輸入通道的數量分別減少到 128 / 256 = 1 / 2 128/256=1/2 128/256=1/2 32 / 256 = 1 / 8 32/256=1/8 32/256=1/8

b3 = nn.Sequential(Inception(192, 64, (96, 128), (16, 32), 32),Inception(256, 128, (128, 192), (32, 96), 64),nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

??第四模塊更加復雜,它串聯了5個Inception塊,其輸出通道數分別是 192 + 208 + 48 + 64 = 512 192+208+48+64=512 192+208+48+64=512 160 + 224 + 64 + 64 = 512 160+224+64+64=512 160+224+64+64=512 128 + 256 + 64 + 64 = 512 128+256+64+64=512 128+256+64+64=512 112 + 288 + 64 + 64 = 528 112+288+64+64=528 112+288+64+64=528 256 + 320 + 128 + 128 = 832 256+320+128+128=832 256+320+128+128=832。這些路徑的通道數分配和第三模塊中的類似,首先是含 3 × 3 3×3 3×3卷積層的第二條路徑輸出最多通道,其次是僅含 1 × 1 1×1 1×1卷積層的第一條路徑,之后是含 5 × 5 5×5 5×5卷積層的第三條路徑和含 3 × 3 3×3 3×3最大匯聚層的第四條路徑。其中第二、第三條路徑都會先按比例減小通道數。這些比例在各個Inception塊中都略有不同。

b4 = nn.Sequential(Inception(480, 192, (96, 208), (16, 48), 64),Inception(512, 160, (112, 224), (24, 64), 64),Inception(512, 128, (128, 256), (24, 64), 64),Inception(512, 112, (144, 288), (32, 64), 64),Inception(528, 256, (160, 320), (32, 128), 128),nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

??第五模塊包含輸出通道數為 256 + 320 + 128 + 128 = 832 256+320+128+128=832 256+320+128+128=832 384 + 384 + 128 + 128 = 1024 384+384+128+128=1024 384+384+128+128=1024的兩個Inception塊。其中每條路徑通道數的分配思路和第三、第四模塊中的一致,只是在具體數值上有所不同。需要注意的是,第五模塊的后面緊跟輸出層,該模塊同NiN一樣使用全局平均匯聚層,將每個通道的高和寬變成1。最后我們將輸出變成二維數組,再接上一個輸出個數為標簽類別數的全連接層。

b5 = nn.Sequential(Inception(832, 256, (160, 320), (32, 128), 128),Inception(832, 384, (192, 384), (48, 128), 128),nn.AdaptiveAvgPool2d((1,1)),nn.Flatten())net = nn.Sequential(b1, b2, b3, b4, b5, nn.Linear(1024, 10))

??GoogLeNet模型的計算復雜,而且不如VGG那樣便于修改通道數。為了使Fashion-MNIST上的訓練短小精悍,我們將輸入的高和寬從224降到96,這簡化了計算。下面演示各個模塊輸出的形狀變化。

X = torch.rand(size=(1, 1, 96, 96))
for layer in net:X = layer(X)print(layer.__class__.__name__,'output shape:\t', X.shape)

在這里插入圖片描述

三、訓練模型

??和以前一樣,我們使用Fashion-MNIST數據集來訓練我們的模型。在訓練之前,我們將圖片轉換為 96 × 96 96 \times 96 96×96分辨率。

lr, num_epochs, batch_size = 0.1, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

在這里插入圖片描述
在這里插入圖片描述

小結

  • Inception塊相當于一個有4條路徑的子網絡。它通過不同窗口形狀的卷積層和最大匯聚層來并行抽取信息,并使用 1 × 1 1×1 1×1卷積層減少每像素級別上的通道維數從而降低模型復雜度。
  • GoogLeNet將多個設計精細的Inception塊與其他層(卷積層、全連接層)串聯起來。其中Inception塊的通道數分配之比是在ImageNet數據集上通過大量的實驗得來的。
  • GoogLeNet和它的后繼者們一度是ImageNet上最有效的模型之一:它以較低的計算復雜度提供了類似的測試精度。

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

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

相關文章

【ESP32】ESP32與MQTT通信:實現傳感器數據監測與設備控制

ESP32與MQTT通信 1 項目概覽2 硬件組成3 MQTT協議解析MQTT協議簡介MQTT核心概念本項目中的MQTT應用 4 MQTT Broker選擇EMQX Broker其他常用MQTT Broker 5 代碼解析初始化與配置MQTT消息處理發布傳感器數據 6 MQTT話題TOPIC設計7 EMQX的優勢在IoT項目中的體現8 MQTT通信流程9 應…

[特殊字符]《Curve DAO 系統學習目錄》

本教程旨在系統學習 Curve DAO 項目的整體架構、核心機制、合約設計、治理邏輯與代幣經濟等內容,幫助開發者全面理解其設計理念及運作方式。 目錄總覽: 1. Curve 項目概覽 ? 1.1 Curve 是什么?主要解決什么問題? ? 1.2 與其他…

每天一篇目標檢測文獻(六)——Part One

今天看的是《Object Detection with Deep Learning: A Review》 目錄 一、摘要 1.1 原文 1.2 翻譯 二、介紹 2.1 信息區域選擇 2.2 特征提取 2.3 分類 三、深度學習的簡要回顧 3.1 歷史、誕生、衰落和繁榮 3.2 CNN架構和優勢 一、摘要 1.1 原文 Due to object dete…

Arthas線上問題診斷器

Arthas是Alibaba開源的java診斷工具 解決問題 這個類從哪個jar 包加載的?為什么會報各種相關的Exception? 遇到問題無法在線上debug,不能直通過加載日志再重新發布 有什么辦法可以監控到JVM的實時運行狀態? …

[Lc5_dfs+floodfill] 簡介 | 圖像渲染 | 島嶼數量

目錄 0.floodfill算法簡介 1.圖像渲染 題解 2.島嶼數量 題解 之前我們在 bfs 中有介紹過[Lc15_bfsfloodfill] 圖像渲染 | 島嶼數量 | 島嶼的最大面積 | 被圍繞的區域,現在我們來看看 dfs 又是如何解決的呢 0.floodfill算法簡介 floodfill算法又叫洪水灌溉或者…

JVM類加載器詳解

文章目錄 1.類與類加載器2.類加載器加載規則3.JVM 中內置的三個重要類加載器為什么 獲取到 ClassLoader 為null就是 BootstrapClassLoader 加載的呢? 4.自定義類加載器什么時候需要自定義類加載器代碼示例 5.雙親委派模式類與類加載器雙親委派模型雙親委派模型的執行…

Chapters 15 16:What Is Architecture?Independence_《clean architecture》notes

What Is Architecture?&Independence **Chapter 15: What Is Architecture?****Key Concepts**:**Code Example: Layered Architecture**: **Chapter 16: Independence****Key Concepts**:**Code Example: Dependency Inversion & Interfaces**: **Combined Example:…

【SPP】RFCOMM 層在SPP中互操作性要求深度解析

藍牙串口協議(SPP)通過 RFCOMM 協議實現 RS232 串口仿真,其互操作性是設備互聯的關鍵。本文基于藍牙核心規范,深度解析 RFCOMM 層的能力矩陣、信號處理、流控機制及實戰開發,結合狀態機、流程圖和代碼示例,…

阻塞式IO與非阻塞IO的區別

阻塞式IO與非阻塞IO的區別 1. 阻塞式IO (Blocking I/O) 定義 當程序發起一個I/O操作(如讀取文件、網絡數據)時,進程會被掛起(阻塞),直到操作完成或超時才會繼續執行后續代碼。在此期間,程序無法…

Gossip協議:分布式系統中的“八卦”傳播藝術

目錄 一、 什么是Gossip協議?二、 Gossip協議的應用 💡三、 Gossip協議消息傳播模式詳解 📚四、 Gossip協議的優缺點五、 總結: 🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式&…

【C++初階】----模板初階

1.泛型函數 泛型編程:編寫與類型無關的通用代碼,是代碼復用的一種手段。模板是泛型編程的基礎。 2.函數模板 2.1函數模板的概念 函數模板代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型…

git-- github的使用--賬戶和本地連接

以下指令在git 執行bash 流程:先看有沒有密鑰; 沒有的話,在電腦生成密鑰對,公鑰復制到github; 要想使用https,配置令牌,注意令牌有期限問題,連接不了有可能是期限問題 一個電腦對…

OTN(Optical Transport Network)詳解

OTN(光傳送網)是一種基于**波分復用(WDM)**的大容量光傳輸技術,結合了SDH的運維管理優勢和WDM的高帶寬特性,廣泛應用于骨干網、城域核心層及數據中心互聯(DCI)。 1. OTN 的基本概念 …

Python 中列表(List)、元組(Tuple)、集合(Set)和字典(Dict)四大數據結構的完整對比

以下是 Python 中列表(List)、元組(Tuple)、集合(Set)和字典(Dict)四大數據結構的完整對比分析,結合了核心特性、操作方式和應用場景的深度總結: 一、核心特性…

Angular由一個bug說起之十五:自定義基于Overlay的Tooltip

背景 工具提示(tooltip)是一個常見的 UI 組件,用于在用戶與頁面元素交互時提供額外的信息。由于angular/material/tooltip的matTooltip只能顯示純文本,所以我們可以通過自定義Directive來實現一個靈活且功能豐富的tooltip Overlay…

軟件工程面試題(十五)

1、servlet 創建過程以及ruquest,response,session的生命周期? Servlet的創建過程: 第一步 public class AAA extends HttpServlet{ 實現對應的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…

搭建QNX Software Center的Docker環境

背景 本人使用 Ubuntu Server 22.04 服務器&#xff0c;所以沒有圖形界面&#xff0c;而 QNX Software Center 需要圖形界面。為了保證服務器環境的整理&#xff0c;計劃使用Docker部署QNX Software Center 一瓶安裝圖形界面。本方既是實現方案的記錄。 資源 Dockerfile&…

C#/.NET/.NET Core技術前沿周刊 | 第 31 期(2025年3.17-3.23)

前言 C#/.NET/.NET Core技術前沿周刊&#xff0c;你的每周技術指南針&#xff01;記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿&#xff0c;助力技術成長與視野拓寬。 歡迎投稿、推薦…

粘包問題解決方案

粘包問題詳解&#xff1a;TCP協議中的常見問題及Go語言解決方案 一、什么是粘包問題&#xff1f; 粘包問題是指在TCP通信中&#xff0c;發送方發送的多個獨立消息在接收方被合并成一個消息接收的現象。換句話說&#xff0c;發送方發送的多條消息在接收方被“粘”在一起&#…

vue:突然發現onok無法使用

const that this;this.$confirm({title: "修改商品提示",content: "如果當前商品存在于商品活動庫&#xff0c;則在商品活動庫的狀態會下架",onOk: function () {that.submitForm();}}); 突然發現 this.$confirm無法進入onok 最終發現是主題沖突&#x…