卷積神經網絡學習路線(十八) | Google CVPR 2018 MobileNet V2

2021-02-13 GiantPandaCV
前言

緊接著上篇的MobileNet V1,Google在2018年的CVPR頂會上發表了MobileNetV2,論文全稱為《MobileNetV2: Inverted Residuals and Linear Bottlenecks》,原文地址見附錄。

MobileNet-V2的來源

Mobilenet-V1的出現推動了移動端的神經網絡發展。但MobileNet V1主要使用的Depthwise Conv(深度可分離卷積)雖然降低了9倍的計算量,但遺留了一個問題是我們在實際使用的時候訓練完發現kernel有不少是空的。當時我們認為,Depthwise每個kernel dim相對於普通Conv要小得多,過小的kernel_dim, 加上ReLU的激活影響下,使得神經元輸出很容易變為0,然後就學廢了(因為對於ReLU來說,值為0的地方梯度也為0)。我們還發現,這個問題在定點化低精度訓練的時候會進一步放大。所以為了解決這一大缺點,MobileNet-V2橫空出世。

MobileNet-V2的創新點反殘差模塊

MobileNet V1沒有很好的利用殘差連接,而殘差連接通常情況下總是好的,所以MobileNet V2加上殘差連接。先看看原始的殘差模塊長什麼樣,如Figure3左圖所示:

在原始的殘差模塊中,我們先用卷積降通道過ReLU,再用空間卷積過ReLU,再用卷積過ReLU恢復通道,並和輸入相加。之所以要卷積降通道,是為了減少計算量,不然中間的空間卷積計算量太大。所以殘差模塊k是沙漏形,兩邊寬中間窄。

而MobileNet V2提出的殘差模塊的結構如Figure 3右圖所示:中間的卷積變為了Depthwise的了,計算量很少了,所以通道可以多一點,效果更好,所以通過卷積先提升通道數,再用Depthwise的空間卷積,再用1x1卷積降低維度。兩端的通道數都很小,所以1x1卷積升通道或降通道計算量都並不大,而中間通道數雖然多,但是Depthwise 的卷積計算量也不大。本文將其稱為Inverted Residual Block(反殘差模塊),兩邊窄中間寬,使用較小的計算量得到較好的性能。

最後一個ReLU6去掉

首先說明一下ReLU6,卷積之後通常會接一個ReLU非線性激活函數,在MobileNet V1裡面使用了ReLU6,ReLU6就是普通的ReLU但是限制最大輸出值為6,這是為了在移動端設備float16/int8的低精度的時候,也能有很好的數值解析度,如果對ReLU的激活函數不加限制,輸出範圍0到正無窮,如果激活函數值很大,分布在一個很大的範圍內,則低精度的float16/int8無法很好地精確描述如此大範圍的數值,帶來精度損失。MobileNet V2論文提出,最後輸出的ReLU6去掉,直接線性輸出。理由是:ReLU變換後保留非0區域對應於一個線性變換,僅當輸入低維時ReLU能保留所有完整信息。

網絡結構

這樣,我們就得到 MobileNet V2的基本結構了。下圖左邊是沒有殘差連接並且最後帶ReLU6的MobileNet V1的構建模塊,右邊是帶殘差連接並且去掉了最後的ReLU6層的MobileNet V2構建模塊:

網絡的詳細結構如Table2所示。

其中,是輸入通道的倍增係數(即是中間部分的通道數是輸入通道數的多少倍),是該模塊的重複次數,是輸出通道數,是該模塊第一次重複時的stride(後面重複都是stride等於1)。

實驗結果

通過反殘差模塊這個新的結構,可以使用更少的運算量得到更高的精度,適用於移動端的需求,在 ImageNet 上的準確率如Table4所示。可以看到MobileNet V2又小又快。並且MobileNet V2在目標檢測任務上,也取得了十分不錯的結果。基於MobileNet V2的SSDLite在COCO數據集上map值超過了YOLO V2,且模型大小小10倍,速度快20倍。

在這裡插入圖片描述總結本文提出了一個新的反殘差模塊並構建了MobileNet V2,效果比MobileNet V1更好,且參數更少。本文最難理解的其實是反殘差模塊中最後的線性映射,論文中用了很多公式來描述這個思想,但是實現上非常簡單,就是在 MobileNet V1微結構(bottleneck)中第二個卷積後去掉 ReLU6。對於低維空間而言,進行線性映射會保存特徵,而非線性映射會破壞特徵。Pytorch代碼實現
class Block(nn.Module):
'''expand + depthwise + pointwise'''
def __init__(self, in_planes, out_planes, expansion, stride):
super(Block, self).__init__()
self.stride = stride

planes = expansion * in_planes
self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=1, stride=1, padding=0, bias=False)
self.bn1 = nn.BatchNorm2d(planes)
self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, groups=planes, bias=False)
self.bn2 = nn.BatchNorm2d(planes)
self.conv3 = nn.Conv2d(planes, out_planes, kernel_size=1, stride=1, padding=0, bias=False)
self.bn3 = nn.BatchNorm2d(out_planes)

self.shortcut = nn.Sequential()
if stride == 1 and in_planes != out_planes:
self.shortcut = nn.Sequential(
nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=1, padding=0, bias=False),
nn.BatchNorm2d(out_planes),
)

def forward(self, x):
out = F.relu(self.bn1(self.conv1(x)))
out = F.relu(self.bn2(self.conv2(out)))
out = self.bn3(self.conv3(out))
out = out + self.shortcut(x) if self.stride==1 else out
return out


class MobileNetV2(nn.Module):
# (expansion, out_planes, num_blocks, stride)
cfg = [(1, 16, 1, 1),
(6, 24, 2, 1), # NOTE: change stride 2 -> 1 for CIFAR10
(6, 32, 3, 2),
(6, 64, 4, 2),
(6, 96, 3, 1),
(6, 160, 3, 2),
(6, 320, 1, 1)]

def __init__(self, num_classes=10):
super(MobileNetV2, self).__init__()
# NOTE: change conv1 stride 2 -> 1 for CIFAR10
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(32)
self.layers = self._make_layers(in_planes=32)
self.conv2 = nn.Conv2d(320, 1280, kernel_size=1, stride=1, padding=0, bias=False)
self.bn2 = nn.BatchNorm2d(1280)
self.linear = nn.Linear(1280, num_classes)

def _make_layers(self, in_planes):
layers = []
for expansion, out_planes, num_blocks, stride in self.cfg:
strides = [stride] + [1]*(num_blocks-1)
for stride in strides:
layers.append(Block(in_planes, out_planes, expansion, stride))
in_planes = out_planes
return nn.Sequential(*layers)

def forward(self, x):
out = F.relu(self.bn1(self.conv1(x)))
out = self.layers(out)
out = F.relu(self.bn2(self.conv2(out)))
# NOTE: change pooling kernel_size 7 -> 4 for CIFAR10
out = F.avg_pool2d(out, 4)
out = out.view(out.size(0), -1)
out = self.linear(out)
return out

附錄論文原文:https://arxiv.org/abs/1801.04381參考資料:https://blog.csdn.net/kangdi7547/article/details/81431572推薦閱讀

歡迎關注GiantPandaCV, 在這裡你將看到獨家的深度學習分享,堅持原創,每天分享我們學習到的新鮮知識。( • ̀ω•́ )✧

有對文章相關的問題,或者想要加入交流群,歡迎添加BBuf微信:

在這裡插入圖片描述

相關焦點

  • 輕量級神經網絡系列——MobileNet V2
    mobilenet v1,本次續接第一篇,介紹V1的升級版本,mobilenet v2。CVPR2018MobileNetV1(以下簡稱:V1)過後,我們就要討論討論MobileNetV2(以下簡稱:V2)了。
  • mobilenet系列之又一新成員---mobilenet-v3
    ,mobilenet-v3提供了兩個版本,分別為mobilenet-v3 large 以及mobilenet-v3 small,分別適用於對資源不同要求的情況,論文中提到,mobilenet-v3 small在imagenet分類任務上,較mobilenet-v2,精度提高了大約3.2%,時間卻減少了15%,mobilenet-v3 large在imagenet分類任務上,較mobilenet-v2
  • 卷積神經網絡學習路線(五)| 卷積神經網絡參數設置,提高泛化能力?
    test_iter:網絡的迭代測試次數。網絡一次測試batch_size張圖片,因為為了可以將驗證集中所有圖片都測試一次,這個參數乘以batch_size應該等於驗證集中的圖片數。test_interval:網絡迭代多少次進行一次測試。一次迭代即是將一個batch_size的圖片進行訓練。
  • 卷積神經網絡學習路線(八)| 經典網絡回顧之ZFNet和VGGNet
    開篇的這張圖代表ILSVRC歷年的Top-5錯誤率,我會按照以上經典網絡出現的時間順序對他們進行介紹,同時穿插一些其他的經典CNN網絡。前言這是卷積神經網絡學習路線的第八篇文章,我們來回顧一下經典網絡中的ZF-Net和VGGNet。
  • MobileNet(v2)——CNN經典網絡模型詳解(pytorch實現)
    而本文要講的MobileNet網絡就是專門為移動端,嵌入式端而設計。MobileNet v1MobileNet網絡是由google團隊在2017年提出的,專注於移動端或者嵌入式設備中的輕量級CNN網絡。相比傳統卷積神經網絡,在準確率小幅降低的前提下大大減少模型參數與運算量。
  • Google論文解讀:輕量化卷積神經網絡MobileNetV2 | PaperDaily #38
    本文是 Google 團隊在 MobileNet 基礎上提出的 MobileNetV2,實現分類/目標檢測/語義分割多目標任務:以 MobileNetV2 為基礎設計目標檢測模型 SSDLite(相比 SSD,YOLOv2 參數降低一個數量級,mAP 無顯著變化),語義分割模型 Mobile DeepLabv3。
  • 卷積神經網絡學習路線(十六) | ICLR 2017 SqueezeNet
    在這裡插入圖片描述前言這是卷積神經網絡學習路線的第16篇文章,介紹ICLR 2017的SqueezeNet
  • 生成對抗網絡GANs學習路線
    這份完整的GANs資源合集為研究者提供了完美的生成對抗網絡學習路線。>Network,簡稱GAN)是非監督式學習的一種方法,通過讓兩個神經網絡相互博弈的方式進行學習。生成對抗網絡由一個生成網絡與一個判別網絡組成。生成網絡從潛在空間(latent space)中隨機採樣作為輸入,其輸出結果需要儘量模仿訓練集中的真實樣本。判別網絡的輸入則為真實樣本或生成網絡的輸出,其目的是將生成網絡的輸出從真實樣本中儘可能分辨出來。而生成網絡則要儘可能地欺騙判別網絡。兩個網絡相互對抗、不斷調整參數,最終目的是使判別網絡無法判斷生成網絡的輸出結果是否真實。
  • AI學習路線,詳細整理,由淺入深
    整個專題共包括五門課程:01.神經網絡和深度學習;02.改善深層神經網絡-超參數調試、正則化以及優化;03.結構化機器學習項目;04.卷積神經網絡;05.序列模型。視頻配套PPT應有盡有書籍 神經網絡與深度學習 - 復旦邱錫鵬本書是入門深度學習領域的極佳教材,主要介紹了神經網絡與深度學習中的基礎知識、主要模型(前饋網絡、卷積網絡、循環網絡等)以及在計算機視覺、自然語言處理等領域的應用。
  • AMS機器學習課程:Keras深度學習 - 卷積神經網絡正則化
    - 卷積神經網絡》由於要擬合大量的權重,並且要處理的數據量有限,如果神經網絡受到不適當的約束,它們很容易過度擬合數據集中的噪聲。= Input(shape=train_norm_2d.shape[1:])train_norm_2d.shape[1:](32, 32, 3)第一組二維卷積層from tensorflow.compat.v1.keras.regularizers import l2conv_net_l2 = Conv2D(
  • 深度學習入門:淺析卷積神經網絡
    至今已有數種深度學習方法,如卷積神經網絡(CNN)、自編碼神經網絡(包括Auto encoder和Sparse Coding)和深度置信網絡(DBN),並在各個領域中取得了極好的效果。CNN進階掌握了比較基礎的卷積神經網絡,我們進一步學習更加複雜,也非常流行、有名的幾種結構:LeNet、AlexNet、VGG和ResNet。
  • 舉個例子,如何用GCN圖卷積神經網絡實現摔倒監測?
    由Kipf和Welling提出的GCN被證明是一種有效的圖半監督學習框架應用,如社會、醫療、商業和交通網絡分析,其中典型的對象是在少數有標記數據的幫助下對無標記數據進行分類圖中的樣本。圖卷積網絡(GCN)已被證明是一種有效的基於圖的半卷積網絡框架監督學習應用。GCN的核心操作塊是卷積層通過融合節點屬性和關係,使網絡能夠構造節點嵌入節點之間。不同的特性或特性的相互作用本身就具有不同的影響卷積的層。
  • TensorFlowNews五大經典卷積神經網絡介紹:LeNet / AlexNet / GoogLeNet / VGGNet/
    最常見的是:卷積神經網絡的第一批成功應用,是由 Yann LeCun 在 20 世紀 90 年代開發的。其中最著名的是用於識別郵政編碼,數字等的LeNet架構。首先讓卷積神經網絡在計算機視覺中流行的是由 Alex Krizhevsky,Ilya Sutskever 和 Geoff Hinton 開發的 AlexNet。
  • 【入門必備】史上最全的深度學習資源匯總,速藏!
    作為傳統機器學習重要的一個分支,與機器學習算法相比,深度學習算法最大的特點是至少含有一個隱藏層的神經網絡(NN)。此外,深度學習的分層處理的思想也大大提高了模型的泛化能力。深度學習發展到今天,大致分為以下一些比較流行的網絡結構:深度神經網絡(DNN)、卷積神經網絡(CNN)、循環神經網絡(RNN)、生成對抗網絡(GAN)等。應用最廣的幾個研究領域分別是自然語言處理、語音識別和圖像處理。出現了Tensorflow、Keras、Caffe、Torch等技術框架。
  • 歷年 CVPR 最佳論文盤點(2000 年——2018 年)
    (接收論文列表:http://cvpr2019.thecvf.com/files/cvpr_2019_final_accept_list.txt)正當學界紛紛議論各單位獲接收論文多寡的當兒,雷鋒網 AI 科技評論為大家精心整理了一份從 2000 年——2018 年的 CVPR 最佳論文清單,藉此對這批計算機領域的重要論文進行複習
  • 用於核磁共振影像重建的雙域混合學習級聯卷積網絡
    近年來又有大量基於深度學習的MRI重建算法被提出,然而絕大多數都是基於圖像域優化成像,減少欠採樣數據經過填0補充重建(zero-filled reconstruction)後圖像的混疊(aliasing),而頻域信息沒有得到充分的利用。3. 主要貢獻本文提出了一種基於圖像域和頻域信息混合學習的級聯卷積神經網絡,採用端到端的訓練方式。
  • 縱覽輕量化卷積神經網絡:SqueezeNet、MobileNet、ShuffleNet...
    SqueezeNet 2.2 MobileNet 2.3 ShuffleNet 2.4 Xception三、網絡對比 輕量化模型設計主要思想在於設計更高效的「網絡計算方式」(主要針對卷積方式),從而使網絡參數減少的同時,不損失網絡性能。本文就近年提出的四個輕量化模型進行學習和對比,四個模型分別是:SqueezeNet、MobileNet、ShuffleNet、Xception。
  • 卷積神經網絡學習路線(十一)| Stochastic Depth(隨機深度網絡)
    開篇的這張圖代表ILSVRC歷年的Top-5錯誤率,我會按照以上經典網絡出現的時間順序對他們進行介紹,同時穿插一些其他的經典CNN網絡。然而,作者發現ResNet網絡中不是所有的層都是必要的,因此結合經典的Dropout思想提出在訓練過程中隨機丟棄丟掉一些層來優化ResNet的訓練過程。(PS:這不就是把Dropout用到網絡層這個單位嗎?)
  • 【GAN貨】生成對抗網絡知識資料全集(論文/代碼/教程/視頻/文章等)
    Harnessing     Adversarial  Examples)2014https://arxiv.org/pdf/1412.6572.pdf基於深度生成模型的半監督學習(  Semi-Supervised Learning with Deep      Generative Models )2014https://arxiv.org/pdf/1406.5298v2.pdf基於拉普拉斯金字塔生成式對抗網絡的深度圖像生成模型
  • 縱覽輕量化卷積神經網絡:SqueezeNet、MobileNet、ShuffleNet、Xception
    目錄一、引言 二、輕量化模型     2.1 SqueezeNet    2.2 MobileNet    2.3 ShuffleNet    2.4 Xception三、網絡對比  本文就近年提出的四個輕量化模型進行學習和對比,四個模型分別是:SqueezeNet、MobileNet、ShuffleNet、Xception。(PS: 以上四種均不是模型壓縮方法!!)