動手學深度學習 | 網路中的網路NiN | 24
NiN
NiN Network in Network,網路中的網路,這個網路現在用的不多,幾乎很少被用到,但是它裡面提出了比較重要的一些概念,在後面很多網路中都會持續的被用到。
MLP其實是不錯的,但是缺點就是引數量實在是太大了!
卷積層的引數相對於MLP會少很多,而且\(1*1\)卷積是可以達到於MLP的相同效果。
引數多會帶來很多問題:一個是會佔用很多記憶體,一個是會佔用很多的計算頻寬,還有一個最重要的事情就是MLP的引數過多,非常容易導致模型的過擬合。
為了避免上述MLP帶來的問題,NiN的思想就是完全不要全連線層,而是使用\(1*1\)的卷積來替代。
NiN塊,VGG也有VGG塊,後面基本卷積神經網都有自己的區域性架構。
NiN無全連線層,最後使用一個全域性平均池化層得到輸出。
所謂的全域性池化層,就是池化層的高寬,是等於輸入的高寬,就等價對每個通道,把最大值給拿出來。當然一般要分多少類,那麼最後的輸出通道數就為多少。
NiN是包括最後也不使用MLP,這也是一個非常極端的一個設計。
程式碼
QA
- 為什麼這裡分類最後沒有使用softmax?
不是的,都是有使用softmax的,只不過softmax是寫在train函式之中。
softmax是有一個自己的計算公式的(就可以看做是一個模型),然後分類問題使用的交叉熵損失函式。
一個最簡潔的softmax模型是包含在Linear中的 net = nn.Sequential(nn.Flatten(),nn.Linear(784,10))
所以GAP不是去替代softmax,而是去替代全連線層。
- GAP的設計是不是很關鍵?
這個設計思想給後面帶來了非常大的影響,後面大家發現這個東西,挺好用的。
GAP是沒有學習的引數的,它就是最後把輸出壓縮成(1,1)。可以理解成GAP的最大作用就是降低了模型的複雜性。使用GAP會大大提高模型的泛化性。
但是GAP的一個缺點就是會讓收斂變的很慢,反過來看,之所以AlexNet那些可以收斂的那麼快,是因為最後的那兩個MLP太厲害了,可以很好的進行資料的擬合。也就是AlexNet和VGG一般epoch=50即可,但是NiN可能epoch=120,這樣掃多幾次讓其收斂。
絕大部分時候,訓練久一點不要緊,精度好才是關鍵。
- 為什麼NiN是使用了2個\(1*1\)的卷積,而不是3個?
沐神認為是試出來...