疏老師-python訓練營-Day54Inception網絡及其思考

@浙大疏錦行

DAY54

一、 inception網絡介紹

今天我們介紹inception,也就是GoogleNet

傳統計算機視覺的發展史

從上面的鏈接,可以看到其實inceptionnet是在resnet之前的,那為什么我今天才說呢?因為他要引出我們后面的特征融合和特征并行處理這些思想。

Inception 網絡,也被稱為 GoogLeNet,是 Google 團隊在 2014 年提出的經典卷積神經網絡架構。它的核心設計理念是 “并行的多尺度融合”,通過在同一層網絡中使用多個不同大小的卷積核(如 1x1、3x3、5x5)以及池化操作,從不同尺度提取圖像特征,然后將這些特征進行融合,從而在不增加過多計算量的情況下,獲得更豐富的特征表達。

Inception 模塊是 Inception 網絡的基本組成單元。

在同樣的步長下,卷積核越小,下采樣率越低,保留的圖片像素越多;卷積核越大,越能捕捉像素周圍的信息。

一個典型的 Inception 模塊包含以下幾個并行的分支:

  • 1x1 卷積分支:用于降維,減少后續卷積操作的計算量,同時提取局部特征。?(像素下采樣率低,但是可以修改通道數)
  • 3x3 卷積分支:捕捉中等尺度的特征。?
  • 5x5 卷積分支:捕捉較大尺度的特征。?
  • 池化分支:通常使用最大池化或平均池化,用于保留圖像的全局信息。

二、 inception網絡架構

2.1 定義inception模塊

import torch
import torch.nn as nnclass Inception(nn.Module):def __init__(self, in_channels):"""Inception模塊初始化,實現多尺度特征并行提取與融合參數:in_channels: 輸入特征圖的通道數"""super(Inception, self).__init__()# 1x1卷積分支:降維并提取通道間特征關系# 減少后續卷積的計算量,同時保留局部特征信息self.branch1x1 = nn.Sequential(nn.Conv2d(in_channels, 64, kernel_size=1),  # 降維至64通道nn.ReLU()  # 引入非線性激活)# 3x3卷積分支:通過1x1卷積降維后使用3x3卷積捕捉中等尺度特征# 先降維減少計算量,再進行空間特征提取self.branch3x3 = nn.Sequential(nn.Conv2d(in_channels, 96, kernel_size=1),  # 降維至96通道nn.ReLU(),nn.Conv2d(96, 128, kernel_size=3, padding=1),  # 3x3卷積,保持空間尺寸不變nn.ReLU())# 5x5卷積分支:通過1x1卷積降維后使用5x5卷積捕捉大尺度特征# 較大的感受野用于提取更全局的結構信息self.branch5x5 = nn.Sequential(nn.Conv2d(in_channels, 16, kernel_size=1),  # 大幅降維至16通道nn.ReLU(),nn.Conv2d(16, 32, kernel_size=5, padding=2),  # 5x5卷積,保持空間尺寸不變nn.ReLU())# 池化分支:通過池化操作保留全局信息并降維# 增強特征的平移不變性self.branch_pool = nn.Sequential(nn.MaxPool2d(kernel_size=3, stride=1, padding=1),  # 3x3最大池化,保持尺寸nn.Conv2d(in_channels, 32, kernel_size=1),  # 降維至32通道nn.ReLU())def forward(self, x):"""前向傳播函數,并行計算四個分支并在通道維度拼接參數:x: 輸入特征圖,形狀為[batch_size, in_channels, height, width]返回:拼接后的特征圖,形狀為[batch_size, 256, height, width]"""# 注意,這里是并行計算四個分支branch1x1 = self.branch1x1(x)  # 輸出形狀: [batch_size, 64, height, width]branch3x3 = self.branch3x3(x)  # 輸出形狀: [batch_size, 128, height, width]branch5x5 = self.branch5x5(x)  # 輸出形狀: [batch_size, 32, height, width]branch_pool = self.branch_pool(x)  # 輸出形狀: [batch_size, 32, height, width]# 在通道維度(dim=1)拼接四個分支的輸出# 總通道數: 64 + 128 + 32 + 32 = 256outputs = [branch1x1, branch3x3, branch5x5, branch_pool]return torch.cat(outputs, dim=1)

上述模塊變化為[B, C, H, W]-->[B, 256, H, W]

model = Inception(in_channels=64)
input = torch.randn(32, 64, 28, 28)
output = model(input)
print(f"輸入形狀: {input.shape}")
print(f"輸出形狀: {output.shape}")  
輸入形狀: torch.Size([32, 64, 28, 28])
輸出形狀: torch.Size([32, 256, 28, 28])

inception模塊中不同的卷積核和步長最后輸出同樣尺寸的特征圖,這是經過精心設計的,才能在空間上對齊,才能在維度上正確拼接(concat)。

2.2 特征融合方法

這里我們注意到,它是對把不同尺度的特征融合在一起。concat這種增加通道數的方法是一種經典的特征融合方法。通道數增加,空間尺寸(H, W)保持不變,每個通道的數值保持獨立,沒有加法運算。相當于把不同特征圖 “并排” 放在一起,形成更 “厚” 的特征矩陣。

在深度學習中,特征融合的尺度有以下方式:

  1. 逐元素相加:將相同形狀的特征圖對應位置的元素直接相加,比如殘差連接:
    output = x + self.residual_block(x)

不改變特征圖尺寸和通道數,計算高效,但需保證輸入形狀一致。

  1. 逐元素相乘:通過乘法對特征進行權重分配,抑制無關特征,增強關鍵特征。比如注意力機制、門控機制(如 LSTM 中的遺忘門、輸入門),例如

    attention = self.ChannelAttention(features)  # 生成通道權重
    weighted_features = features * attention  # 逐元素相乘

其他的特征融合方法我們后面有機會介紹

2.3 InceptionNet網絡定義

class InceptionNet(nn.Module):def __init__(self, num_classes=10):super(InceptionNet, self).__init__()self.conv1 = nn.Sequential(nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3),nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2, padding=1))self.inception1 = Inception(64)self.inception2 = Inception(256)self.avgpool = nn.AdaptiveAvgPool2d((1, 1))self.fc = nn.Linear(256, num_classes)def forward(self, x):x = self.conv1(x)x = self.inception1(x)x = self.inception2(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.fc(x)return x
# 創建網絡實例
model = InceptionNet()
# 創建一個隨機輸入張量,模擬圖像數據,這里假設輸入圖像是3通道,尺寸為224x224
input_tensor = torch.randn(1, 3, 224, 224)
# 前向傳播
output = model(input_tensor)
print(output.shape)
torch.Size([1, 10])

inception網絡有著很多變體,Inception v1版本就是 GoogLeNet,他還有v2到v4,還版本,還可以引入殘差連接,如 Inception-ResNet-v2 在 ImageNet 上 top-1 準確率達 96.4%

多尺度融合等其他技巧我們將在科研班中展開了,因為單純從講義的形式來說,實在是不方便。將會在科研班的板塊中,提到backbone-neck-head這樣的范式架構設計,這將帶你開啟搭積木的道路。

今天的內容稍微有點單薄,我們再補充點小知識點。

三、卷積核的變體

3.1 感受野

我們發現,經常會有不同尺寸的卷積核來在特征圖上滑動進一步提取信息,那么卷積核的尺寸如何選取比較合適呢?在思考這個問題前你需要理解下感受野的概念。

感受野是指在卷積神經網絡(CNN)中,神經元在原始輸入圖像上所對應的區域大小。通俗來說,卷積層中的每個輸出特征圖上的一個像素點,其信息來源于輸入圖像中的某個特定區域,這個區域的大小就是該像素點的感受野。

假設我們有一個 3×3 的卷積核,對一張 5×5 的圖像進行步長為 1 的卷積操作:

輸出特征圖的每個像素點,都由輸入圖像中 3×3 的區域計算得到,因此該層的感受野為 3×3。 如果再疊加一層 3×3 卷積(步長 1),第二層的每個像素點會融合第一層 3×3 區域的信息,而第一層的每個區域又對應原始圖像的 3×3 區域,因此第二層的感受野擴展為 5×5(即 3+3-1=5)

為了方便大家理解這個5怎么來的,找了一個博主的視頻方便大家理解:?感受野的理解視頻解析

所以,在對應同等感受野的情況下,卷積核尺寸小有2個顯著的優勢:

  1. 能讓參數變少,簡化計算
  2. 能夠引入更多的非線性(多經過幾次激活函數),讓擬合效果更好

這也是為什么像 VGG 網絡就用多層 3×3 卷積核替代大卷積核,平衡模型性能與復雜度 。

3.2 卷積的變體

卷積也是有很多變體的,除了我們之前說過的基礎的卷積,還有空洞卷積、幻影卷積等等變體。我們以空洞卷積舉例:

空洞卷積(也叫擴張卷積、膨脹卷積 ),是對標準卷積的 “升級”—— 在卷積核元素間插入空洞(間隔),用 空洞率(dilation rate,記為d) 控制間隔大小。

標準卷積(d=1):卷積核元素緊密排列,直接覆蓋輸入特征圖相鄰區域。 空洞卷積(d>1):卷積核元素間插入?d-1?個空洞,等效擴大卷積核的 “感受野范圍”,但不增加參數數量(僅改變計算時的采樣間隔)。也就是無需增大卷積核尺寸或疊加多層卷積,僅通過調整?d,就能指數級提升感受野。

對比池化(Pooling)或下采樣,空洞卷積不丟失空間信息,能在擴大感受野的同時,維持特征圖尺寸,特別適合語義分割、目標檢測等需要精準像素 / 目標定位的任務。

所以不同的設計,其實是為了不同的任務,比如你雖然可以捕捉不同尺度的信息,但是對于圖像分類這個任務來說沒用,我的核心是整個圖像的類別,如果你是目標檢測,對于小目標的檢測中小尺度的設計就很有用。

3.3 空洞卷積示例

其實就是多了一個參數,代碼上僅僅也是多了一個參數

self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=2, dilation=2)

import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader# 數據預處理
transform = transforms.Compose([transforms.ToTensor(),  # 轉為張量transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 歸一化
])# 加載CIFAR-10數據集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,download=True, transform=transform)
trainloader = DataLoader(trainset, batch_size=128, shuffle=True)testset = torchvision.datasets.CIFAR10(root='./data', train=False,download=True, transform=transform)
testloader = DataLoader(testset, batch_size=128, shuffle=False)# 定義含空洞卷積的CNN模型
class SimpleCNNWithDilation(nn.Module):def __init__(self):super(SimpleCNNWithDilation, self).__init__()# 第一層:普通3×3卷積,捕捉基礎特征self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)  # 第二層:空洞卷積,dilation=2,感受野擴大(等效5×5普通卷積感受野)self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=2, dilation=2)  # 第三層:普通3×3卷積,恢復特征對齊self.conv3 = nn.Conv2d(32, 64, kernel_size=3, padding=1)  self.pool = nn.MaxPool2d(2, 2)  # 池化層self.relu = nn.ReLU()# 全連接層,根據CIFAR-10尺寸計算:32×32→池化后16×16→...→最終特征維度需匹配self.fc1 = nn.Linear(64 * 8 * 8, 256)  self.fc2 = nn.Linear(256, 10)  def forward(self, x):# 輸入: [batch, 3, 32, 32]x = self.conv1(x)  # [batch, 16, 32, 32]x = self.relu(x)x = self.pool(x)   # [batch, 16, 16, 16]x = self.conv2(x)  # [batch, 32, 16, 16](dilation=2 + padding=2 保持尺寸)x = self.relu(x)x = self.pool(x)   # [batch, 32, 8, 8]x = self.conv3(x)  # [batch, 64, 8, 8]x = self.relu(x)x = x.view(-1, 64 * 8 * 8)  # 展平x = self.fc1(x)x = self.relu(x)x = self.fc2(x)return x# 初始化模型、損失函數、優化器
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SimpleCNNWithDilation().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)# 訓練函數
def train(epoch):model.train()running_loss = 0.0for i, data in enumerate(trainloader, 0):inputs, labels = data[0].to(device), data[1].to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 100 == 99:  # 每100個batch打印一次print(f'Epoch: {epoch + 1}, Batch: {i + 1}, Loss: {running_loss / 100:.3f}')running_loss = 0.0# 測試函數
def test():model.eval()correct = 0total = 0with torch.no_grad():for data in testloader:images, labels = data[0].to(device), data[1].to(device)outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Accuracy on test set: {100 * correct / total:.2f}%')# 訓練&測試流程
for epoch in range(5):  # 簡單跑5個epoch示例train(epoch)test()
Files already downloaded and verified
Files already downloaded and verified
Epoch: 1, Batch: 100, Loss: 1.816
Epoch: 1, Batch: 200, Loss: 1.501
Epoch: 1, Batch: 300, Loss: 1.385
Accuracy on test set: 55.62%
Epoch: 2, Batch: 100, Loss: 1.210
Epoch: 2, Batch: 200, Loss: 1.182
Epoch: 2, Batch: 300, Loss: 1.115
Accuracy on test set: 60.03%
Epoch: 3, Batch: 100, Loss: 1.013
Epoch: 3, Batch: 200, Loss: 0.991
Epoch: 3, Batch: 300, Loss: 0.976
Accuracy on test set: 65.74%
Epoch: 4, Batch: 100, Loss: 0.877
Epoch: 4, Batch: 200, Loss: 0.877
Epoch: 4, Batch: 300, Loss: 0.856
Accuracy on test set: 68.51%
Epoch: 5, Batch: 100, Loss: 0.765
Epoch: 5, Batch: 200, Loss: 0.767
Epoch: 5, Batch: 300, Loss: 0.754
Accuracy on test set: 69.82%

局部替換成空洞卷積,在不顯著增加計算量的情況下,增強模型對長距離特征的捕捉能力,尤其適合想在小數據集(CIFAR-10)里嘗試擴大感受野的場景。

可以嘗試在不同層設置不同dilation(比如dilation=[1,2,1] ),讓模型從多個感受野維度提取特征。

所以其實對于這些模塊和類的參數本身能力的理解,才能幫助你更好的搭積木,而不是單純的無腦的試,未來你做什么任務就積累這方面的能力即可。

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

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

相關文章

LeetCode第3304題 - 找出第 K 個字符 I

題目 解答 class Solution {public char kthCharacter(int k) {int n 0;int v 1;while (v < k) {v << 1;n;}String target kthCharacterString(n);return target.charAt(k - 1);}public String kthCharacterString(int n) {if (n 0) {return "a";}Str…

Codeforces Round 1043 (Div. 3) D-F 題解

D. From 1 to Infinity 題意 有一個無限長的序列&#xff0c;是把所有正整數按次序拼接&#xff1a;123456789101112131415...\texttt{123456789101112131415...}123456789101112131415...。求這個序列前 k(k≤1015)k(k\le 10^{15})k(k≤1015) 位的數位和。 思路 二分出第 …

【C語言16天強化訓練】從基礎入門到進階:Day 7

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、洛谷刷題、C/C基礎知識知識強化補充、C/C干貨分享&學習過程記錄 &#x1f349;學習方向&#xff1a;C/C方向學習者…

【AI基礎:神經網絡】16、神經網絡的生理學根基:從人腦結構到AI架構,揭秘道法自然的智能密碼

“道法自然,久藏玄冥”——人工神經網絡(ANN)的崛起并非偶然,而是對自然界最精妙的智能系統——人腦——的深度模仿與抽象。從單個神經元的信號處理到大腦皮層的層級組織,從突觸可塑性的學習機制到全腦并行計算的高效能效,生物大腦的“玄冥”智慧為AI提供了源源不斷的靈感…

容器安全實踐(一):概念篇 - 從“想當然”到“真相”

在容器化技術日益普及的今天&#xff0c;許多開發者和運維人員都將應用部署在 Docker 或 Kubernetes 中。然而&#xff0c;一個普遍存在的誤解是&#xff1a;“容器是完全隔離的&#xff0c;所以它是安全的。” 如果你也有同樣的想法&#xff0c;那么你需要重新審視容器安全了。…

騰訊開源WeKnora:新一代文檔理解與檢索框架

引言&#xff1a;文檔智能處理的新范式 在數字化時代&#xff0c;企業和個人每天都面臨著海量文檔的處理需求&#xff0c;從產品手冊到學術論文&#xff0c;從合同條款到醫療報告&#xff0c;非結構化文檔的高效處理一直是技術痛點。2025年8月&#xff0c;騰訊正式開源了基于大…

C++之list類的代碼及其邏輯詳解 (中)

接下來我會依照前面所說的一些接口以及list的結構來進行講解。1. list_node的結構1.1 list_node結構體list由于其結構為雙向循環鏈表&#xff0c;所以我們在這里要這么初始化_next&#xff1a;指向鏈表中下一個節點的指針_prev&#xff1a;指向鏈表中上一個節點的指針_val&…

新能源汽車熱管理仿真:蒙特卡洛助力神經網絡訓練

研究背景在新能源汽車的熱管理仿真研究中&#xff0c;神經網絡訓練技術常被應用于系統降階建模。通過這一方法&#xff0c;可以構建出高效準確的代理模型&#xff0c;進而用于控制策略的優化、系統性能的預測與評估&#xff0c;以及實時仿真等任務&#xff0c;有效提升開發效率…

第十九講:C++11第一部分

目錄 1、C11簡介 2、列表初始化 2.1、{}初始化 2.2、initializer_list 2.2.1、成員函數 2.2.2、應用 3、變量類型推導 3.1、auto 3.2、decltype 3.3、nullptr 4、范圍for 5、智能指針 6、STL的一些變化 7、右值引用和移動語義 7.1、右值引用 7.2、右值與左值引…

書寫本體論視域下的文字學理論重構

在符號學與哲學的交叉領域&#xff0c;文字學&#xff08;Grammatologie&#xff09;作為一門顛覆性學科始終處于理論風暴的中心。自德里達1967年發表《論文字學》以來&#xff0c;傳統語言學中"語音中心主義"的霸權地位遭遇根本性動搖&#xff0c;文字不再被視為語言…

為什么要做架構設計?架構設計包含哪些內容?

大家好,我是IT孟德,You can call me Aman(阿瞞,阿彌陀佛的ē,Not阿門的ā),一個喜歡所有對象(熱愛技術)的男人。我正在創作架構專欄,秉承ITer開源精神分享給志同道合(愛江山愛技術更愛美人)的朋友。專欄更新不求速度但求質量(曹大詩人傳世作品必屬精品,請腦補一下《…

Vue2封裝Axios

一、介紹Axios 是一個基于 promise 的 HTTP 庫&#xff0c;簡單的講就是可以發送get、post等請求。二、安裝npm install axios --save二、axios不同請求方式axios(config)這是 Axios 的核心方法&#xff0c;用于發送自定義配置的 HTTP 請求。通過傳入一個包含請求配置的對象&am…

DataAnalytics之Tool:Metabase的簡介、安裝和使用方法、案例應用之詳細攻略

DataAnalytics之Tool&#xff1a;Metabase的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 Metabase的簡介 1、特點 Metabase的安裝和使用方法 1、安裝 快速設置&#xff1a;開發環境 前端快速設置 后端快速設置 2、使用方法 Metabase的案例應用 Metabase的簡介 Met…

frp v0.64.0 更新:開源內網穿透工具,最簡潔教程

frp是一款跨平臺的內網穿透工具&#xff0c;支持 Windows、macOS 與 Linux&#xff0c;它需要你有一臺擁有固定公網 IP 的電腦&#xff0c;VPS 最好&#xff0c;然后就能愉快的進行內網穿透了。還支持 https&#xff0c;甚至可以用它進行小程序開發。Appinn v0.64.0 新增token…

【數據結構】B+ 樹——高度近似于菌絲網絡——詳細解說與其 C 代碼實現

文章目錄B 樹的定義B 樹組織數據的方法往 B 樹中插入鍵值對數據從 B 樹中刪除鍵值對把 B 樹看作是 “真菌網絡”——我理解并記憶 B 樹的方法B 樹的 C 代碼實現初始化節點、B 樹B 樹節點內的二分查找B 樹的數據插入操作B 樹的刪除數據操作范圍查詢與全局遍歷銷毀 B 樹測試代碼&…

01、數據結構與算法--順序表

正式進入數據結構的學習&#xff0c;先從預備知識學起&#xff0c;戒焦戒躁戒焦戒躁...一、泛型的引入1、為什么需要泛型&#xff1f;先來看一個題目&#xff1a;實現一個類&#xff0c;類中包含一個數組成員&#xff0c;使得數組中可以存放任何類型的數據&#xff0c;也可以根…

8.23打卡 DAY 50 預訓練模型+CBAM模塊

DAY 50: 預訓練模型與 CBAM 模塊的融合與微調 今天&#xff0c;我們將把之前學到的知識融會貫通&#xff0c;探討如何將 CBAM 這樣的注意力模塊應用到強大的預訓練模型&#xff08;如 ResNet&#xff09;中&#xff0c;并學習如何高效地對這些模型進行微調&#xff0c;以適應我…

北極圈邊緣生態研究:從數據采集到分析的全流程解析

原文鏈接&#xff1a;https://onlinelibrary.wiley.com/doi/10.1111/1744-7917.70142?afR北極圈邊緣生態研究&#xff1a;從數據采集到分析的全流程解析簡介本教程基于一項在俄羅斯摩爾曼斯克州基洛夫斯克市開展的長期生態學研究&#xff0c;系統講解如何對高緯度地區特定昆蟲…

Excel處理控件Aspose.Cells教程:使用Python將 Excel 轉換為 NumPy

使用 Python 處理 Excel 數據非常常見。這通常涉及將數據從 Excel 轉換為可高效操作的形式。將 Excel 數據轉換為可分析的格式可能非常棘手。在本篇教程中&#xff0c;您將學習借助強大Excel處理控件Aspose.Cells for Python&#xff0c;如何僅用幾行代碼將 Excel 轉換為 NumPy…

python 字典有序性的實現和OrderedDict

文章目錄 一、Python 3.7+ 字典有序性的驗證 二、如何在字典頭部插入鍵值對 方法 1:創建新字典(推薦) 方法 2:使用 `collections.OrderedDict`(適合頻繁頭部插入場景) 方法 3:轉換為列表操作(不推薦,效率低) 底層核心結構:雙數組哈希表 有序性的實現原理 與舊版本(…