日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

深度学习之卷积神经网络(12)深度残差网络

發(fā)布時間:2023/12/15 卷积神经网络 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习之卷积神经网络(12)深度残差网络 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深度學習之卷積神經網絡(12)深度殘差網絡

  • ResNet原理
  • ResBlock實現

AlexNet、VGG、GoogleLeNet等網絡模型的出現將神經網絡的法陣帶入了幾十層的階段,研究人員發(fā)現網絡的層數越深,越有可能獲得更好的泛化能力。但是當模型加深以后,網絡變得越來越難訓練,這主要是由于梯度彌散和梯度爆炸現象造成的。在較深層數的神經網絡中,梯度信息由網絡的末層傳向網絡的首層時,傳遞的過程中會出現梯度接近于0或梯度值非常大的現象。網絡層數越深,這種現象可能會越嚴重。

?那么怎么解決深層神經網絡的梯度彌散和梯度爆炸現象呢?一個很自然的想法是,既然淺層神經網絡不容易出現這些梯度現象,那么就可以嘗試給深層神經網絡添加一種 回退到淺層神經網絡的機制。當深層神經網絡可以輕松地回退到淺層神經網絡時,深層神經網絡可以獲得與淺層設立相當的模型性能,而不至于更糟糕。

?通過在輸入和輸出之間添加一條直接連接的 Skip Connection可以讓神經網絡具有回退的能力。以VGG13深度神經網絡為例,假設觀察到VGG13模型出現梯度彌散現象,而10層的網絡模型并沒有觀測到梯度彌散現象,那么可以考慮在最后的兩個卷積層添加Skip Connection,如下圖所示。通過這種方式,網絡模型可以自動選擇是否經由這兩個卷積層完成特征變換,還是直接跳過這兩個卷積層而選擇Skip Connection,亦或結合兩個卷積層和Skip Connection的輸出。

添加了Skip Connection的VGG13網絡結構


?2015年,微軟亞洲研究院何凱明等人發(fā)表了基于Skip Connection的深度殘差網絡(Residual Nerual Network,簡稱ResNet)算法[1],并提出了18層、34層、50層、101層、152層的ResNet-18、ResNet-34、ResNet-50、ResNet-101和ResNet-152等模型,甚至成功訓練出層數達到1202層的極深神經網絡。ResNet在ILSVRC2015挑戰(zhàn)賽ImageNet數據集上的分類、檢測等任務上面均獲得了最好性能,ResNet論文至今已經獲得超25000的引用量,可見ResNet在人工智能行業(yè)的影響力。

[1] K. He, X. Zhang, S. Ren 和 J. Sun, “Deep Residual Learning for Image Recognition,” CoRR, 卷 abs/1512.03385, 2015.

ResNet原理

?ResNet通過在卷積層的輸入和輸出之間添加Skip Connec-tion實現層數回退機制,如下圖所示,輸入x\boldsymbol xx通過兩個卷積層,得到特征變換后的輸出F(x)\mathcal F(\boldsymbol x)F(x),與輸入x\boldsymbol xx進行對應元素的相加運算,得到最終輸出H(x)\mathcal H(\boldsymbol x)H(x):
H(x)=x+F(x)\mathcal H(\boldsymbol x)=\boldsymbol x+\mathcal F(\boldsymbol x)H(x)=x+F(x)
H(x)\mathcal H(\boldsymbol x)H(x)叫做殘差模塊(Residual Block,簡稱ResBlock)。由于被Skip Connection包圍的卷積神經網絡需要學習映射F(x)=H(x)?x\mathcal F(\boldsymbol x)=\mathcal H(\boldsymbol x)-\boldsymbol xF(x)=H(x)?x,故稱為殘差網絡。

?為了能夠滿足輸入x\boldsymbol xx與卷積層的輸出F(x)\mathcal F(\boldsymbol x)F(x)能夠相加運算,需要輸入x\boldsymbol xx的shape與F(x)\mathcal F(\boldsymbol x)F(x)的shape完全一致。當出現shape不一致時,一般通過在Skip Connection上添加額外的卷積運算緩解將輸入x\boldsymbol xx變換到與F(x)\mathcal F(\boldsymbol x)F(x)相同的shape,如下圖中identity(x)\text{identity}(\boldsymbol x)identity(x)函數所示,其中identity(x)\text{identity}(\boldsymbol x)identity(x)1×11×11×1的卷積運算居多,主要英語調整輸入的通道數。

殘差模塊


?如下圖所示,對比了34層的深度殘差網絡、34層的普通深度網絡以及19層的VGG網絡結構。可以看到,深度殘差網絡通過堆疊殘差模塊,達到了較深的網絡層數,從而獲得了訓練穩(wěn)定、性能優(yōu)越的深層網絡模型。

網絡結構比較

ResBlock實現

?深度殘差網絡并沒有增加新的網絡層類型,只是通過在輸入和輸出之間添加一條Skip Connection,因此并沒有針對ResNet的底層實現。在TensorFlow中通過調用普通卷積層即可實現殘差模塊。





?首先創(chuàng)建一個新類,在初始階段創(chuàng)建殘差塊中需要的卷積層、激活函數層等,首先新建F(x)\mathcal F(\boldsymbol x)F(x)卷積層,代碼如下:

class BasicBlock(layers.Layer):# 殘差模塊def __init__(self, filter_num, stride=1):super(BasicBlock, self).__init__()# 第一個卷積單元self.conv1 = layers.Conv2D(filter_num, (3, 3), strides=stride, padding='same')self.bn1 = layers.BatchNormalization()self.relu = layers.Activation('relu')# 第二個卷積單元self.conv2 = layers.Conv2D(filter_num, (3, 3), strides=1, padding='same')self.bn2 = layers.BatchNormalization()


其中:

  • __init__(self, filter_num, stride=1)函數為初始化函數,filter_num為卷積核的數量,stride=1表示不對輸入進行下采樣;
  • strides=stride, padding='same'表示可以直接得到輸入、輸出同大小的卷積層;
  • layers.BatchNormalization()表示標準化層;

?當F(x)\mathcal F(\boldsymbol x)F(x)的形狀與x\boldsymbol xx不同時,無法直接相加,我們需要新建identity(x)\text{identity}(\boldsymbol x)identity(x)卷積層,來完成x\boldsymbol xx的形狀轉換。緊跟上面代碼,實現如下:

if stride != 1:# 通過1x1卷積完成shape匹配self.downsample = Sequential()self.downsample.add(layers.Conv2D(filter_num, (1, 1), strides=stride)) else:# shape匹配,直接短接self.downsample = lambda x:x


上述代碼表示如果stride(即步長)如果不為1的話,那么輸出與輸入的shape不相同,那么此時我們就需要新建identity(x)\text{identity}(\boldsymbol x)identity(x)卷積層,來完成x\boldsymbol xx的形狀轉換,使之與輸入的shape相同。

?在向前傳播時,只需要將F(x)\mathcal F(\boldsymbol x)F(x)identity(x)\text{identity}(\boldsymbol x)identity(x)相加,并添加ReLU激活函數即可。向前計算函數代碼如下:

def call(self, inputs, training=None):# [b, h, w, c],通過第一個卷積單元out = self.conv1(inputs)out = self.bn1(out)out = self.relu(out)# 通過第二個卷積單元out = self.conv2(out)out = self.bn2(out)# 通過identity模塊identity = self.downsample(inputs)# 2條路徑輸出直接相加output = layers.add([out, identity])output = tf.nn.relu(output) # 激活函數return output

總結

以上是生活随笔為你收集整理的深度学习之卷积神经网络(12)深度残差网络的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。