參考原文:https://blog.csdn.net/sinat_33487968/article/details/83582299
關(guān)于inception系列的論文筆記可以查看https://blog.csdn.net/sinat_33487968/article/details/83588372
首先因?yàn)橛泻芏嗑矸e的操作是重復(fù)的诽俯,所以定義了一個(gè)BasicConv2d的類锈玉,
這個(gè)類實(shí)現(xiàn)了最基本的卷積加上BN的操作帅腌,因?yàn)閕n_channels和out_channels是我們可以自己定義的算途,而且**kwargs的意思是能接收多個(gè)賦值泵殴,這也意味著我們我可以定義卷積的stride大小影钉,padding的大小等等渔隶。我們將會(huì)在下面的inception模塊中不斷復(fù)用這個(gè)類怠肋。
然后inception系列的網(wǎng)絡(luò)架構(gòu)最最重點(diǎn)的當(dāng)然是module的構(gòu)建,這里實(shí)現(xiàn)了inceptionA~E五種不同結(jié)構(gòu)的inception? module稍味,但是我發(fā)現(xiàn)并沒有在原論文里面完全一樣废麻,可能是實(shí)現(xiàn)的時(shí)候修改了吧。不管怎么樣模庐,module的樣子大概就是下圖這樣:
來看看這個(gè)inceptionA烛愧。這里的結(jié)構(gòu)大致是一個(gè)module里面有四個(gè)分支,__init__里面就是結(jié)構(gòu)的定義掂碱。第一個(gè)分支是branch1怜姿,只有一個(gè)1*1的卷積;第二個(gè)分支是兩個(gè)5*5的卷積疼燥;第三個(gè)分支是三個(gè)3*3的卷積沧卢;而第四個(gè)分支沒有卷積,是一個(gè)簡(jiǎn)單的pooling醉者。你可能會(huì)有疑問為什么不同的卷積核的輸出大小是一樣大但狭,因?yàn)檫@里特別的針對(duì)每個(gè)分支有不同的padding(零填充),然后每個(gè)分支stride的步數(shù)都為1撬即,最后就回輸出大小相同的卷積結(jié)果立磁。
值得我們注意的是最后outputs = [branch1x1, branch5x5, branch3x3dbl, branch_pool]這個(gè)操作就是將不同的分支都concaternation相結(jié)合在一起。
值得我們注意的是最后outputs = [branch1x1, branch5x5, branch3x3dbl, branch_pool]這個(gè)操作就是將不同的分支都concaternation相結(jié)合在一起剥槐。
同理其他的module也是大同小異唱歧,這里就不多說.
下圖是v1版本的完整結(jié)構(gòu)圖
我們來看一下特別的network in network 結(jié)構(gòu),這里的意思是有一個(gè)特殊的module它里面有兩重分支。在這里這個(gè)分支叫InceptionE颅崩。下面完整的代碼可以看到在第二個(gè)分支self.branch3x3_1后面有兩個(gè)層self.branch3x3_2a和self.branch3x3_2b几于,他們就是在第一層傳遞之后第二層分叉了,最后又在重點(diǎn)結(jié)合在一起沿后。怎么做到的呢沿彭?
此外還有一個(gè)比較特殊的結(jié)構(gòu)是輔助分類結(jié)構(gòu)得运,這就是在完整網(wǎng)絡(luò)中間某層輸出結(jié)果以一定的比例添加到最終結(jié)果分類的意思膝蜈。他跟網(wǎng)絡(luò)最后的分類是類似的,只是他是在中間分支出來的輔助結(jié)果熔掺。結(jié)構(gòu)是卷積到一層線性分類饱搏,沒有之前VGG版本Alexnet版本的全連接,參數(shù)大大減少置逻。