前言
本文主要CNN系列論文解讀——GoogLeNet簡(jiǎn)介畜吊、模型結(jié)構(gòu)、網(wǎng)絡(luò)結(jié)構(gòu)的代碼實(shí)現(xiàn)等锨推。原文發(fā)表于語(yǔ)雀文檔嗦董,排版更好看
【論文解讀】CNN深度卷積神經(jīng)網(wǎng)絡(luò)-GoogLeNet?www.yuque.com
更多CNN論文解讀系列:
【論文解讀】CNN深度卷積神經(jīng)網(wǎng)絡(luò)-AlexNet
【論文解讀】CNN深度卷積神經(jīng)網(wǎng)絡(luò)-VGG
【論文解讀】CNN深度卷積神經(jīng)網(wǎng)絡(luò)-Network in Network
【論文解讀】CNN深度卷積神經(jīng)網(wǎng)絡(luò)-GoogLeNet
【論文解讀】CNN深度卷積神經(jīng)網(wǎng)絡(luò)-ResNet
【論文解讀】CNN深度卷積神經(jīng)網(wǎng)絡(luò)-DenseNet
有用的話强重,請(qǐng)點(diǎn)個(gè)贊哦:)
1.簡(jiǎn)介
GoogLeNet是2014年Christian Szegedy等人在2014年大規(guī)模視覺挑戰(zhàn)賽(ILSVRC2014)上使用的一種全新卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),于2015年在CVPR發(fā)表了論文《Going Deeper with Convolutions》虏劲。在這之前的AlexNet缘琅、VGG等結(jié)構(gòu)都是通過增大網(wǎng)絡(luò)的深度(層數(shù))來獲得更好的訓(xùn)練效果,但層數(shù)的增加會(huì)帶來很多負(fù)作用肘迎,比如overfit甥温、梯度消失、梯度爆炸等妓布。inception的提出則從另一種角度來提升訓(xùn)練結(jié)果:能更高效的利用計(jì)算資源姻蚓,在相同的計(jì)算量下能提取到更多的特征,從而提升訓(xùn)練結(jié)果匣沼。
1.1 資源下載
??【2015】【GoogLeNet】Szegedy_Going_Deeper_With_2015_CVPR_paper.pdf
2.Abstract
Abstract
We propose a deep convolutional neural network architecture codenamed Inception that achieves the new state of the art for classification and detection in the ImageNet Large Scale Visual Recognition Challenge 2014(ILSVRC14). The main hallmark of this architecture is theimproved utilization of the computing resources inside the network. By a carefully crafted design, we increased thedepth and width of the network while keeping the computational budget constant. To optimize quality, the architectural decisions were based on the Hebbian principle and the intuition of multi-scale processing. One particular in carnation used in our submission for ILSVRC14 is called GoogLeNet, a 22 layers deep network, the quality of which is assessed in the context of classification and detection.
翻譯
我們提出了一種代號(hào)為Inception的深度卷積神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu)狰挡,該體系結(jié)構(gòu)在ImageNet大規(guī)模視覺識(shí)別挑戰(zhàn)賽2014(ILSVRC14)中實(shí)現(xiàn)了分類和檢測(cè)的最新技術(shù)水平。 該體系結(jié)構(gòu)的主要特點(diǎn)是提高了網(wǎng)絡(luò)內(nèi)部計(jì)算資源的利用率释涛。 通過精心設(shè)計(jì)加叁,我們?cè)诒3钟?jì)算預(yù)算不變的情況下增加了網(wǎng)絡(luò)的深度和寬度。 為了優(yōu)化質(zhì)量唇撬,架構(gòu)決策基于Hebbian原則和多尺度處理的靈感它匕。 在我們提交的ILSVRC14中使用的網(wǎng)絡(luò)結(jié)構(gòu)中的一個(gè)特殊名稱是GoogLeNet,這是一個(gè)22層的深度網(wǎng)絡(luò)窖认,其質(zhì)量在分類和檢測(cè)領(lǐng)域都進(jìn)行了評(píng)估豫柬。
3.網(wǎng)絡(luò)結(jié)構(gòu)
3.1 示意圖
整體架構(gòu)
上圖為主要包含Inception塊+輔助分類器的GoogLeNet結(jié)構(gòu)示意圖
Inception塊
上圖為Inception塊示意圖 (a)為普通的Inception塊告希;(b)為帶有1×1卷積的,可以對(duì)輸入通道降維的Inception塊
3.2 Inception塊特點(diǎn)
- Inception塊之間可以堆疊使用烧给。
- 添加了1×1卷積燕偶,降低輸入的通道維度,避免參數(shù)過量影響訓(xùn)練
- 多卷積核+池化的并行結(jié)構(gòu)础嫡,通過合并層進(jìn)行串聯(lián)杭跪,實(shí)際上讓網(wǎng)絡(luò)具備了自動(dòng)選擇的能力,而不是人為地設(shè)置卷積或池化驰吓,或決定卷積核的尺寸涧尿。
針對(duì)同一個(gè)輸入層,在Inception塊中有四條并行的線路檬贰,其中前1~3個(gè)是1×1卷積層姑廉,第4個(gè)是一個(gè)MaxPooling池化層,這四條線路最后的輸出擁有相同的shape和不同的channel通道數(shù)翁涤。于是桥言,這些輸出最后可在channel維度進(jìn)行合并。 例如:28×28×64葵礼,28×28×128号阿,28×28×32,28×28×32鸳粉。 通道合并層的shape:28×28×256(64+128+32+32)
3.3 layer設(shè)計(jì)
GoogLeNet是作者團(tuán)隊(duì)在參加2014大規(guī)模視覺挑戰(zhàn)賽時(shí)送去參加的幾種Inception結(jié)構(gòu)的模型之一扔涧。該網(wǎng)絡(luò)設(shè)計(jì)時(shí)考慮了計(jì)算效率和實(shí)用性,故可以在單個(gè)設(shè)備上運(yùn)行推理届谈,對(duì)低內(nèi)存設(shè)備比較友好枯夜。 整個(gè)網(wǎng)絡(luò)使用了9個(gè)Inception塊,結(jié)構(gòu)排布如表格中所示:
整個(gè)網(wǎng)絡(luò)深度為22層(參數(shù)層共計(jì)22層),maxpool池化層5層艰山。還添加了網(wǎng)絡(luò)中間一些輔助分類器具湖雹,這是考慮到由于深度較深,整個(gè)模型訓(xùn)練完成可能耗時(shí)較長(zhǎng)曙搬,且淺層網(wǎng)絡(luò)可能對(duì)中間層產(chǎn)生的特征具有較強(qiáng)識(shí)別能力摔吏,故添加了輔助分類器可以在模型訓(xùn)練的中間階段就進(jìn)行分類。在整個(gè)訓(xùn)練過程中纵装,輔助分類器對(duì)于損失的以0.3的權(quán)重加到總損失中征讲;推斷時(shí),輔助網(wǎng)絡(luò)將被丟棄搂擦。
4.論文解讀
1.介紹
論文先提到了兩點(diǎn): 1.在過去的幾年中稳诚,由于深度學(xué)習(xí)和卷積神經(jīng)網(wǎng)絡(luò)的發(fā)展,圖像分類和目標(biāo)檢測(cè)的能力得到顯著提高瀑踢。不僅僅是得益于硬件提升扳还、更大的數(shù)據(jù)集和模型才避,而很重要一部分是得益于新的思想、新算法和網(wǎng)絡(luò)結(jié)構(gòu)的改進(jìn)氨距。2014年提交參賽ILSVRC 2014的網(wǎng)絡(luò)結(jié)構(gòu)GoogLeNet就是一種典型的新型網(wǎng)絡(luò)桑逝,其參數(shù)量甚至比2012年Krizhevsky等人的AlexNet少12倍;還有在目標(biāo)檢測(cè)方面的R-CNN算法俏让,并不是采用了更大更深的網(wǎng)絡(luò)楞遏,而是得益于架構(gòu)設(shè)計(jì)和經(jīng)典CV的協(xié)同作用。 2.隨著移動(dòng)端和嵌入式設(shè)備的不斷發(fā)展首昔,算法效率和參數(shù)數(shù)量的控制越來越重要寡喝,我們需要考慮模型和算法在實(shí)際場(chǎng)景下的應(yīng)用。
然后闡述了本論文的重點(diǎn): 本文主要闡述名為Inception深度神經(jīng)網(wǎng)絡(luò)架構(gòu)勒奇,其得名源于Network in Network以及“We need to go deeper”這個(gè)網(wǎng)絡(luò)熱點(diǎn)预鬓。在他們看來,deep有兩層含義:1.表示以“初始模塊”的形式引入新的架構(gòu)赊颠,2.字面意義上的網(wǎng)絡(luò)層數(shù)夠深格二。通過該架構(gòu),作者團(tuán)隊(duì)活動(dòng)了2014(ILSVRC14)的冠軍竣蹦,并大幅領(lǐng)先其他網(wǎng)絡(luò)架構(gòu)顶猜。
2.相關(guān)工作
Serre等人受靈長(zhǎng)類視覺皮層神經(jīng)科學(xué)模型的啟發(fā),使用一系列不同大小的固定Gabor過濾器來處理多個(gè)尺寸痘括。在這里长窄,作者使用了類似的策略。Inception架構(gòu)中的所有filter都是學(xué)習(xí)來的远寸,通過Inception塊的堆疊抄淑,整個(gè)GoogLeNet的layer深度達(dá)到了22層。 作者團(tuán)隊(duì)借鑒了在Network in Network中使用的1×1卷積驰后,這里的目的有2個(gè),其中最主要的用來降維矗愧,通 過降低通道數(shù)來削減參數(shù)量灶芝。這樣帶來的效果是:同等參數(shù)量的模型,可達(dá)到更深和更寬唉韭。 最后作者提到了當(dāng)前最新的由Girshick等人提出的目標(biāo)檢測(cè)模型R-CNN夜涕,總體可以將目標(biāo)檢測(cè)歸納為兩個(gè)步驟,即two stage方法:1.利用低層次線索(如顏色和紋理)属愤,以一種類別不可知的方式生成物體的候選框bounding box女器;2.使用CNN分類器將所有候選框中的物體進(jìn)行分類。作者表示住诸,他們?cè)跈z測(cè)方面的提及針對(duì)這兩個(gè)階段都進(jìn)行了改進(jìn)驾胆。
3.動(dòng)機(jī)和深層次考慮
提高卷積神經(jīng)網(wǎng)絡(luò)模型表現(xiàn)的最直接方法——增加網(wǎng)絡(luò)尺寸涣澡,這主要包括兩方面:
- 1.增加layer數(shù)量,增加深度
- 2.增加網(wǎng)絡(luò)width寬度
但是尺寸的增加也帶來兩個(gè)問題:
- 1.更大的參數(shù)規(guī)模丧诺,更容易過擬合
- 2.模型訓(xùn)練時(shí)占用更多計(jì)算機(jī)資源
論文里指出入桂,解決這兩個(gè)問題有個(gè)基礎(chǔ)方法:引入稀疏型。用稀疏的layer代替全連接層驳阎,甚至在卷積內(nèi)部抗愁。因?yàn)槌四7律锵到y(tǒng)外,根據(jù)Arora[2]等人的開創(chuàng)新工作呵晚,此舉將有著充分的理論基礎(chǔ)蜘腌。他們的研究表明:如果數(shù)據(jù)集的概率分布可由一個(gè)大型的、非常稀疏的神經(jīng)網(wǎng)絡(luò)表示饵隙,那么可通過分析上一層激活信息的統(tǒng)計(jì)指標(biāo)和將高度相關(guān)的神經(jīng)元聚類來逐層地構(gòu)建最佳網(wǎng)絡(luò)拓?fù)浯橹椤2恍业氖牵裉煊?jì)算機(jī)的基礎(chǔ)架構(gòu)導(dǎo)致此類計(jì)算時(shí)效率很低癞季,但是此類架構(gòu)再未來可能會(huì)有一席之地劫瞳。**作者表示Inception網(wǎng)絡(luò)結(jié)構(gòu)最初是源于一個(gè)案例研究,用于分析基于上述構(gòu)想所構(gòu)造的視覺網(wǎng)絡(luò)的稀疏結(jié)構(gòu)的效果绷柒,機(jī)緣巧合地發(fā)現(xiàn)其在定位和目標(biāo)檢測(cè)的任務(wù)中特別有效志于,雖然如此,對(duì)其有效性是否源于最初構(gòu)想废睦,任然需要進(jìn)行更徹底的分析和驗(yàn)證伺绽。
4.結(jié)構(gòu)細(xì)節(jié)
Inception結(jié)構(gòu)的主要思想是考慮如何近似地估計(jì)卷積視覺網(wǎng)絡(luò)的最佳局部稀疏結(jié)構(gòu),并方便地用Dense組件來實(shí)現(xiàn)它嗜湃。Arora[2]等人提出了一種逐層構(gòu)建的方法奈应,即分析上一層的相關(guān)統(tǒng)計(jì)量,并將其聚類為具有高度相關(guān)性的unit單元組购披。這些聚合的單元組又成為了下一層的輸入杖挣。于是這里是用一組filter來實(shí)現(xiàn)類似操作,通過filter提取上一層的特征信息刚陡,并在通道維上串聯(lián)聚合惩妇,形成一整個(gè)concactanation連結(jié)層(見Inception塊示意圖中)
文中提到,目前固定Inception塊中filter尺寸固定在1×1,3×3,5×5的原因是出于便利性考慮筐乳,因?yàn)榇蟪叽鏵ilter和小尺寸filter的混合會(huì)導(dǎo)致卷積后的尺寸對(duì)齊不太方便歌殃。 ** 還有,為什么給出的Inception模塊分為兩種結(jié)構(gòu)蝙云,因?yàn)?a)類結(jié)構(gòu)氓皱,由于層層疊加,容易導(dǎo)致在連結(jié)層的通道數(shù)暴增,為了解決此問題波材,需要在每一個(gè)Inception塊用filter組進(jìn)行特征提取前股淡,先用1×1卷積進(jìn)行降維處理,于是有了(b)類的Inception結(jié)構(gòu)
總體而言各聘,一個(gè)Inception網(wǎng)絡(luò)揣非,是一個(gè)由Inception塊層層堆疊,中間穿插偶爾的Max pooling(stride 2)將尺寸減半的網(wǎng)絡(luò)結(jié)構(gòu)躲因。出于訓(xùn)練性能開銷的考慮早敬,也可以在網(wǎng)絡(luò)的較低層級(jí)部分使用傳統(tǒng)的卷積層,而在較高層級(jí)上使用Inception塊大脉。
6.訓(xùn)練方法論
模型訓(xùn)練采用了DistBelief分布式機(jī)器學(xué)習(xí)系統(tǒng)對(duì)GoogleNet進(jìn)行了訓(xùn)練(Cpu)搞监。論文表示使用高端GPU,可以在1周內(nèi)完成模型的訓(xùn)練镰矿。訓(xùn)練采用了0.9動(dòng)量的異步隨機(jī)梯度下降琐驴,固定學(xué)習(xí)率(每8個(gè)迭代學(xué)習(xí)率降低4%),另外使用各個(gè)各個(gè)尺寸的圖片(數(shù)據(jù)增強(qiáng))對(duì)于降低過擬合很有用秤标。
9.總結(jié)
作者在論文中表示绝淡,用現(xiàn)有的dense結(jié)構(gòu)來組合構(gòu)建出最佳的稀疏結(jié)構(gòu),是改善計(jì)算機(jī)視覺神經(jīng)網(wǎng)絡(luò)的可行方法苍姜。與較淺和較窄的網(wǎng)絡(luò)結(jié)構(gòu)相比牢酵,該方法的優(yōu)點(diǎn)在于計(jì)算量適度增加的情況下顯著提高網(wǎng)絡(luò)效果。在目標(biāo)檢測(cè)領(lǐng)域衙猪,盡管沒有利用上下文和bounding box回歸馍乙,我們的效果還是很好,進(jìn)一步表面Inception結(jié)構(gòu)的優(yōu)越性垫释,未來將在此基礎(chǔ)上繼續(xù)研究更加精細(xì)和自動(dòng)化地方式來創(chuàng)造稀疏結(jié)構(gòu)用以促進(jìn)各領(lǐng)域的工作
5.代碼實(shí)現(xiàn)
這里使用tensorflow2.0實(shí)現(xiàn)網(wǎng)絡(luò)結(jié)構(gòu)丝格,而不是完整的訓(xùn)練,在《動(dòng)手學(xué)深度學(xué)習(xí)》-tf2.0版一書中棵譬,有完整的訓(xùn)練代碼显蝌。完整訓(xùn)練可參考:含并行連結(jié)的網(wǎng)絡(luò)(GoogLeNet)
定義Inception塊
import tensorflow as tf
class Inception(tf.keras.layers.Layer):
def __init__(self,c1, c2, c3, c4):
super().__init__()
# 線路1,單1 x 1卷積層
self.p1_1 = tf.keras.layers.Conv2D(c1, kernel_size=1, activation='relu', padding='same')
# 線路2订咸,1 x 1卷積層后接3 x 3卷積層
self.p2_1 = tf.keras.layers.Conv2D(c2[0], kernel_size=1, padding='same', activation='relu')
self.p2_2 = tf.keras.layers.Conv2D(c2[1], kernel_size=3, padding='same',
activation='relu')
# 線路3琅束,1 x 1卷積層后接5 x 5卷積層
self.p3_1 = tf.keras.layers.Conv2D(c3[0], kernel_size=1, padding='same', activation='relu')
self.p3_2 = tf.keras.layers.Conv2D(c3[1], kernel_size=5, padding='same',
activation='relu')
# 線路4,3 x 3最大池化層后接1 x 1卷積層
self.p4_1 = tf.keras.layers.MaxPool2D(pool_size=3, padding='same', strides=1)
self.p4_2 = tf.keras.layers.Conv2D(c4, kernel_size=1, padding='same', activation='relu')
def call(self, x):
p1 = self.p1_1(x)
p2 = self.p2_2(self.p2_1(x))
p3 = self.p3_2(self.p3_1(x))
p4 = self.p4_2(self.p4_1(x))
return tf.concat([p1, p2, p3, p4], axis=-1) # 在通道維上連結(jié)輸出
構(gòu)造整個(gè)網(wǎng)絡(luò)
GoogLeNet跟VGG一樣算谈,在主體卷積部分中使用5個(gè)模塊(block),每個(gè)模塊之間使用步幅為2的3×3最大池化層來減小輸出高寬料滥。第一模塊使用一個(gè)64通道的7×7卷積層然眼。
b1 = tf.keras.models.Sequential()
b1.add(tf.keras.layers.Conv2D(64, kernel_size=7, strides=2, padding='same', activation='relu'))
b1.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2, padding='same'))
第二模塊使用2個(gè)卷積層:首先是64通道的1×1卷積層,然后是將通道增大3倍的3×3卷積層葵腹。它對(duì)應(yīng)Inception塊中的第二條線路高每。
b2 = tf.keras.models.Sequential()
b2.add(tf.keras.layers.Conv2D(64, kernel_size=1, padding='same', activation='relu'))
b2.add(tf.keras.layers.Conv2D(192, kernel_size=3, padding='same', activation='relu'))
b2.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2, padding='same'))
第三模塊串聯(lián)2個(gè)完整的Inception塊屿岂。第一個(gè)Inception塊的輸出通道數(shù)為64+128+32+32=256,其中4條線路的輸出通道數(shù)比例為64:128:32:32=2:4:1:1鲸匿。其中第二爷怀、第三條線路先分別將輸入通道數(shù)減小至96/192=1/2和16/192=1/12后,再接上第二層卷積層带欢。第二個(gè)Inception塊輸出通道數(shù)增至128+192+96+64=480运授,每條線路的輸出通道數(shù)之比為128:192:96:64=4:6:3:2。其中第二乔煞、第三條線路先分別將輸入通道數(shù)減小至128/256=1/2和32/256=1/8吁朦。
b3 = tf.keras.models.Sequential()
b3.add(Inception(64, (96, 128), (16, 32), 32))
b3.add(Inception(128, (128, 192), (32, 96), 64))
b3.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2, padding='same'))
第四模塊更加復(fù)雜。它串聯(lián)了5個(gè)Inception塊渡贾,其輸出通道數(shù)分別是:192+208+48+64=512逗宜、160+224+64+64=512、128+256+64+64=512空骚、112+288+64+64=528和256+320+128+128=832纺讲。 這些線路的通道數(shù)分配和第三模塊中的類似,首先含3×3卷積層的第二條線路輸出最多通道囤屹,其次是僅含1×1卷積層的第一條線路熬甚,之后是含5×5卷積層的第三條線路和含3×3最大池化層的第四條線路。其中第二牺丙、第三條線路都會(huì)先按比例減小通道數(shù)则涯。這些比例在各個(gè)Inception塊中都略有不同。
b4 = tf.keras.models.Sequential()
b4.add(Inception(192, (96, 208), (16, 48), 64))
b4.add(Inception(160, (112, 224), (24, 64), 64))
b4.add(Inception(128, (128, 256), (24, 64), 64))
b4.add(Inception(112, (144, 288), (32, 64), 64))
b4.add(Inception(256, (160, 320), (32, 128), 128))
b4.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2, padding='same'))
第五模塊有輸出通道數(shù)為256+320+128+128=832和384+384+128+128=1024的兩個(gè)Inception塊冲簿。其中每條線路的通道數(shù)的分配思路和第三粟判、第四模塊中的一致,只是在具體數(shù)值上有所不同峦剔。需要注意的是档礁,第五模塊的后面緊跟輸出層,該模塊同NiN一樣使用全局平均池化層來將每個(gè)通道的高和寬變成1吝沫。最后我們將輸出變成二維數(shù)組后接上一個(gè)輸出個(gè)數(shù)為標(biāo)簽類別數(shù)的全連接層呻澜。
b5 = tf.keras.models.Sequential()
b5.add(Inception(256, (160, 320), (32, 128), 128))
b5.add(Inception(384, (192, 384), (48, 128), 128))
b5.add(tf.keras.layers.GlobalAvgPool2D())
net = tf.keras.models.Sequential([b1, b2, b3, b4, b5, tf.keras.layers.Dense(1000)])
下面演示各個(gè)模塊之間的輸出的形狀變化。
X = tf.random.uniform(shape=(1, 224, 224, 3))
for layer in net.layers:
X = layer(X)
print(layer.name, 'output shape:\t', X.shape)
輸出:
sequential output shape: (1, 56, 56, 64)
sequential_1 output shape: (1, 28, 28, 192)
sequential_2 output shape: (1, 14, 14, 480)
sequential_3 output shape: (1, 7, 7, 832)
sequential_6 output shape: (1, 1024)
dense_1 output shape: (1, 1000)
6.總結(jié)
通過創(chuàng)新性的Inception模塊和較為復(fù)雜的網(wǎng)絡(luò)設(shè)計(jì)惨险,使得作者團(tuán)隊(duì)在ILSVRC14上力壓VGGNet奪冠羹幸。而GoogLeNet作為Inception模塊設(shè)計(jì)的代表,有很多值得學(xué)習(xí)的地方辫愉。通過并行的filter將輸入特征提取并在通道維上進(jìn)行串聯(lián)合并栅受,構(gòu)成下一層的輸入,再將Inception塊層層疊加。通過這種方式引入了稀疏型屏镊、模擬了卷積視覺網(wǎng)絡(luò)的最佳拓?fù)浣Y(jié)構(gòu)依疼。同時(shí)也讓網(wǎng)絡(luò)具備了自動(dòng)選擇的能力,而不是人為地設(shè)置卷積或池化而芥,或決定卷積核的尺寸律罢。 為了降低整體參數(shù)量,借鑒了Network in Network中的思想棍丐,在Inception塊中添加了1×1卷積误辑,有效降低了特征的維度,避免了參數(shù)爆炸骄酗。