零基礎-動手學深度學習-7.7 稠密連接網絡(DenseNet)

ResNet極大地改變了如何參數化深層網絡中函數的觀點。?稠密連接網絡(DenseNet)在某種程度上是ResNet的邏輯擴展。讓我們先從數學上了解一下。

7.7.1.?從ResNet到DenseNet

?

7.7.2.?稠密塊體?

?DenseNet使用了ResNet改良版的“批量規范化、激活和卷積”架構(參見?7.6節中的練習)。 我們首先實現一下這個架構:

import torch
from torch import nn
from d2l import torch as d2l#BN層-激活層-卷積層
def conv_block(input_channels, num_channels):return nn.Sequential(nn.BatchNorm2d(input_channels), nn.ReLU(),nn.Conv2d(input_channels, num_channels, kernel_size=3, padding=1))

一個稠密塊由多個卷積塊組成,每個卷積塊使用相同數量的輸出通道。 然而,在前向傳播中,我們將每個卷積塊的輸入和輸出在通道維上連結。

class DenseBlock(nn.Module):def __init__(self, num_convs, input_channels, num_channels):super(DenseBlock, self).__init__()layer = []for i in range(num_convs):layer.append(conv_block(num_channels * i + input_channels, num_channels))#具體的稠密是在這里
#類似于一個累加的等差序列求和self.net = nn.Sequential(*layer)def forward(self, X):for blk in self.net:Y = blk(X)# 連接通道維度上每個塊的輸入和輸出X = torch.cat((X, Y), dim=1)return X

在下面的例子中,我們定義一個有2個輸出通道數為10的DenseBlock。 使用通道數為3的輸入時,我們會得到通道數為3+2*10=23的輸出。 卷積塊的通道數控制了輸出通道數相對于輸入通道數的增長,因此也被稱為增長率(growth rate)。

驗證一下:

blk = DenseBlock(2, 3, 10)
X = torch.randn(4, 3, 8, 8)
Y = blk(X)
Y.shape輸出:torch.Size([4, 23, 8, 8])

7.7.3.?過渡層

?由于每個稠密塊都會帶來通道數的增加,使用過多則會過于復雜化模型。 而過渡層可以用來控制模型復雜度。 它通過1*1卷積層來減小通道數,并使用步幅為2的平均匯聚層減半高和寬,從而進一步降低模型復雜度。(這里用的是平均而不是最大池化因為這里本身過渡層就是為了過渡保留背景信息而不是篩選,題主個人認為,但是下面人的討論好像acc沒有什么變化,這下還是神經網絡的不可解釋性了)

def transition_block(input_channels, num_channels):return nn.Sequential(nn.BatchNorm2d(input_channels), nn.ReLU(),nn.Conv2d(input_channels, num_channels, kernel_size=1),nn.AvgPool2d(kernel_size=2, stride=2))

對上一個例子中稠密塊的輸出使用通道數為10的過渡層。 此時輸出的通道數減為10,高和寬均減半。

blk = transition_block(23, 10)
blk(Y).shape輸出:
torch.Size([4, 10, 4, 4])

7.7.4.?DenseNet模型

我們來構造DenseNet模型。DenseNet首先使用同ResNet一樣的單卷積層和最大匯聚層:

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

接下來,類似于ResNet使用的4個殘差塊,DenseNet使用的是4個稠密塊。 與ResNet類似,我們可以設置每個稠密塊使用多少個卷積層。 這里我們設成4,從而與?7.6節的ResNet-18保持一致。 稠密塊里的卷積層通道數(即增長率)設為32,所以每個稠密塊將增加128個通道。

在每個模塊之間,ResNet通過步幅為2的殘差塊減小高和寬,DenseNet則使用過渡層來減半高和寬,并減半通道數。

# num_channels為當前的通道數
num_channels, growth_rate = 64, 32
num_convs_in_dense_blocks = [4, 4, 4, 4]
blks = []
for i, num_convs in enumerate(num_convs_in_dense_blocks):blks.append(DenseBlock(num_convs, num_channels, growth_rate))# 上一個稠密塊的輸出通道數num_channels += num_convs * growth_rate# 在稠密塊之間添加一個轉換層,使通道數量減半if i != len(num_convs_in_dense_blocks) - 1:blks.append(transition_block(num_channels, num_channels // 2))num_channels = num_channels // 2

與ResNet類似,最后接上全局匯聚層和全連接層來輸出結果。

net = nn.Sequential(b1, *blks,nn.BatchNorm2d(num_channels), nn.ReLU(),nn.AdaptiveAvgPool2d((1, 1)),nn.Flatten(),nn.Linear(num_channels, 10))

7.7.5.?訓練模型

由于這里使用了比較深的網絡,本節里我們將輸入高和寬從224降到96來簡化計算。

lr, num_epochs, batch_size = 0.1, 10, 256
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())輸出:
5626.3 examples/sec on cuda:0
loss 0.140, train acc 0.948, test acc 0.885

7.7.6.?小結

  • 在跨層連接上,不同于ResNet中將輸入與輸出相加,稠密連接網絡(DenseNet)在通道維上連結輸入與輸出。

  • DenseNet的主要構建模塊是稠密塊和過渡層。

  • 在構建DenseNet時,我們需要通過添加過渡層來控制網絡的維數,從而再次減少通道的數量。

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

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

相關文章

Marin說PCB之POC電路layout設計仿真案例---09

好消息,好消息,小編最愛的國漫凡人修仙傳電視劇版本的終于可以看了,小編我推薦一波啊,感興趣的道友們可以去某酷視頻去追劇啊。 好了,咱們言歸正傳啊。本期的案例是這個月中旬我們組的測試大哥阿永去某田實驗室去測試我…

論文閱讀--射頻電源在半導體領域的應用

《射頻電源在半導體領域的應用》 論文信息:左政,馮國楠,李建慧,等.射頻電源在半導體領域的應用[J].軟件和集成電路,2025,(04):38-43.DOI:10.19609/j.cnki.cn10-1339/tn.2025.04.007. 一、射頻電源的定義與分類 1.1 定義射頻電源(RF Power Supply&#xf…

綠算技術攜手昇騰發布高性能全閃硬盤緩存設備,推動AI大模型降本增效

在數字化浪潮席卷全球的今天,人工智能已經成為推動企業創新與發展的重要力量。廣東省綠算技術有限公司(簡稱“綠算技術”)緊跟時代步伐,基于華為昇騰AI大模型,推出了高性能全閃硬盤緩存設備,致力于為人工智…

HoloLens2系列講解 - 06 基本操作

一、導入MRTK插件 1. 首先要新建一個項目,打開unity,新建一個project。 2. 導入MRTK包。 3. 點擊 Mixed Reality Toolkit > Add to scene and Configure 添加MR場景配置文件。

Linux Vim 編輯器使用指南

Linux Vim 編輯器使用指南一、Vim 簡介 Vim(Vi IMproved)是 Linux/Unix 系統中最流行的文本編輯器之一,它是 Vi 的增強版,支持多模式操作、語法高亮、插件擴展等特性,無需鼠標即可高效編輯文本。 二、核心工作模式 Vim…

運維筆記:破解 VMware 遷移難題

一、VMware 遷移前的準備與評估1.1 遷移場景與目標分析VMware 遷移常見場景包括:同平臺升級:從 vSphere 6.7 遷移到 7.0/8.0(硬件兼容、功能迭代)跨平臺遷移:VMware→KVM/Xen(降低 licensing 成本&#xff…

cartographer 點云數據的預處理

目錄 傳感器數據的走向 體素濾波與之后的處理 3D情況下的激光雷達數據的預處理 初始位姿估計 位姿推測器的優缺點分析與總結 可能有問題的點 可能的改進建議 傳感器數據的走向 傳感器數據從CollatedTrajectoryBuilder類的HandleCollatedSensorData函數 傳遞GlobalTrajec…

基于數據挖掘的短視頻點贊影響因素分析【LightGBM、XGBoost、隨機森林、smote】

文章目錄有需要本項目的代碼或文檔以及全部資源,或者部署調試可以私信博主項目介紹總結每文一語有需要本項目的代碼或文檔以及全部資源,或者部署調試可以私信博主 項目介紹 隨著短視頻行業的高速發展,尤其是以抖音為代表的平臺不斷壯大&…

Git 從入門到精通

Git 從入門到精通 涵蓋了核心概念、常用命令、協作流程和高級技巧: 核心理念: 版本控制: 記錄文件變化歷史,可回溯到任意版本。分布式: 每個開發者擁有完整的倉庫副本(包括完整歷史)&#xf…

UE5多人MOBA+GAS 30、技能升級機制

文章目錄前言技能的升級修改一下按鍵的輸入判斷是否滿級在ASC中升級技能由角色的輸入調用ASC的升級功能技能圖標的優化技能升級材質,可升級技能圖標的閃爍刷新技能升級后的藍耗和CD,以及藍不夠時技能進入灰色狀態修復傷害數字特效只顯示3位數的問題前言 …

筆試——Day22

文章目錄第一題題目思路代碼第二題題目:思路代碼第三題題目:思路代碼第一題 題目 添加字符 思路 枚舉所有字符串a與字符串b相對應的位置 代碼 第二題 題目: 數組變換 思路 貪心 以最大值為基準元素,判斷其他元素能否變為最…

__getattr__和 __getattribute__ 的用法

1、__getattr__ 的用法當實例對象訪問一個不存在的屬性時,會執行 __getattr__ 方法,如果屬性存在的話,就不會執行案例 class Person:def __init__(self, name, age):self.name nameself.age agedef get_info(self):return f"name: {se…

信息化項目驗收測試實戰指南

在當今數字化轉型的大背景下,信息化項目驗收建設已成為企業提升運營效率、優化管理流程的重要手段。然而,很多企業在投入大量資金建設信息系統后,卻常常面臨系統上線后無法滿足實際業務需求的困境。究其原因,往往是由于忽視了信息…

牛頓拉夫遜法PQ分解法計算潮流MATLAB程序計算模型。

牛頓拉夫遜法&PQ分解法計算潮流MATLAB程序計算模型。本程序模型基于MATLAB進行潮流計算,建議先安裝matpower插件(MATLAB中非常重要的潮流計算的插件)。本程序可進行牛拉法和PQ分解法潮流計算的切換,對比潮流計算的結果。很適合…

Go語言實戰案例-計算字符串編輯距離

在自然語言處理、拼寫糾錯、模糊搜索等場景中,我們經常需要衡量兩個字符串之間的相似度。編輯距離(Edit Distance) 就是一個經典的衡量方式,它描述了將一個字符串轉換為另一個字符串所需的最少操作次數。 一、問題定義:什么是編輯距離? 編輯距離,也稱為 Levenshtein Di…

Java時間與日期常用方法

DateDate date new Date(); //獲取當前時間 System.out.println(date.getYear() 1900); // 必須加上1900 System.out.println(date.getMonth() 1); // 0~11,必須加上1 System.out.println(date.getDate()); // 1~31,不能加1Ca…

【MySQL】從連接數據庫開始:JDBC 編程入門指南

個人主頁:?喜歡做夢 歡迎 👍點贊 ?關注 ??收藏 💬評論 目錄 🌟一、什么是JDBC? 🌟二、JDBC編程的步驟 ?使用步驟 ?DriverManger 💫定義 💫DriverManger的主要功能 …

重生之我在暑假學習微服務第一天《MybatisPlus-上篇》

本系列參考黑馬程序員微服務課程,有興趣的可以去查看相關視頻,本系列內容采用漸進式方式講解微服務核心概念與實踐方法,每日更新確保知識點的連貫性。通過系統化學習路徑幫助開發者掌握分布式系統構建的關鍵技術。讀者可通過平臺訂閱功能獲取…

odoo-060 git版本:發布/生產版本落后開發版本部署

文章目錄問題起源目前解決問題起源 周五提交了一個版本,本來打算使用這個版本的,周末更新。 下一個功能比較復雜,周一提交,結果周末沒有更新,導致現在還有沒測試過的不能發布的。 說明: 原來只有一個mast…

YotoR模型:Transformer與YOLO新結合,打造“又快又準”的目標檢測模型

【導讀】在目標檢測領域,YOLO系列以其高效的推理速度廣受歡迎,而Transformer結構則在精度上展現出強大潛力。如何兼顧二者優勢,打造一個“又快又準”的模型,是近年來研究熱點之一。本文介紹的一項新研究——YotoR(You …