東至縣住房和城鄉(xiāng)建設(shè)網(wǎng)站推廣關(guān)鍵詞
文章目錄
- 卷積核分解
- 第一步分解,對(duì)稱分解
- 第二步分解,非對(duì)稱分解
- 在Inception中的改造
- 一般模型的參數(shù)節(jié)省量
- 可能導(dǎo)致的問題
- 針對(duì)兩個(gè)輔助分類起的改造
- 特征圖尺寸縮減
- Model Regularization via Label Smoothing——LSR
- 問題描述,也就是LSR解決什么問題
- 解決辦法
- 網(wǎng)絡(luò)結(jié)構(gòu)
- Inception V2 & Inception V3
前一篇的Batch Normalization只是Inception V2,V3的一個(gè)前菜。真正提出Inception V2,V3的概念的是在論文Rethinking the Inception Architecture for Computer Vision中,這篇論文中綜合了Batch Normalization的概念,然后提出了自己的一些改進(jìn)。通過不同的組合,形成了Inception V2,V3的概念。
我們這一篇就記錄了一下這篇論文提出了改進(jìn),然后記錄一下什么是V2,V3與V2相比又改了點(diǎn)什么東西。
這篇論文主要的論點(diǎn)是圍繞著降低計(jì)算開銷和內(nèi)存開銷來展開的,因?yàn)槭且獮橐苿?dòng)設(shè)備做準(zhǔn)備。
卷積核分解
第一步分解,對(duì)稱分解
對(duì)稱分解是相對(duì)于下一步的非對(duì)稱分解而言的,就是將一個(gè)n * n的卷積核分解成若干個(gè)m * m的卷積核, m < n。
論文中的標(biāo)題是Factorizing Convolutions with Large Filter Size。或者簡(jiǎn)單的說就是把一個(gè)大的卷積核分解成幾個(gè)小的卷積核。
這樣做的好處是總體參數(shù)減少了,自然訓(xùn)練和推理的開銷都會(huì)減少。
文中舉的例子是一個(gè)5 * 5的卷積核可以分解成兩個(gè)3 * 3的卷積核。
如圖:
那么,參數(shù)的個(gè)數(shù)就從 5 * 5 = 25 縮減到 2 * 3 * 3 = 18。
第二步分解,非對(duì)稱分解
上一步的小卷積核都是正方形的,這次使用的邏輯是將一個(gè)n * n的卷積核分解成一個(gè)1 * n的卷積核和一個(gè) n * 1的卷積核。
如圖:
在Inception中的改造
原始的Inception結(jié)構(gòu):
經(jīng)過第一步改造為:
再經(jīng)過第二步改造為:
如果是上面的3的話,這里的n就等于3。當(dāng)然在整個(gè)GoogleLeNet中,這個(gè)n不一定是等于3。
一般模型的參數(shù)節(jié)省量
所以在文章中,對(duì)一般的網(wǎng)絡(luò)做這個(gè)改造的參數(shù)節(jié)省量做了一個(gè)評(píng)估。
一般在CNN網(wǎng)絡(luò)中,featrue map都是越來越是高層特征,所以尺寸是縮小的,在論文中提出了公式:
n = α m n=\alpha m n=αm
- n應(yīng)該是前一層的輸出尺寸(相對(duì)于卷積層,或者一個(gè)Inception單位)
- m為后一層的輸入尺寸(同上)
所以一個(gè)改造前的卷積層的參數(shù)數(shù)量為:
m ? w ? w ? n = w 2 ? m ? α m = α w 2 m 2 m * w * w * n = w^2 * m * \alpha m = \alpha w^2 m^2 m?w?w?n=w2?m?αm=αw2m2,w為卷積核的尺寸。
如果把這個(gè) w ? w w * w w?w的拆成了兩個(gè)卷積核,那么前一層的輸出和后一層的輸入的尺寸相同,在數(shù)學(xué)上這個(gè)原來的端到端參數(shù) α \alpha α在每一層中可以計(jì)算為 α \sqrt{\alpha} α?
所以計(jì)算的公式就變成為:
w ? w ? α m ? α + w ? w ? α ? m w * w * \alpha m * \sqrt{\alpha} + w * w * \sqrt{\alpha} * m w?w?αm?α?+w?w?α??m
簡(jiǎn)化后:
w 2 α ( α + 1 ) m 2 w^2\sqrt{\alpha}(\alpha+1)m^2 w2α?(α+1)m2
如果尺寸不變,也就是 α = 1 \alpha = 1 α=1的時(shí)候,前一層是5,后一層是3的情況下,節(jié)省的參數(shù)量就是28%。
可能導(dǎo)致的問題
- 是否會(huì)減少模型的表達(dá)能力(Does this replacement result in any loss of expressiveness)
- 還有個(gè)問題就是第一層卷積后面,比如第一個(gè)3 * 3后面跟什么激活函數(shù),是線性的Sigmond還是非線性的ReLU(If our main goal is to factorize the linear part of the computation, would it not suggest to keep linear activations in the first layer?)
論文中做了一些實(shí)驗(yàn),得到的結(jié)果為:
結(jié)果是使用ReLU要好一些,而且可以配合Batch Normalization一起使用。
針對(duì)兩個(gè)輔助分類起的改造
論文中提到,雖然說在v1中設(shè)計(jì)了兩個(gè)輔助分類器,兩個(gè)輔助分類起位于網(wǎng)絡(luò)的較前的層,在訓(xùn)練過程中可以更有效的利用梯度(前一篇提到了https://blog.csdn.net/pcgamer/article/details/131914842?spm=1001.2014.3001.5502)。
但是這篇文章是認(rèn)為,這兩個(gè)分類起沒毛用。具體是為啥沒說,估計(jì)是用數(shù)據(jù)做了驗(yàn)證吧,原話是:
Interestingly, we found that
auxiliary classifiers did not result in improved convergence early in the training: the training progression of network with and without side head looks virtually identical before both models reach high accuracy。Near the end of training, the network with the auxiliary branches starts to overtake the accuracy of the network without any auxiliary branch and reaches a slightly higher plateau.
Also used two side-heads at different stages in the
network. The removal of the lower auxiliary branch did not have any adverse effect on the final quality of the network。
這篇論文中提到,在訓(xùn)練過程的前期,這兩個(gè)分類器沒有起到什么作用,只是在快結(jié)束的時(shí)候可以提升一點(diǎn)準(zhǔn)確率
另外提到的是,如果在這兩個(gè)分類器前面增加一個(gè) batch-normalization層或者dropout層更有用。
在后面提到的v2網(wǎng)絡(luò)中的BN網(wǎng)絡(luò)就是增加了這個(gè)Batch Normalization層。
特征圖尺寸縮減
論文中的標(biāo)題是Efficient Grid Size Reduction。這塊簡(jiǎn)單解釋下,論文中在這一小節(jié)中的描述是:Traditionally, convolutional networks used some pooling operation to decrease the grid size of the feature maps. In order to avoid a representational bottleneck, before applying maximum or average pooling the activation dimension of the network filters is expanded。
這一小段描述的是,在一般的CNN網(wǎng)絡(luò)中,為了不損失特征,保持網(wǎng)絡(luò)的表達(dá)能力,但是又要不斷通過更小尺寸的卷積核一步一步提取高維特征,一般在卷積完之后,filter的寬度會(huì)變寬。觀察一般的CNN網(wǎng)絡(luò),從input層開始,卷積一層之后,featrue map尺寸變小,但是channels變多,我的理解是高維特征尺寸小,但是為了不損失,需要多提取一些高維特征,也就是較多的通道數(shù)(channels)
一般的網(wǎng)絡(luò)中,下一層featrue map的尺寸是上一層的一半(寬高都是),然后通道數(shù)翻倍。也就是文中的: starting a
d × d d×d d×d grid with k filters, if we would like to arrive at a d 2 × d 2 d2 × d2 d2×d2 grid with 2k filters, we first need to compute a stride-1 convolution with 2k filters and then apply an additional pooling step。
那么操作次數(shù)是 2 d 2 k 2 2d^2k^2 2d2k2。
一般來說,是在卷積之后跟一個(gè)pooling層。那么最簡(jiǎn)單的簡(jiǎn)化方法就是把這兩個(gè)層換一下,因?yàn)閜ooling之后,grid或者說featrue map的尺寸就只有原來的四分之一了。
那么操作數(shù)就變成了 2 ( d 2 ) 2 k 2 2 (\fracvxwlu0yf4{2})^2k^2 2(2d?)2k2了。
(尺度的寬高減半,層數(shù)翻倍)
但是這有一個(gè)重要的問題是,池化層會(huì)有很多的損失,造成網(wǎng)絡(luò)的表達(dá)能力下降,文中稱作representational bottlenecks。
所以文中提出了另外一種結(jié)構(gòu):
文中的描述為:We can use two parallel stride 2
blocks: P and C. P is a pooling layer (either average or maximum pooling) the activation, both of them are stride 2 the filter banks。
簡(jiǎn)單來說,就是把卷積操作中的stride = 1變成了 stride = 2。這樣會(huì)減少不少的計(jì)算量,步長(zhǎng)大了嘛。
Model Regularization via Label Smoothing——LSR
問題描述,也就是LSR解決什么問題
這個(gè)改進(jìn)就是基于交叉熵的損失函數(shù)上做的一個(gè)改造:
基于交叉熵的損失函數(shù)是(之前的文章描述過
https://blog.csdn.net/pcgamer/article/details/131713549?spm=1001.2014.3001.5501):
不過之前的文章中的p和q與論文中的恰好是反過來的,這里以論文為準(zhǔn)。
H ( p , q ) = ? ∑ k = 1 K l o g ( p ( x ) ) q ( x ) H(p,q) = -\sum_{k=1}^K{log(p(x))q(x)} H(p,q)=?k=1∑K?log(p(x))q(x)
然后在論文里,把 q ( x ) q(x) q(x)這個(gè)標(biāo)簽的數(shù)據(jù)分布描述成一個(gè)狄拉克分布,也就是一個(gè)激活函數(shù),因?yàn)樵贙個(gè)列表中只有一個(gè)1,記做 δ k , y \delta{k,y} δk,y,后續(xù) q ( x ) q(x) q(x)就用 δ k , y \delta_{k,y} δk,y?代替。
這里存在一個(gè)問題是,在計(jì)算交叉熵和反向傳播的時(shí)候,網(wǎng)絡(luò)根據(jù)損失函數(shù),會(huì)去擬合label的分布 q ( x ) q(x) q(x)。
比如一個(gè)三分類,標(biāo)簽數(shù)據(jù)是(0, 1, 0),而預(yù)測(cè)出來的結(jié)果是(0.4, 0.5, 0.1)。
那么此時(shí)的損失函數(shù)計(jì)算為:
l = ? ( 0 ? l o g ( 0.4 ) + 1 ? l o g ( 0.5 ) + 0 ? l o g ( 0.1 ) ) ≈ 0.3 l=-(0 * log(0.4) + 1 * log(0.5) + 0 * log(0.1)) \approx 0.3 l=?(0?log(0.4)+1?log(0.5)+0?log(0.1))≈0.3
而如果預(yù)測(cè)結(jié)果是(0.1, 0.8, 0.1)的話,損失值為:
l = ? ( 0 ? l o g ( 0.1 ) + 1 ? l o g ( 0.8 ) + 0 ? l o g ( 0.1 ) ) ≈ 0.1 l=-(0 * log(0.1) + 1 * log(0.8) + 0 * log(0.1)) \approx 0.1 l=?(0?log(0.1)+1?log(0.8)+0?log(0.1))≈0.1
也就是越接近,損失越小(好像是廢話,網(wǎng)絡(luò)不就是要干這個(gè)么)。其實(shí)就是要提出一個(gè)過擬合的方法,論文中的描述是:
the model becomes too confident about its predictions。模型對(duì)預(yù)測(cè)過于自信。。。。
解決辦法
論文中提出的解決辦法就是增加一個(gè)超參數(shù) ? \epsilon ?,然后再引入另外一個(gè)隨機(jī)變量分布 u u u,這個(gè) ? \epsilon ?就用于分配兩個(gè)分布的權(quán)重。
也就是把上面計(jì)算損失函數(shù)的 q ( x ) q(x) q(x)用 q ′ ( x ) q^{'}(x) q′(x)來代替:
q ′ ( x ) = ( 1 ? ? ) δ k , y + ? u ( k ) q^{'}(x)=(1-\epsilon)\delta_{k,y} + \epsilon u(k) q′(x)=(1??)δk,y?+?u(k)
讓label的分布從一個(gè)純粹的 δ k , y \delta_{k,y} δk,y?分布變一點(diǎn)點(diǎn),這個(gè)引入的分布通常是一個(gè)平均分布,也就是 u ( k ) = 1 K u(k) = \frac{1}{K} u(k)=K1?。上式就變成:
q ′ ( x ) = ( 1 ? ? ) δ k , y + ? K q^{'}(x)=(1-\epsilon)\delta_{k,y} + \frac{\epsilon}{K} q′(x)=(1??)δk,y?+K??
然后損失函數(shù)就變成:
H ( q ′ , p ) = ? ∑ k = 1 K l o g p ( k ) q ′ ( k ) = ( 1 ? ? ) H ( q , p ) + ? H ( u , p ) H(q^{'}, p)=-\sum_{k=1}^Klogp(k)q^{'}(k)=(1-\epsilon )H(q, p) + \epsilon H(u,p) H(q′,p)=?k=1∑K?logp(k)q′(k)=(1??)H(q,p)+?H(u,p)
論文中的 K K K和 ? \epsilon ?取值為:In our ImageNet experiments with K = 1000 classes,
we used u(k) = 1/1000 and ? \epsilon ? = 0.1.
這個(gè)方法為準(zhǔn)確度貢獻(xiàn)了 0.2 0.2% 0.2。
另外,論文中提到的這個(gè)動(dòng)作是logit這個(gè)位置,這個(gè)位置位于softmax激活層之前。
logit的概念(借用一下):
網(wǎng)絡(luò)結(jié)構(gòu)
V2的組成如下表:
- V1中的最初的7 * 7的卷積層變成了3個(gè) 3 * 3的卷積層。
- 三個(gè)Inception部分
- 第一個(gè)部分采用的是圖1-對(duì)稱分解的方式組成的Inception模塊,連續(xù)3個(gè)Inception模塊。
- 第二部分采用的是圖2-不對(duì)稱分解組成的Inception模塊,連續(xù)5個(gè)。在論文中關(guān)于這塊描述是:In practice, we have found that employing this factorization does not work well on early layers, but it gives very good results on medium grid-sizes (On m×m feature maps, where m ranges between 12 and 20). On that level, very good results can be achieved by using 1 × 7 convolutions followed by 7 × 1 convolutions。
- 第三部分采用了一種新的方式:如圖。
總共2個(gè)模塊。
論文中對(duì)這種連接方式的描述是:This architecture is used on the coarsest (8 × 8) grids to promote high dimensional representations。We are using this solution only on the coarsest grid, since that is the place where producing high dimensional sparserepresentation is the most critical as the ratio of local processing
(by 1 × 1 convolutions) is increased compared to the spatial aggregation.。
講的是這種構(gòu)造只用于高層特征的featrue map中。也就是卷積了很多次的特征圖中。在V2結(jié)構(gòu)中,直接是用在網(wǎng)絡(luò)的最后部分。
和圖二相比,相當(dāng)于就是把1 * n和n * 1的這兩個(gè)動(dòng)作由串行變成了并行,然后把并行卷積出來的featrue map進(jìn)行連接,通道數(shù)相當(dāng)于就翻倍了。應(yīng)該是要利用不同尺寸的卷積進(jìn)行不同尺寸特征的提取。
1 * 3和3 * 1卷積出來的尺寸不一樣的問題,就通過在上一層的featrue map上做padding來補(bǔ)充(用的是0-padding的方法),來保證卷積出來的尺寸維持在8 * 8。
padding只針對(duì)寬的那個(gè)邊進(jìn)行,短的那邊不需要填充。體現(xiàn)到代碼上就是:
nn.Conv2d(8, 8, kernel_size=(1,3), padding=(0, 1))nn.Conv2d(8, 8, kernel_size=(3,1), padding=(1, 0))
另外,論文中提到了輸入大小的問題,做了 299 * 299(stride=2+m-pooling) / 151 * 151(stride=1+m-pooling) / 79 * 79(stride=1)的比較,認(rèn)為對(duì)于低分辨率的圖像,還是使用相對(duì)較大的感受野(就是這個(gè)輸入我理解就是要去裁剪或者縮放原圖。),效果要更好,同樣的邏輯也可以用到R-CNN的目標(biāo)檢測(cè)模型中。
Inception V2 & Inception V3
論文在Experiment章節(jié)中,把上述提出的改進(jìn)點(diǎn),一個(gè)一個(gè)加進(jìn)去來測(cè)試結(jié)果,結(jié)論如圖:
也就是說Inception v2是在v1的基礎(chǔ)上(激活層前)上加了BN層。然后再慢慢加上LSR,加上7 * 7的分解,輔助分類器加上BN等操作。
最后一行就是Inception v3版本。
最后的V3版本效果最好。