深度剪枝的全局壓縮:DenseNet

一、DenseNet概覽

DenseNet是對原本Convolution神經網絡模型的一種改進。它通過增加Direct Connection實現了網絡的全連接,從而讓前一層的輸出作為後一層的輸入,直接將更多的梯度和網絡層之間的信息進行傳遞、共享,使得堆疊的層包含多種信息進行下一層特徵的選擇。因此,相比於傳統的Convolution Network,DenseNet在預測過程中,會引用其中更多的特徵圖,從而解決了傳統網絡退化的問題,得到了更好的精度表現。

二、DenseNet網絡層詳解

在傳統的Convolution Network中,前一層輸出的梯度無法在網絡的後續部分進行共享,只能被相鄰的層利用,這種結構在網絡中會造成消散現象和梯度爆炸的問題。為了避免這種缺失,DenseNet在網絡中增加了直接連接(或稱殘差連接),即在每一層的輸出層添加前一層的輸出(即直接將前面層的特徵矩陣拼接到後面層的特徵矩陣中)。如圖1所示,傳統的Convolution Network是將前一層的輸出與後面的層輸入進行矩陣卷積進行網絡連接;而DenseNet是將前一層的輸出直接連接到後面的層輸入中,產生共享的稠密連接。這種結構可以在前層和後層的輸出中共享信號和梯度,這樣從而使得網絡的性能有所提高,特別是在小規模數據上的分類烤箱。

圖1傳統卷積網絡和DenseNet

三、Destination of DenseNet

相對於Inception系列、ResNet,DenseNet實現更加簡單,而且有着更好的特性。其最主要的特性是網絡中的數據傳遞是在所有層之間跳躍,而不是僅在相鄰層之間傳遞,這使得後一個層能夠使用之前層的所有輸出。由於所有的層對輸出進行連接,因此稱為Dense connection。DenseNet的目標就是實現更快的訓練和更高的準確率,同時它也能減輕依賴抗線性附加部分的壓力,使能讓每一層輸出一部分更加多元化的特徵卷積核,從而提升特徵可用性,去除特徵重複。

四、DenseNet 模型的構建

DenseNet可以以它階段中每個卷積層作為開始,它的基本單位是即含有3個層的卷積、BN、ReLU塊(Conv-BN-ReLU)。他們組成了DenseNet 模型中的基本單元,每個單元又被一些具有相同輸出通道數的單元所組成,從而形成了Dense block,然後Dense block 之後再接一個 空間變換塊(即 transition layer),該層上有一個 1\*1 卷積層用於將輸出通道數減半,並使用 stride = 2 的平均池化操作減小了輸入數據的空間尺寸。訓練過程中,為了防止過擬合,還採用了 dropout 技術對 Dense block中的 Conv-BN-ReLU層中的 BN-ReLU層進行訓練。

# DenseNet model construction
def get_model(input_shape, num_classes):
    input_image = Input(input_shape)
    x = Conv2D(64, (3, 3), padding='same')(input_image)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    x = Dense_Block(x, 32)
    x = Transition(x, 128)
    x = Dense_Block(x, 32)
    x = Transition(x, 256)
    x = Dense_Block(x, 32)
    x = Transition(x, 512)
    x = Dense_Block(x, 32)
    x = GlobalAveragePooling2D()(x)
    x = Dense(num_classes, activation='softmax')(x)
    model = Model(inputs=input_image, outputs=x, name='densenet')
    return model

五、DenseNet 網絡結構

DenseNet主要由三個部分組成:多個Dense Block,Transition Layer和全局池化和分類器。

*1、Dense Block*

每個Dense Block包含相同數量的稠密連接網絡結構,可以使用L個稠密塊為例。每個稠密塊都應該有相同數量的卷積層C(k),該卷積層可以使用較小的3*3大小進行設置,因為它已經具有輸入圖像的所有信息才能執行下一步操作。也可以在每個連接後添加BN-ReLU,以保證稠密模型是分別應用於每個卷積層的組。每個卷積層的輸出都被饋送到後面的所有層,從而實現了稠密的連接。

*2、Transition Layer*

緊接Dense Block之後是轉換層或過渡層,以降低稠密連接卷積層中的特徵圖的數量,也就是收縮圖。它通過包含1×1卷積層和平均池層來實現上述操作。 1×1卷積用於減少此類減少,以避免過度降低空間分辨率,一般將特徵圖減半。 平均池層的作用是對每個特徵映射進行下採樣並減少其數量。這些層也讓模型更加緊湊,減少其參數的數量。

*3、Global Average Pooling 和分類器*

通過使用10個稠密塊和一個全局平均池層,DenseNet可以保留有用信息並削減參數數量。然後將結果輸入分類器,而一個單一的全連接層用於分類。

六、DenseNet和ResNet的對比

與ResNet通過保留先前層的參數來操作,DenseNet從上文中討論的密集層中受益。這些層使網絡在每一層中添加所有已計算特徵。 這種方法非常適用於具有具體信息的分支。 另一方面,ResNet的重點是新特徵的集成。這兩種方法都可以提高結果。 雖然DenseNet通過添加直接連接來創建非常深的神經網絡,但ResNet是第一個可以成功進行100層層次堆疊的模型之一。

七、為什麼性能會優於ResNet

a、DenseNet可以顯著提高網絡的伸縮性,在保留網絡中的極少量參數的同時實現更高的準確性。眾所周知,高維數據集可以在非常少的網絡深度下實現準確度的高精度分類。主要原因是高維空間中相對於輸入的冗餘信息,這在兩個隨機輸入數據中是共享的。整個DenseNet網絡結構的設計主要目的是為模型加入更多的共享參數,其中這些參數由高維數據決定。如此設計網絡,在長時間訓練中就可以訓練出高相關性和高冗餘性特徵的模型。

b、ResNet是在卷積神經網絡中的一個重要進展,因為它可以幫助我們深度堆疊層,並減輕在訓練過程中出現梯度消失問題。但是當層數越來越深時,存在一些不利的定性性質(當違反i.i.d偏差時)。因此,為了在保持高精度的同時解決這些問題,DenseNet通過Concatenation 和非線性變量的引入,來幫助降低和減輕定性偏差的影響從而提高結果。

八、DenseNet網絡選取

DenseNet超參數遵循ResNet的一般套路,由於DenseNet中包含更多的連接,因此它需要更少的層數。這樣就不僅可以避免網絡的過擬合問題,同時也可以更好地保證網絡穩定性,提高學習性能。一系列DenseNet模型已經在ImageNet、CIFAR、COCO、PASCAL VOC等競賽中展示出了比其他流行模型更高的精度(見表1)。其中最有代表性的DenseNet則是由121層、169層、201層和265層組成的4個模型。

Table 1: DenseNet在不同數據上的表現

原創文章,作者:MWCKR,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/332123.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
MWCKR的頭像MWCKR
上一篇 2025-01-21 17:30
下一篇 2025-01-21 17:30

相關推薦

  • 如何使用HTML修改layui內部樣式影響全局

    如果您想要使用layui來構建一個美觀的網站或應用,您可能需要使用一些自定義CSS來修改layui內部組件的樣式。然而,修改layui組件的樣式可能會對整個頁面產生影響,甚至可能破…

    編程 2025-04-29
  • 深度查詢宴會的文化起源

    深度查詢宴會,是指通過對一種文化或主題的深度挖掘和探究,為參與者提供一次全方位的、深度體驗式的文化品嘗和交流活動。本文將從多個方面探討深度查詢宴會的文化起源。 一、宴會文化的起源 …

    編程 2025-04-29
  • Python下載深度解析

    Python作為一種強大的編程語言,在各種應用場景中都得到了廣泛的應用。Python的安裝和下載是使用Python的第一步,對這個過程的深入了解和掌握能夠為使用Python提供更加…

    編程 2025-04-28
  • Python遞歸深度用法介紹

    Python中的遞歸函數是一個函數調用自身的過程。在進行遞歸調用時,程序需要為每個函數調用開闢一定的內存空間,這就是遞歸深度的概念。本文將從多個方面對Python遞歸深度進行詳細闡…

    編程 2025-04-27
  • 如何通過knife4j設置全局token

    本文將介紹如何在使用knife4j作為接口文檔管理工具時,通過設置全局token來提高接口文檔的安全性。 一、什麼是knife4j Knife4j是一款基於springfox的開源…

    編程 2025-04-27
  • Spring Boot本地類和Jar包類加載順序深度剖析

    本文將從多個方面對Spring Boot本地類和Jar包類加載順序做詳細的闡述,並給出相應的代碼示例。 一、類加載機制概述 在介紹Spring Boot本地類和Jar包類加載順序之…

    編程 2025-04-27
  • C#全局錯誤捕獲

    C#全局錯誤捕獲是指在程序執行過程中遇到異常時,程序能夠自動捕獲並進行處理的機制。該機制可以讓程序員更快地定位和解決錯誤,提高程序的穩定性和可靠性。 一、全局錯誤捕獲的作用 1、提…

    編程 2025-04-27
  • 深度解析Unity InjectFix

    Unity InjectFix是一個非常強大的工具,可以用於在Unity中修復各種類型的程序中的問題。 一、安裝和使用Unity InjectFix 您可以通過Unity Asse…

    編程 2025-04-27
  • idea全局搜索功能

    在編程開發過程中,快速找到所需的文件、代碼塊和對象標識符對於開發者來說非常重要。JetBrains公司開發的IDEA(IntelliJ IDEA)是一個集成開發環境,被廣泛認為是最…

    編程 2025-04-25
  • 深度剖析:cmd pip不是內部或外部命令

    一、問題背景 使用Python開發時,我們經常需要使用pip安裝第三方庫來實現項目需求。然而,在執行pip install命令時,有時會遇到“pip不是內部或外部命令”的錯誤提示,…

    編程 2025-04-25

發表回復

登錄後才能評論