論文鏈接:https://arxiv.org/abs/1409.4842
年份:2015
會(huì)議/期刊:CVPR
GoogLeNet的參數(shù)是AlexNet的1/12孙技,但是精度上卻更高。受到Network in Network和Provable bounds for learning some deep representations的啟發(fā)萍摊,作者提出了一種稱之為Inception的網(wǎng)絡(luò)結(jié)構(gòu), 主要是提高了網(wǎng)絡(luò)內(nèi)計(jì)算資源的利用率。
目錄
1. Motivation and High Level Considerations
2. Architectural Details
3. GoogLeNet
4. Training Methodology
1. Motivation and High Level Considerations
提升深度網(wǎng)絡(luò)的表現(xiàn)最直接的方式就是增加網(wǎng)絡(luò)的size逊朽,這里的包括網(wǎng)絡(luò)深度depth(網(wǎng)絡(luò)層數(shù))和網(wǎng)絡(luò)的寬度width(每一層的神經(jīng)元數(shù))桦他。作者認(rèn)為這會(huì)帶來兩個(gè)主要問題:
- 模型的參數(shù)過多茬暇,容易過擬合资锰,尤其是在訓(xùn)練集數(shù)量有限的情況下
- 對(duì)計(jì)算資源的需求暴增敢课,比如,如果兩個(gè)卷積層相連,任何增加卷積核的行為將導(dǎo)致計(jì)算量以二次方的倍數(shù)增加直秆,如果增加的容量沒有被有效利用(例如濒募,大多數(shù)權(quán)值趨于0),就會(huì)造成計(jì)算資源的浪費(fèi)圾结。
針對(duì)這兩個(gè)問題的解決思路:使用稀疏連接結(jié)構(gòu)代替全連接結(jié)構(gòu)
- Arora的開創(chuàng)性工作:根據(jù)特征和輸出聚類之間的相關(guān)性逐層進(jìn)行學(xué)習(xí)瑰剃,得到最優(yōu)網(wǎng)絡(luò)結(jié)構(gòu)
- Hebbian原理:“neurons that fire together, wire together”
但是,現(xiàn)在的計(jì)算硬件能力在處理大量的非均勻(non-uniform)的稀疏數(shù)據(jù)結(jié)構(gòu)時(shí)筝野,是非常低效的晌姚。
這不是把兩頭堵死了嗎?所以歇竟,他們就想有沒有一種辦法挥唠,它既可以即使在filter-level也可以充分利用額外的稀疏性(extra sparsity),又能通過計(jì)算密集矩陣(dense matrices)使得現(xiàn)有的硬件發(fā)揮最大性能途蒋。
Inception架構(gòu)一開始是作為一個(gè)實(shí)現(xiàn)估計(jì)一個(gè)復(fù)雜網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)假設(shè)輸出的學(xué)習(xí)例子,它嘗試接近Arora提出的稀疏結(jié)構(gòu)并用密集且簡(jiǎn)單現(xiàn)有的組件(dense, readily available components)來覆蓋假設(shè)結(jié)果馋记。
僅僅兩輪迭代后号坡,就能看到不錯(cuò)的結(jié)果,最終建立起了Inception結(jié)構(gòu)梯醒】矶眩【PS:結(jié)果的改善是否歸因于Inception結(jié)構(gòu)的設(shè)計(jì)原則是值得深究的】
2. Architectural Details
"... is based on finding out how an optimal local sparse structure in a convolutional vision network can be approximated and covered by readily available dense components..."
再次重申,Inception的主要思想就是在卷積視覺網(wǎng)絡(luò)中如何逼近最優(yōu)局部稀疏結(jié)構(gòu)茸习,并由現(xiàn)有的密集計(jì)算工具(卷積)實(shí)現(xiàn).
- 參考Network in Network的文章畜隶,使用1x1卷積可以實(shí)現(xiàn)多個(gè)feature map的線性組合。
- 同時(shí)号胚,也希望獲得更多更大的空間上的信息籽慢,所以加入3x3和5x5的卷積核。
- Pooling層是CNN中必要的結(jié)構(gòu)猫胁,所以也加進(jìn)來箱亿。
到此,我們就有了一個(gè)naive版本的Inception模塊了弃秆。
如果直接使用naive版本的話届惋,越到后面堆積的層越多,參數(shù)越多菠赚,非常低效脑豹,所以想到使用1x1卷積進(jìn)行降維和投影。
可是衡查,先卷積后降維會(huì)破壞特征圖的稀疏性瘩欺,因?yàn)榻稻S是一個(gè)信息壓縮的過程,一種密集性的信息表達(dá)方式,難以建模击碗,所以采用了先降維后卷積的思路筑悴。
import torch
import torch.nn as nn
import torch.nn.functional as F
class BasicConv2d(nn.Module):
def __init__(self, in_channels, out_channels, **kwargs):
super(BasicConv2d, self).__init__()
self.conv = nn.Conv2d(in_channels, out_channels, bias=False, **kwargs)
def forward(self, x):
x = self.conv(x)
return F.relu(x, inplace=True)
class Inception(nn.Module):
def __init__(self, in_channels, pool_features, conv_block=None):
super(Inception, self).__init__()
if conv_block is None:
conv_block = BasicConv2d
self.branch1x1 = conv_block(in_channels, 64, kernel_size=1)
self.branch3x3_1 = conv_block(in_channels, 96, kernel_size=1)
self.branch3x3_2 = conv_block(96, 128, kernel_size=3, padding=1)
self.branch5x5_1 = conv_block(in_channels, 16, kernel_size=1)
self.branch5x5_2 = conv_block(16, 32, kernel_size=5, padding=1)
self.branch_pool = conv_block(in_channels, pool_features, kernel_size=1)
def _forward(self, x):
branch1x1 = self.branch1x1(x)
branch3x3 = self.branch3x3_1(x)
branch3x3 = self.branch3x3_2(branch3x3)
branch5x5 = self.branch5x5_1(x)
branch5x5 = self.branch5x5_2(branch5x5)
branch_pool = F.max_pool2d(x, kernel_size=3, stride=1, padding=1)
branch_pool = self.branch_pool(branch_pool)
outputs = [branch1x1, branch3x3, branch5x5, branch_pool]
return outputs
def forward(self, x):
outputs = self._forward(x)
return torch.cat(outputs, dim=1)
3. GoogLeNet
整個(gè)GoogLeNet總共22層(不含沒有參數(shù)的層)
- 圖片大小:224 x 224 x 3(3代表RGB通道)稍途,減去均值
- 所有卷積層(包括為了降維所使用的的1x1卷積層)都緊接著ReLU激活函數(shù)
- 第一層將輸入圖像的邊長減半阁吝,第二層再次將輸入邊長減半,即此層輸出為原始輸入圖像的1/4械拍,降低了計(jì)算量突勇。
- LRN層將前兩層的輸出進(jìn)行歸一化,使每個(gè)特征層更專一化坷虑,能夠獲取更廣泛的特征甲馋,具有更高的泛化度。(之后被Batch Normal層替代了)
- 9個(gè)Inception module迄损,在第二個(gè)Inception module之后定躏,第七個(gè)Inception module之后,各有兩個(gè)步長為2的最大池化層芹敌,為了降低計(jì)算量痊远、為網(wǎng)絡(luò)提速
- 使用平均池化層(avgpool)代替全連接層(FC)
- 考慮到網(wǎng)絡(luò)越深,反向傳播會(huì)變得困難氏捞,分別在Inception 4a和Inception 4d增加輔助分類輸出(auxiliary classifier)
- 增強(qiáng)底層分類器的discrimination
- 增強(qiáng)梯度信號(hào)
- 使用額外的正則化
- 訓(xùn)練時(shí)的loss權(quán)重為0.3
4. Training Methodology
- DistBelief
- 優(yōu)化方法: SGD with 0.9 momentum
- 學(xué)習(xí)率: 每8個(gè)epoch降低4%
- Polyak averaging(用在作inference階段)
- 圖像增強(qiáng)
- 圖像各種尺寸patch的采樣碧聪,這些patch的size平均分布在圖像區(qū)域的8%-100%, 寬高比3:4或4:3
- photometric distortions(設(shè)置參數(shù)contrast, brightness 和color液茎,調(diào)節(jié)光照變化逞姿,防止over-fitting)
- random interpolation methods隨機(jī)插值法