基于CNN的FashionMNIST數據集識別6——DenseNet模型

源碼

import torch
from torch import nn
from torchsummary import summary"""
DenseNet的核心組件:稠密層(DenseLayer)
實現特征復用機制,每個層的輸出會與所有前序層的輸出在通道維度拼接
"""class DenseLayer(nn.Module):def __init__(self, input_channels, growth_rate):super().__init__()# 批歸一化 + ReLU + 1x1卷積 (瓶頸層,減少計算量)self.bn1 = nn.BatchNorm2d(input_channels)self.conv1 = nn.Conv2d(input_channels, 4 * growth_rate, kernel_size=1)# 批歸一化 + ReLU + 3x3卷積 (特征提取層)self.bn2 = nn.BatchNorm2d(4 * growth_rate)self.conv2 = nn.Conv2d(4 * growth_rate, growth_rate, kernel_size=3, padding=1)self.relu = nn.ReLU()def forward(self, x):# 前向傳播:BN->ReLU->Conv(1x1)->BN->ReLU->Conv(3x3)out = self.conv1(self.relu(self.bn1(x)))out = self.conv2(self.relu(self.bn2(out)))# 將新特征與輸入特征在通道維度拼接(實現特征復用)return torch.cat([x, out], 1)"""
稠密塊(DenseBlock):由多個稠密層組成
每個稠密層的輸入包含前面所有層的特征圖
"""class DenseBlock(nn.Module):def __init__(self, num_layers, input_channels, growth_rate):super().__init__()layers = []# 構建num_layers個稠密層for i in range(num_layers):# 每層的輸入通道數 = 初始通道數 + 已添加的特征圖數layers.append(DenseLayer(input_channels + i * growth_rate, growth_rate))self.block = nn.Sequential(*layers)def forward(self, x):return self.block(x)"""
過渡層(TransitionLayer):用于壓縮特征圖尺寸和通道數
包含1x1卷積和平均池化
"""class TransitionLayer(nn.Module):def __init__(self, input_channels, output_channels):super().__init__()# 壓縮通道數的1x1卷積self.bn = nn.BatchNorm2d(input_channels)self.conv = nn.Conv2d(input_channels, output_channels, kernel_size=1)# 下采樣用的平均池化self.pool = nn.AvgPool2d(2, stride=2)self.relu = nn.ReLU()def forward(self, x):# 前向傳播:BN->ReLU->Conv(1x1)->AvgPoolout = self.conv(self.relu(self.bn(x)))return self.pool(out)"""
完整的DenseNet網絡結構
包含初始卷積層、多個稠密塊+過渡層、分類層
"""class DynamicDenseNet(nn.Module):def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16), num_classes=5):super().__init__()# 初始卷積層(標準CNN開始結構)self.features = nn.Sequential(nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3),  # 下采樣nn.BatchNorm2d(64),nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2, padding=1)  # 進一步下采樣)# 構建稠密塊和過渡層num_channels = 64  # 初始通道數for i, num_layers in enumerate(block_config):# 添加稠密塊block = DenseBlock(num_layers, num_channels, growth_rate)self.features.add_module(f'denseblock{i + 1}', block)# 更新通道數(每個稠密層增加growth_rate個通道)num_channels += num_layers * growth_rate# 不是最后一個塊時添加過渡層if i != len(block_config) - 1:trans = TransitionLayer(num_channels, num_channels // 2)self.features.add_module(f'transition{i + 1}', trans)num_channels = num_channels // 2  # 過渡層壓縮通道數# 分類層self.classifier = nn.Sequential(nn.BatchNorm2d(num_channels),nn.ReLU(),nn.AdaptiveAvgPool2d((1, 1)),  # 全局平均池化nn.Flatten(),nn.Linear(num_channels, num_classes)  # 全連接輸出分類結果)def forward(self, x):features = self.features(x)return self.classifier(features)# 測試代碼
if __name__ == "__main__":device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = DynamicDenseNet().to(device)# 打印網絡結構和參數統計(輸入尺寸為3x224x224)print(summary(model, (3, 224, 224)))

流程圖

設計理念

密集連接機制

在DenseNet中,每個層都與其后續的所有層直接連接。這意味著:

  • 第l層的輸入 = 所有前序層(0到l-1)的特征圖拼接
  • 數學表示:x_l = H_l([x_0, x_1, ..., x_{l-1}])
  • 與傳統架構相比,緩解了梯度消失問題,增強了特征傳播

特征復用機制

  • 每個層都可以訪問所有前序層的特征圖
  • 網絡自動學習在不同層級復用特征
  • 減少了特征冗余,提高了參數效率

瓶頸層設計

每個DenseLayer包含:

  1. ?BN-ReLU-Conv(1×1)層?:作為瓶頸層,減少特征圖數量和計算量
    • 將輸入通道壓縮到4×growth_rate
  2. ?BN-ReLU-Conv(3×3)層?:主特征提取層
    • 輸出growth_rate個特征圖(通常growth_rate=12-48)

增長率(growth_rate)參數

  • 控制每個層添加到特征圖的通道數
  • 較小的growth_rate也能獲得優異性能(如k=12 vs ResNet k=64)
  • 決定模型容量和參數效率的關鍵超參數

過渡層設計

  • ?1×1卷積?:壓縮特征通道數(通常減少50%)
  • ?2×2平均池化?:下采樣特征圖尺寸
  • 公式:θ = 壓縮因子(通常0.5)
    • output_channels = θ × input_channels

?充電:BatchNorm2d的用法

batchnorm2d是PyTorch中用于2D輸入的批歸一化(Batch Normalization)層。

參數類型默認值說明
num_featuresint-輸入通道數C
epsfloat1e-5數值穩定項
momentumfloat0.1運行統計量更新系數
affineboolTrue是否啟用γ/β可學習參數
track_running_statsboolTrue是否記錄運行統計量

通常只需要設置輸入通道數即可。比如:

conv = nn.Conv2d(in_c, out_c, 3)
bn = nn.BatchNorm2d(out_c)  # 注意與卷積輸出通道一致
relu = nn.ReLU()
output = relu(bn(conv(input)))

bn層可以做初始化設置,比如:

bn = nn.BatchNorm2d(64)
# 初始化縮放因子為1,偏移為0
nn.init.constant_(bn.weight, 1)  
nn.init.constant_(bn.bias, 0)

?需要注意的是,當批次數量太小時,使用bn層可能表現不穩定。當batch<16時,建議使用GroupNorm方法做替代

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

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

相關文章

MySQL 中 INSERT ... ON DUPLICATE KEY UPDATE 為什么會導致主鍵自增失效?

最近開發的過程中&#xff0c;使用ai生成代碼&#xff0c;寫了一條這樣的SQL&#xff1a;INSERT … ON DUPLICATE KEY UPDATE&#xff0c;然后發現一個奇怪的現象&#xff1a; 為什么使用這個語法后&#xff0c;自增主鍵&#xff08;AUTO_INCREMENT&#xff09;的值會跳躍甚至…

jenkins流水線打包vue無權限

jenkins在使用npm命令進行拉取依賴時,創建目錄會報錯無權限&#xff0c;如下如所示 這是因為npm 出于安全考慮不支持以 root 用戶運行&#xff0c;即使你用 root 用戶身份運行了&#xff0c;npm 會自動轉成一個叫 nobody 的用戶來運行&#xff0c;而這個用戶權限非常低 若需要…

快速實現golang的grpc服務

文章目錄 1、安裝服務2、檢查安裝版本情況3、編寫proto文件4、生成代碼5、實現業務邏輯6、創建provider7、測試調用 1、安裝服務 1、protoc安裝 需去官網下載 protobuf 2、命令行安裝protoc-gen-go和protoc-gen-go-grpc $ go install google.golang.org/protobuf/cmd/protoc-…

C++ 學習 多線程 2025年6月17日18:41:30

多線程(標準線程庫 <thread>) 創建線程 #include <iostream> #include <thread>void hello() {std::cout << "Hello from thread!\n"; }int main() {// 創建線程并執行 hello() std::thread t(hello); //線程對象&#xff0c;傳入可調用對…

常見的測試工具及分類

Web測試工具是保障Web應用質量的核心支撐&#xff0c;根據測試類型&#xff08;功能、性能、安全、自動化等&#xff09;和場景需求&#xff0c;可分為多個類別。以下從??八大核心測試類型??出發&#xff0c;梳理常見工具及其特點、適用場景&#xff1a; ??一、功能測試工…

七牛存儲sdk在springboot完美集成和應用 七牛依賴 自動化配置

文章目錄 概要依賴配置屬性配置類配置文件業務層控制層運行結果亮點 概要 七牛存儲很便宜的&#xff0c;在使用項目的用好官方封裝好的sdk&#xff0c;結合springboot去使用很方便&#xff0c;我本地用的是springoot3spring-boot-autoconfigure 依賴 <dependency><…

Java相關-鏈表-設計鏈表-力扣707

你可以選擇使用單鏈表或者雙鏈表&#xff0c;設計并實現自己的鏈表。 單鏈表中的節點應該具備兩個屬性&#xff1a;val 和 next 。val 是當前節點的值&#xff0c;next 是指向下一個節點的指針/引用。 如果是雙向鏈表&#xff0c;則還需要屬性 prev 以指示鏈表中的上一個節點…

C# 關于LINQ語法和類型的使用

常用語法&#xff0c;具體問題具體分析 1. Select2. SelectMany3. Where4. Take5. TakeWhile6. SkipWhile7. Join8. GroupJoin9. OrderBy10. OrderByDescending11. ThenBy12. Concat13. Zip14. Distinct15. Except16. Union17. Intersect18. Concat19. Reverse20. SequenceEqua…

華為OD-2024年E卷-小明周末爬山[200分] -- python

問題描述&#xff1a; 題目描述 周末小明準備去爬山鍛煉&#xff0c;0代表平地&#xff0c;山的高度使用1到9來表示&#xff0c;小明每次爬山或下山高度只能相差k及k以內&#xff0c;每次只能上下左右一個方向上移動一格&#xff0c;小明從左上角(0,0)位置出發 輸入描述 第一行…

Android:使用OkHttp

1、權限&#xff1a; <uses-permission android:name"android.permission.INTERNET" /> implementation com.squareup.okhttp3:okhttp:3.4.1 2、GET&#xff1a; new XXXTask ().execute("http://192.168.191.128:9000/xx");private class XXXTask…

Vue3+Element Plus動態表格列寬設置

在 Vue3 Element Plus 中實現動態設置表格列寬&#xff0c;可以通過以下幾種方式實現&#xff1a; 方法 1&#xff1a;動態綁定 width 屬性&#xff08;推薦&#xff09; vue 復制 下載 <template><el-table :data"tableData" style"width: 100%…

【JVM目前使用過的參數總結】

JVM參數總結 筆記記錄 JVM-棧相關JVM-方法區(元空間)相關JVM-堆相關 JVM-棧相關 .-XX:ThreadStackSize1M -Xss1m 上面的簡寫形式【設置棧的大小】 JVM-方法區(元空間)相關 -XX:MaxMetaspaceSize10m 【設置最大元空間大小】 JVM-堆相關 -XX:MaxHeapSize10m -Xmx10m 上面的簡寫形…

AI輔助高考志愿填報-專業全景解析與報考指南

高考志愿填報&#xff0c;這可是關系到孩子未來的大事兒&#xff01;最近&#xff0c;我親戚家的孩子也面臨著這個難題&#xff0c;昨晚一個電話就跟我聊了好久&#xff0c;問我報啥專業好。說實話&#xff0c;這問題真不好回答&#xff0c;畢竟每個孩子情況不一樣&#xff0c;…

Android Studio Windows安裝與配置指南

Date: 2025-06-14 20:07:12 author: lijianzhan 內容簡介 文章中&#xff0c;主要是為了初次接觸 Android 開發的用戶提供詳細的關于 Android Studio 安裝以及配置教程&#xff0c;涵蓋環境準備、軟件下載、安裝配置全流程&#xff0c;重點解決路徑命名、組件選擇、工作空間設置…

SpringAI+DeepSeek-了解AI和大模型應用

一、認識AI 1.人工智能發展 AI&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;使機器能夠像人類一樣思考、學習和解決問題的技術。 AI發展至今大概可以分為三個階段&#xff1a; 其中&#xff0c;深度學習領域的自然語言處理(Natural Lan…

IP5362至為芯支持無線充的22.5W雙C口雙向快充移動電源方案芯片

英集芯IP5362是一款應用于移動電源&#xff0c;充電寶&#xff0c;手機&#xff0c;平板電腦等支持無線充模式的22.5W雙向快充移動電源方案SOC芯片,集成同步升降壓轉換器、鋰電池充電管理、電池電量指示等功能。兼容全部快充協議&#xff0c;同步開關放電支持最大22.5W輸出功率…

手游剛開服就被攻擊怎么辦?如何防御DDoS?

手游新上線時遭遇DDoS攻擊是常見現象&#xff0c;可能導致服務器癱瘓、玩家流失甚至項目失敗。面對突如其來的攻擊&#xff0c;開發者與運營商需要迅速響應并建立長效防御機制。本文提供應急處理步驟與防御策略&#xff0c;助力游戲穩定運營。 一、手游開服遭攻擊的應急響應 快…

秋招是開發算法一起準備,還是只準備一個

THE LAST TIME 昨天晚上半夜有個星球的26屆的同學&#xff0c;私信問我。說目前是只準備開發還是開發算法一起準備&#xff08;兩者技術知識都挺欠缺的&#xff09; 看到這里&#xff0c;肯定有很多同學會說。馬上都該秋招了&#xff0c;還什么多線程開工&#xff0c;趕緊能住編…

web項目部署配置HTTPS遇到的問題解決方法

今天使用nginxtomcatssl完成了web項目的部署&#xff0c;本以為沒有什么問題&#xff0c;但是在頁面測試的時候又蹦出了這么一個問題&#xff0c;大致是說由于配置了HTTPS&#xff0c;但是之前的請求是通過HTTP請求的&#xff0c;所以現在被攔截&#xff0c;由于缺少某些權限信…

理解與建模彈性膜-AI云計算數值分析和代碼驗證

彈性膜在連接生物學理解和工程創新方面至關重要&#xff0c;因為它們能夠模擬軟組織力學、實現先進的細胞培養系統和促進柔性設備&#xff0c;廣泛應用于軟組織生物力學、細胞培養、生物膜建模和生物醫學工程等領域。 ??AI云計算數值分析和代碼驗證 彈性膜在連接生物學理解和…