問題拋出:卷積神經(jīng)網(wǎng)絡(luò)中,當(dāng)輸入不是固定size時,如何解決?
方案1:對輸入進(jìn)行resize,統(tǒng)一到同一大小。
方案2:取消全連接層,對最后的卷積層global average polling(GAP。
方案3:在第一個全連接層前,加入SPP layer。本文要介紹的。
p.s.以上方案還要實(shí)測,具體哪種方案比較好,強(qiáng)烈推薦方案2,3。
以VGG16網(wǎng)絡(luò)為例,如下圖

現(xiàn)有兩種規(guī)格輸入:224*224*3和180*180*3
準(zhǔn)備在全連接層前加入spp net,也就是上圖7*7*512那一層后。
224*224*3:全連接層前卷積層大小7*7*512
180*224*3:全連接層前卷積層大小5*5*517
由于這樣不同大小卷積層全連接到1*1*4096,權(quán)值W是不一樣的,所以 要統(tǒng)一全連接的輸入大小。
SPP layer方法:
用不同size,stride的pooling layer,對全連接層前的卷積層進(jìn)行pooling,然后做flatten。見下圖

輸入7*7*512時:
pooling layer1(輸出4*4*512): size = 7/4(向上取整)=2, stride = 7/4(向下取整)=1
pooling layer2(輸出2*2*512): size = 7/2(向上取整)=4,stride = 7/2(向下取整)=3?
pooling layer3(輸出1*1*512):? size = 7/1(向上取整)=7,stride = 7/1(向下取整)=7
然后做flatten,輸出(4*4+2*2+1)*512 = 21*512
輸入5*5*512時:
pooling layer1(輸出4*4*512): size = 5/4(向上取整)=2, stride = 5/4(向下取整)=1
pooling layer2(輸出2*2*512): size = 5/2(向上取整)=3,stride = 5/2(向下取整)=2
pooling layer3(輸出1*1*512):? size = 5/1(向上取整)=5,stride = 5/1(向下取整)=5
然后做flatten,輸出(4*4+2*2+1)*512=21*512
這樣全連接層輸入都是21*512,是跟網(wǎng)絡(luò)輸入圖像size大小無關(guān)的。