卷積神經網絡學習路線(十一)| Stochastic Depth(隨機深度網絡)

2021-02-20 GiantPandaCV

開篇的這張圖代表ILSVRC歷年的Top-5錯誤率,我會按照以上經典網絡出現的時間順序對他們進行介紹,同時穿插一些其他的經典CNN網絡。

前言

時間來到2016年,也就是ResNet被提出的下一年,清華的黃高(也是DenseNet的提出者)在EECV會議上提出了Stochastic Depth(隨機深度網絡)。這個網絡主要是針對ResNet訓練時做了一些優化,即隨機丟掉一些層,優化了速度和性能(有點類似於Dropout的效果?)。論文原文見附錄。

背景

ResNet這個裡程碑式的創新對AI領域帶來了深遠的影響。然而,作者發現ResNet網絡中不是所有的層都是必要的,因此結合經典的Dropout思想提出在訓練過程中隨機丟棄丟掉一些層來優化ResNet的訓練過程。(PS:這不就是把Dropout用到網絡層這個單位嗎?)

結構

首先來看一下原始的ResNet結構,其中代表的是殘差部分,代表的是恆等映射,把這兩部分求和經過激活然後然後輸出。這個過程可以用下面的式子來表示:

如下圖所示:

Stochastic Depth(隨機深度網絡)就是在訓練時加入了一個隨機變量,其中的概率分布是滿足一個伯努利分布的,然後將乘以,對殘差部分做了隨機丟棄。如果,這個結構即是原始的ResNet結構,而當時,殘差支路沒有被激活,整個結構退化為一個恆等函數。這個過程可以用下面的等式來表示:

上面提到滿足一個伯努利分布(01分布),它的取值只有兩種,其中取的概率為,取的概率是。上面的又被稱為生存概率,這個即代表了的可能性,因此的設置相當重要。

一種設置方式是將其設置為同一個值,即,其中代表每個殘差塊參數取值。另外一種設置方式是將其設置為殘差層數的平滑函數。從線性遞減到,一共有L個殘差塊。公式表示如下:

論文選擇了第二種設置方式,即將線性衰減規律應用於每一層的生存概率的設置,這是因為較早的層會提取低級特徵,而這些低級特徵會被後面的特徵應用,因此前面的層不應該頻繁的被丟棄,最終產生的規則如Figure2所示。

論文中提到,將原始的ResNet模型調整為隨機深度網絡之後,期望深度為原始ResNet的,並且訓練過程提速%,這個可以自己做實驗驗證。等等,怎麼來的?看看下圖就懂了。

在這裡插入圖片描述測試

在測試過程中,所有的殘差塊都保持被激活的狀態,以充分利用整個網絡的所有參數。但每個殘差塊的權重都要根據其在訓練中的生存概率進行重新調整,具體來說,前向傳播的公式如下:

在這裡插入圖片描述實驗

論文將ResNet的普通版和Stochastic_Depth版在CIFAR 10/100和SVHN做了實驗。首先作者和其他當時的SOTA網絡在CIFAR10和CIFAR100上的錯誤率做了一個對比,如Table1所示:

訓練過程中的測試錯誤率曲線隨著Epoch數的變化情況如下:

下面的Table2展示了在相同數據集上訓練ResNet的訓練時間,隨機深度網絡比原始的ResNet有25%左右的訓練速度提升。

在這裡插入圖片描述為什麼隨機深度網絡有效?

從實驗結果可以看到,隨機深度網絡的精度比ResNet更高,證明了其具有更好的泛化能力,這是為什麼呢?論文中的解釋是,不激活一部分殘差模塊事實上提現了一種模型融合的思想(和dropout解釋一致),由於訓練時模型的深度隨機,預測時模型的深度確定,實際是在測試時把不同深度的模型融合了起來。不過在查閱資料時我發現了另外一種解釋,覺得也是有道理的,我貼一下截圖。原始文章來自:https://zhuanlan.zhihu.com/p/31200098。

在這裡插入圖片描述代碼實現

隨機深度網絡中的將原始的殘差模塊替換為下面的帶丟棄的單元即可,原始的可訓練的代碼見附錄。


def residual_drop(x, input_shape, output_shape, strides=(1, 1)):
global add_tables

nb_filter = output_shape[0]
conv = Convolution2D(nb_filter, 3, 3, subsample=strides,
border_mode="same", W_regularizer=l2(weight_decay))(x)
conv = BatchNormalization(axis=1)(conv)
conv = Activation("relu")(conv)
conv = Convolution2D(nb_filter, 3, 3,
border_mode="same", W_regularizer=l2(weight_decay))(conv)
conv = BatchNormalization(axis=1)(conv)

if strides[0] >= 2:
x = AveragePooling2D(strides)(x)

if (output_shape[0] - input_shape[0]) > 0:
pad_shape = (1,
output_shape[0] - input_shape[0],
output_shape[1],
output_shape[2])
padding = K.zeros(pad_shape)
padding = K.repeat_elements(padding, K.shape(x)[0], axis=0)
x = Lambda(lambda y: K.concatenate([y, padding], axis=1),
output_shape=output_shape)(x)

_death_rate = K.variable(death_rate)
scale = K.ones_like(conv) - _death_rate
conv = Lambda(lambda c: K.in_test_phase(scale * c, c),
output_shape=output_shape)(conv)

out = merge([conv, x], mode="sum")
out = Activation("relu")(out)

gate = K.variable(1, dtype="uint8")
add_tables += [{"death_rate": _death_rate, "gate": gate}]
return Lambda(lambda tensors: K.switch(gate, tensors[0], tensors[1]),
output_shape=output_shape)([out, x])

後記

隨機深度網絡就講到這裡了,我下線了。。

附錄論文原文:https://arxiv.org/abs/1603.09382v1?utm_content=bufferbf6d7&utm_medium=social&utm_source=twitter.com&utm_campaign=bufferKeras代碼實現:https://github.com/dblN/stochastic_depth_keras卷積神經網絡學習路線往期文章

歡迎關注我的微信公眾號GiantPandaCV,期待和你一起交流機器學習,深度學習,圖像算法,優化技術,比賽及日常生活等。

相關焦點

  • 卷積神經網絡學習路線(五)| 卷積神經網絡參數設置,提高泛化能力?
    test_iter:網絡的迭代測試次數。網絡一次測試batch_size張圖片,因為為了可以將驗證集中所有圖片都測試一次,這個參數乘以batch_size應該等於驗證集中的圖片數。test_interval:網絡迭代多少次進行一次測試。一次迭代即是將一個batch_size的圖片進行訓練。
  • 深度學習入門:淺析卷積神經網絡
    至今已有數種深度學習方法,如卷積神經網絡(CNN)、自編碼神經網絡(包括Auto encoder和Sparse Coding)和深度置信網絡(DBN),並在各個領域中取得了極好的效果。針對這些問題,人們提出了卷積神經網絡,從而很好地解決了上面的三個問題。與常規神經網絡不同,卷積神經網絡的各層中的神經元是3維排列的:寬度、高度和深度(這個深度指的是某層數據的第三個維度,而不是整個網絡的深度,整個網絡的深度指的是網絡的層數)。下圖是一個卷積神經網絡,它的神經元被排列在3個維度(寬、高和深度)。
  • 卷積神經網絡CNN與深度學習常用框架的介紹與使用
    二、什麼是卷積神經網絡卷積神經網絡依舊是層級網絡, 但層的功能和形式做了變化。層級結構可參照下圖這裡還有3個概念:深度/depth,在這幅圖中指的3,通常為圖片的rgb3個顏色通道。>(3)怎麼做:一般復用相同層的權重,新定義層取隨機權重初始值,但要注意調大新定義層的的學習率,調小復用層學習率三、CNN的常用框架 1.Caffe:源於Berkeley的主流CV工具包,支持C++,python,matlab,Model Zoo中有大量預訓練好的模型供使用2.TensorFlow:Google的深度學習框架
  • 深度學習—應用於機器視覺領域的卷積神經網絡(CNN)簡介
    深度學習受到神經學的啟示,模擬人腦的認知與表達過程,通過低層信號到高層特徵的函數映射,來建立學習數據內部隱含關係的邏輯層次模型。深度學習相比於一般的淺層模型的機器學習方法具有多隱層結構,對大數據具有更好的擬合性。
  • CNN卷積神經網絡
    CNN卷積神經網絡卷積神經網絡通常包含以下幾種層:卷積層(Convolutional layer),卷積神經網路中每層卷積層由若干卷積單元組成
  • 如何設計卷積神經網絡CNN?
    所以設計網絡結構還真是一件非常費事費力的事情。如何設計CNN網絡架構資料匯總在inception和resnet網絡提出並相對完善以後,網絡結構的設計就不再爆發式出現了,這兩大類網路涵蓋了大部分應用的卷積網絡結構。!很有用——基於CNN的圖形分類綜合設計指南對於大多數應用來說,應該使用遷移學習而不是從頭訓練網絡。
  • 卷積神經網絡學習路線(八)| 經典網絡回顧之ZFNet和VGGNet
    開篇的這張圖代表ILSVRC歷年的Top-5錯誤率,我會按照以上經典網絡出現的時間順序對他們進行介紹,同時穿插一些其他的經典CNN網絡。前言這是卷積神經網絡學習路線的第八篇文章,我們來回顧一下經典網絡中的ZF-Net和VGGNet。
  • 【深度學習系列】卷積神經網絡詳解(二)——自己手寫一個卷積神經網絡
    ,熟悉Tensorflow,PaddlePaddle等深度學習框架,負責過多個機器學習落地項目,如垃圾評論自動過濾,用戶分級精準營銷,分布式深度學習平臺搭建等,都取了的不錯的效果。博客專欄:https://www.cnblogs.com/charlotte77/前文傳送門:【好書推薦&學習階段】三個月教你從零入門深度學習【深度學習系列】PaddlePaddle之手寫數字識別【深度學習系列】卷積神經網絡CNN原理詳解(一)——基本原理上篇文章中我們講解了卷積神經網絡的基本原理,包括幾個基本層的定義
  • 在深度學習的革命中,談談卷積神經網絡(CNN)
    #掃描上方二維碼進入報名#文章連結:https://my.oschina.net/u/876354/blog/1620906
  • CNN(卷積神經網絡)、RNN(循環神經網絡)、DNN(深度神經網絡)的內部網絡結構有什麼區別?
    2006年,Hinton利用預訓練方法緩解了局部最優解問題,將隱含層推動到了7層[2],神經網絡真正意義上有了「深度」,由此揭開了深度學習的熱潮。這裡的「深度」並沒有固定的定義——在語音識別中4層網絡就能夠被認為是「較深的」,而在圖像識別中20層以上的網絡屢見不鮮。為了克服梯度消失,ReLU、maxout等傳輸函數代替了sigmoid,形成了如今DNN的基本形式。
  • YJango的卷積神經網絡——介紹
    沒看過前面內容的朋友建議看公開課視頻:深層神經網絡設計理念。當中的知識可以更好的幫助理解該文。gitbook首發閱讀地址:卷積神經網絡——介紹, 看前先刷新瀏覽器如果要提出一個新的神經網絡結構,首先就需要引入像循環神經網絡中「時間共享」這樣的先驗知識,降低學習所需要的訓練數據需求量。 而卷積神經網絡同樣也引入了這樣的先驗知識:「空間共享」。
  • 卷積神經網絡(CNN)綜述
    卷積神經網絡概念2. 卷積神經網絡的特點   2.1 局部區域連接   2.2 權值共享   2.3 降採樣3. 卷積神經網絡的結構   3.1 卷積層   3.2 池化層4. 卷積神經網絡的研究進展1.
  • 卷積神經網絡學習路線(十六) | ICLR 2017 SqueezeNet
    在這裡插入圖片描述前言這是卷積神經網絡學習路線的第16篇文章,介紹ICLR 2017的SqueezeNet
  • 深度學習網絡之CNN
    深度學習的提出:2006年,Hinton提出了深度學習,兩個主要的觀點是:深度學習取得成功的原因:深度學習的思想:深度神經網絡的基本思想是通過構建多層網絡,對目標進行多層表示,以期通過多層的高層次特徵來表示數據的抽象語義信息,獲得更好的特徵魯棒性。
  • AMS機器學習課程:Keras深度學習 - 卷積神經網絡正則化
    github.com/djgagne/ams-ml-python-course/blob/master/module_3/ML_Short_Course_Module_3_Deep_Learning.ipynbDavid John Gagne, National Center for Atmospheric Research本文接上一篇文章《AMS機器學習課程:Keras深度學習
  • 卷積神經網絡中十大拍案叫絕的操作
    雖說如此,但是大的卷積核會導致計算量的暴增,不利於模型深度的增加,計算性能也會降低。於是在VGG(最早使用)、Inception網絡中,利用2個3×3卷積核的組合比1個5×5卷積核的效果更佳,同時參數量(3×3×2+1 VS 5×5×1+1)被降低,因此後來3×3卷積核被廣泛應用在各種模型中。
  • 大話卷積神經網絡CNN,小白也能看懂的深度學習算法教程,全程乾貨...
    這個定義太大了,反而讓人有點不懂,簡答來說,深度學習就是通過多層神經網絡上運用各種機器學習算法學習樣本數據的內在規律和表示層次,從而實現各種任務的算法集合。各種任務都是啥,有:數據挖掘,計算機視覺,語音識別,自然語言處理等。可能有人會問那麼深度學習,機器學習還有人工智慧的關係是怎麼樣的呢?
  • 神奇GIF動畫讓你秒懂各種深度學習卷積神經網絡操作原理
    打開APP 神奇GIF動畫讓你秒懂各種深度學習卷積神經網絡操作原理 深度學習思考者 發表於 2017-11-15 18:58:34
  • 機器之心GitHub項目:從零開始用TensorFlow搭建卷積神經網絡
    機器之心項目地址:https://github.com/jiqizhixin/ML-Tutorial-Experiment本文的重點是實現,並不會從理論和概念上詳細解釋深度神經網絡、卷積神經網絡、最優化方法等基本內容。但是機器之心發過許多詳細解釋的入門文章或教程,因此,我們希望讀者能先了解以下基本概念和理論。
  • 深度學習、圖像分類入門,從VGG16卷積神經網絡開始
    向AI轉型的程式設計師都關注了這個號👇👇👇大數據挖掘DT機器學習  公眾號: datayx剛開始接觸深度學習、卷積神經網絡的時候非常懵逼,不知道從何入手,我覺得應該有一個進階的過程,也就是說,理應有一些基本概念作為奠基石,讓你有底氣去完全理解一個龐大的卷積神經網絡:本文思路: