深度學習中的殘差網絡、加權殘差連接(WRC)與跨階段部分連接(CSP)詳解

隨著深度學習技術的不斷發展,神經網絡架構變得越來越復雜,而這些復雜網絡在訓練時常常遇到梯度消失、梯度爆炸以及計算效率低等問題。為了克服這些問題,研究者們提出了多種網絡架構,包括 殘差網絡(ResNet)加權殘差連接(WRC)跨階段部分連接(CSP)

本文將詳細介紹這三種網絡架構的基本概念、工作原理以及如何在 PyTorch 中實現它們。我們會通過代碼示例來展示每個技術的實現方式,并重點講解其中的核心部分。

目錄

一、殘差網絡(ResNet)

1.1 殘差網絡的背景與原理

1.2 殘差塊的實現

重點

二、加權殘差連接(WRC)

2.1 WRC的提出背景

2.2 WRC的實現

重點

三、跨階段部分連接(CSP)

3.1 CSP的提出背景

3.2 CSP的實現

重點

四、總結


一、殘差網絡(ResNet)

1.1 殘差網絡的背景與原理

有關于殘差網絡,詳情可以查閱以下博客,更為詳細與新手向:

YOLO系列基礎(三)從ResNet殘差網絡到C3層-CSDN博客

深層神經網絡的訓練常常遭遇梯度消失或梯度爆炸的問題,導致訓練效果不好。為了解決這一問題,微軟的何凱明等人提出了 殘差網絡(ResNet),引入了“跳躍連接(skip connections)”的概念,使得信息可以直接繞過某些層傳播,從而避免了深度網絡訓練中的問題。

在傳統的神經網絡中,每一層都試圖學習輸入到輸出的映射。但在 ResNet 中,網絡不再直接學習從輸入到輸出的映射,而是學習輸入與輸出之間的“殘差”,即

H(x) = F(x) + x

其中 F(x) 是網絡學到的殘差部分,x 是輸入。

這種方式顯著提升了網絡的訓練效果,并且讓深層網絡的訓練變得更加穩定。

1.2 殘差塊的實現

下面是一個簡單的殘差塊實現,它包括了兩層卷積和一個跳躍連接。跳躍連接幫助保持梯度的流動,避免深層網絡中的梯度消失問題。

圖例如下:

代碼示例如下:

import torch
import torch.nn as nn
import torch.nn.functional as F# 定義殘差塊
class ResidualBlock(nn.Module):def __init__(self, in_channels, out_channels):super(ResidualBlock, self).__init__()self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)self.bn1 = nn.BatchNorm2d(out_channels)self.bn2 = nn.BatchNorm2d(out_channels)# 如果輸入和輸出的通道數不同,則使用1x1卷積調整尺寸if in_channels != out_channels:self.shortcut = nn.Conv2d(in_channels, out_channels, kernel_size=1)else:self.shortcut = nn.Identity()def forward(self, x):out = F.relu(self.bn1(self.conv1(x)))  # 第一層卷積后激活out = self.bn2(self.conv2(out))        # 第二層卷積out += self.shortcut(x)                # 殘差連接return F.relu(out)                     # ReLU激活# 構建ResNet
class ResNet(nn.Module):def __init__(self, num_classes=10):super(ResNet, self).__init__()self.layer1 = ResidualBlock(3, 64)self.layer2 = ResidualBlock(64, 128)self.layer3 = ResidualBlock(128, 256)self.fc = nn.Linear(256, num_classes)def forward(self, x):x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = F.adaptive_avg_pool2d(x, (1, 1))  # 全局平均池化x = torch.flatten(x, 1)                # 展平x = self.fc(x)                         # 全連接層return x# 示例:構建一個簡單的 ResNet
model = ResNet(num_classes=10)
print(model)
重點
  1. 殘差連接的實現:在 ResidualBlock 類中,out += self.shortcut(x) 實現了輸入與輸出的加法操作,這是殘差學習的核心。
  2. 處理輸入和輸出通道數不一致的情況:如果輸入和輸出的通道數不同,通過使用 1x1 卷積調整輸入的維度,確保加法操作能夠進行。

二、加權殘差連接(WRC)

2.1 WRC的提出背景

傳統的殘差網絡通過簡單的跳躍連接將輸入和輸出相加,但在某些情況下,不同層的輸出對最終結果的貢獻是不同的。為了讓網絡更靈活地調整各層貢獻,加權殘差連接(WRC) 引入了可學習的權重。公式如下

H(x) =\alpha F(x) + \beta x

其中 F(x) 是網絡學到的殘差部分,x 是輸入,\alpha?和?\beta是權重。

WRC通過為每個殘差連接引入可學習的權重 \alpha\beta,使得網絡能夠根據任務需求自適應地調整每個連接的貢獻。

2.2 WRC的實現

以下是 WRC 的實現代碼,我們為每個殘差連接引入了權重參數 alphabeta,這些參數通過訓練進行優化。

圖例如下:

可以看到,加權殘差快其實就是給殘差網絡的兩條分支加個權而已?

代碼示例如下:?

class WeightedResidualBlock(nn.Module):def __init__(self, in_channels, out_channels):super(WeightedResidualBlock, self).__init__()self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)self.bn1 = nn.BatchNorm2d(out_channels)self.bn2 = nn.BatchNorm2d(out_channels)# 權重初始化self.alpha = nn.Parameter(torch.ones(1))  # 可學習的權重self.beta = nn.Parameter(torch.ones(1))   # 可學習的權重# 如果輸入和輸出的通道數不同,則使用1x1卷積調整尺寸if in_channels != out_channels:self.shortcut = nn.Conv2d(in_channels, out_channels, kernel_size=1)else:self.shortcut = nn.Identity()def forward(self, x):out = F.relu(self.bn1(self.conv1(x)))out = self.bn2(self.conv2(out))# 加權殘差連接:使用可學習的權重 alpha 和 betaout = self.alpha * out + self.beta * self.shortcut(x)return F.relu(out)# 示例:構建一個加權殘差塊
model_wrc = WeightedResidualBlock(3, 64)
print(model_wrc)
重點
  1. 可學習的權重 alphabeta:我們為殘差塊中的兩個加法項(即殘差部分和輸入部分)引入了可學習的權重。通過訓練,這些權重可以自動調整,使網絡能夠根據任務需求更好地融合輸入和輸出。

  2. 加權殘差連接的實現:在 forward 方法中,out = self.alpha * out + self.beta * self.shortcut(x) 表示加權殘差連接,其中 alphabeta 是可學習的參數。

三、跨階段部分連接(CSP)

3.1 CSP的提出背景

雖然 ResNet 和 WRC 提供了有效的殘差學習和信息融合機制,但在一些更復雜的網絡中,信息的傳遞依然面臨冗余和計算開銷較大的問題。為了解決這一問題,跨階段部分連接(CSP) 提出了更加高效的信息傳遞方式。CSP通過選擇性地傳遞部分信息而不是所有信息,減少了計算量并保持了模型的表達能力。

3.2 CSP的實現

CSP通過分割輸入特征,并在不同階段進行不同的處理,從而減少冗余的信息傳遞。下面是 CSP 的實現代碼。

CSP思想圖例如下:

特征分割(Feature Splitting):CSP通過分割輸入特征圖,并將分割后的特征圖分別送入不同的子網絡進行處理。一般來說,一條分支的子網絡會比較簡單,一條分支的自網絡則是原來主干網絡的一部分。

重點
  1. 部分特征選擇性連接:將輸入特征分為兩部分。每部分特征單獨經過卷積處理后,通過 torch.cat() 進行拼接,形成最終的輸出。
  2. 跨階段部分連接:CSP塊通過分割輸入特征并在不同階段處理,有效地減少了計算開銷,并且保持了網絡的表達能力。

四、總結

本文介紹了 殘差網絡(ResNet)加權殘差連接(WRC)跨階段部分連接(CSP) 這三種網絡架構。

finally,求贊求贊求贊~

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

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

相關文章

Pytorch | 從零構建EfficientNet對CIFAR10進行分類

Pytorch | 從零構建EfficientNet對CIFAR10進行分類 CIFAR10數據集EfficientNet設計理念網絡結構性能特點應用領域發展和改進 EfficientNet結構代碼詳解結構代碼代碼詳解MBConv 類初始化方法前向傳播 forward 方法 EfficientNet 類初始化方法前向傳播 forward 方法 訓練過程和測…

Vue 2 中實現雙擊事件的幾種方法

在 Vue 2 中處理用戶交互,特別是雙擊事件,是一個常見的需求。Vue 提供了一種簡潔的方式來綁定事件,包括雙擊事件。本文將介紹幾種在 Vue 2 中實現雙擊事件的方法。 1. 使用 dblclick 指令 Vue 允許你直接在模板中使用 dblclick 指令來監聽雙…

音視頻入門基礎:MPEG2-TS專題(20)——ES流簡介

《T-REC-H.222.0-202106-S!!PDF-E.pdf》第27頁對ES進行了定義。ES流是PES packets(PES包)中編碼的視頻、編碼的音頻或其他編碼的比特流。一個ES流(elementary stream)在具有且只有一個stream_id的PES packets序列中攜帶&#xff1…

天水月亮圈圈:舌尖上的歷史與傳承

在天水甘谷縣,有一種美食如同夜空中的明月,散發著獨特的魅力,它就是有著百年歷史的月亮圈圈。月亮圈圈原名甘谷酥圈圈,據傳,由大像山鎮蔣家莊一姓李的廚師創制而成,后經王明玖等廚師的光大傳承,…

YOLOv11融合[CVPR2023]FFTformer中的FSAS模塊

YOLOv11v10v8使用教程: YOLOv11入門到入土使用教程 YOLOv11改進匯總貼:YOLOv11及自研模型更新匯總 《Efficient Frequency Domain-based Transformers for High-Quality Image Deblurring》 一、 模塊介紹 論文鏈接:https://arxiv.org/abs…

java如何使用poi-tl在word模板里渲染多張圖片

1、poi-tl官網地址 http://deepoove.com/poi-tl/ 2、引入poi-tl的依賴 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>3、定義word模板 釋義&#xf…

《信管通低代碼信息管理系統開發平臺》Windows環境安裝說明

1 簡介 《信管通低代碼信息管理系統應用平臺》提供多環境軟件產品開發服務&#xff0c;包括單機、局域網和互聯網。我們專注于適用國產硬件和操作系統應用軟件開發應用。為事業單位和企業提供行業軟件定制開發&#xff0c;滿足其獨特需求。無論是簡單的應用還是復雜的系統&…

8K+Red+Raw+ProRes422分享5個影視級視頻素材網站

Hello&#xff0c;大家好&#xff0c;我是后期圈&#xff01; 在視頻創作中&#xff0c;電影級的視頻素材能夠為作品增添專業質感&#xff0c;讓畫面更具沖擊力。無論是廣告、電影短片&#xff0c;還是品牌宣傳&#xff0c;高質量的視頻素材都是不可或缺的資源。然而&#xff…

Git遠程倉庫的使用

一.遠程倉庫注冊 1.github&#xff1a;GitHub Build and ship software on a single, collaborative platform GitHub 2.gitee&#xff1a;GitHub Build and ship software on a single, collaborative platform GitHub github需要使用魔法&#xff0c;而gitee是國內的倉…

Echarts連接數據庫,實時繪制圖表詳解

文章目錄 Echarts連接數據庫&#xff0c;實時繪制圖表詳解一、引言二、步驟一&#xff1a;環境準備與數據庫連接1、環境搭建2、數據庫連接 三、步驟二&#xff1a;數據獲取與處理1、查詢數據庫2、數據處理 四、步驟三&#xff1a;ECharts圖表配置與渲染1、配置ECharts選項2、動…

MongoDB 常用操作指南(Docker 環境下)

本文詳細介紹如何在 Docker 中操作 MongoDB&#xff0c;包括如何進入命令行、進行用戶認證、查看數據庫和集合&#xff0c;以及常用的索引操作和其他高頻使用的 MongoDB 方法。小白也能輕松上手 1. 在 Docker 中進入 MongoDB 命令行 進入運行 MongoDB 容器的命令行&#xff1a;…

【Java基礎面試題038】棧和隊列在Java中的區別是什么?

回答重點 棧&#xff08;Stack&#xff09;&#xff1a;遵循后進先出&#xff08;LIFO&#xff0c;Last In&#xff0c;First Out&#xff09;原則。即&#xff0c;最后插入的元素最先被移除。主要操作包括push&#xff08;入棧&#xff09;和pop&#xff08;出棧&#xff09;…

idea2024創建JavaWeb項目以及配置Tomcat詳解

今天呢&#xff0c;博主的學習進度也是步入了JavaWeb&#xff0c;目前正在逐步楊帆旗航&#xff0c;迎接全新的狂潮海浪。 那么接下來就給大家出一期有關JavaWeb的配置教學&#xff0c;希望能對大家有所幫助&#xff0c;也特別歡迎大家指點不足之處&#xff0c;小生很樂意接受正…

由于這些關鍵原因,我總是手邊有一臺虛擬機

概括 虛擬機提供了一個安全的環境來測試有風險的設置或軟件,而不會影響您的主系統。設置和保存虛擬機非常簡單,無需更改主要設備即可方便地訪問多個操作系統。運行虛擬機可能會占用大量資源,但現代 PC 可以很好地處理它,為實驗和工作流程優化提供無限的可能性。如果您喜歡使…

【FPGA】ISE13.4操作手冊,新建工程示例

關注作者了解更多 我的其他CSDN專欄 求職面試 大學英語 過程控制系統 工程測試技術 虛擬儀器技術 可編程控制器 工業現場總線 數字圖像處理 智能控制 傳感器技術 嵌入式系統 復變函數與積分變換 單片機原理 線性代數 大學物理 熱工與工程流體力學 數字信號處…

python環境中阻止相關庫的自動更新

找到conda中的Python虛擬環境位置 這里以conda中的pytorch虛擬環境為例&#xff08;Python環境位置&#xff09;&#xff0c;在.conda下的envs中進入pytorch下的conda-meta路徑下 新建一個空白的pinned文檔 右鍵點擊桌面或文件資源管理器中的空白處&#xff0c;選擇“新建” …

重溫設計模式--外觀模式

文章目錄 外觀模式&#xff08;Facade Pattern&#xff09;概述定義 外觀模式UML圖作用 外觀模式的結構C 代碼示例1C代碼示例2總結 外觀模式&#xff08;Facade Pattern&#xff09;概述 定義 外觀模式是一種結構型設計模式&#xff0c;它為子系統中的一組接口提供了一個統一…

uniapp 微信小程序 頁面部分截圖實現

uniapp 微信小程序 頁面部分截圖實現 ? 原理都是將頁面元素畫成canvas 然后將canvas轉化為圖片&#xff0c;問題是我頁面里邊本來就有一個canvas&#xff0c;ucharts圖畫的canvas我無法畫出這塊。 ? 想了一晚上&#xff0c;既然canvas最后能轉化為圖片&#xff0c;那我直接…

Flutter 基礎知識總結

1、Flutter 介紹與環境安裝 為什么選擇 Dart&#xff1a; 基于 JIT 快速開發周期&#xff1a;Flutter 在開發階段采用 JIT 模式&#xff0c;避免每次改動都進行編譯&#xff0c;極大的節省了開發時間基于 AOT 發布包&#xff1a;Flutter 在發布時可以通過 AOT 生成高效的 ARM…

Jenkins 持續集成部署

Jenkins的安裝與部署 前言 當我們在實施一個項目時&#xff0c;從新代碼中獲得反饋的速度越快&#xff0c;問題越早得到解決&#xff0c;獲得反饋的一種常見方法是在新代碼之后運行測試&#xff0c;但這就導致了當代碼正在編譯并且正在運行測試時&#xff0c;開發人員無法在測…