本文依據(jù)Ryan Dahl的tensorflow-resnet程序源碼撰寫。
論文里面有兩個(gè)小細(xì)節(jié)需要在這里說明一下,其中一個(gè)依然有疑問,兩個(gè)細(xì)節(jié)分別是conv層的down sampling方法和網(wǎng)絡(luò)最后部分的global average pooling layer,下面分開說。
一、Conv層的 down sampling方法
ResNet網(wǎng)絡(luò)里的第3、4、5個(gè)conv層的第一個(gè)卷積層負(fù)責(zé)Down sampling,stride為2,為了方便說明,再引入ResNet的結(jié)構(gòu),如下圖:
ResNet Architecture
但每個(gè)conv層的第一層都是1×1的kernel啊,如果stride是2的話,那采集的數(shù)據(jù)信息豈不是丟失了一半?難以理解!
二、Global average pooling layer
直接貼上程序的源碼吧,這個(gè)pooling太粗暴了
x = tf.reduce_mean(x, reduction_indices=[1, 2], name="avg_pool")
x經(jīng)過Global average pooling layer前后shape對比
before: (batch_size, 7, 7, 2048)
after : (batch_size, 2048)
直接算7×7 kernel的平均值,這樣數(shù)據(jù)的細(xì)節(jié)也要丟失不少吧。。