一、感受野
layer 1 : kernel size:3*3 stride:1
layer2 :kernel size:3*3 stride:1
第一層的感受野就是卷積核大小 3*3 ,第二層感受野是5*5
這個也比較好理解,對於第一層計算之後的feature map而言,每一個pixel都對應了layer1的input的3*3大小的區域;
第二層的輸出也是同理,但是第二層的輸入本身攜帶了3*3的感受野,那麼在第二層這個3*3的最中心那個位置就是上一次感受野的區域結果,相當於向外擴展(上下左右)了1個pixel,因此爲5*5
如果這個時候,再來一個layer3:kernel size:5*5 stride:2
再來個layer4:kernel size:3*3 stride:1
那麼此時第三層的感受野就是5+(5-1)*1=9,第四層爲9+(3-1)*2=13
***pool層也按照卷積層同理計算就行了
二、公式
其中l_k-1是第k-1層的感受野大小,而f_k是當前層的卷積核大小,s_i是第i層的步長。
三、python代碼
alexnet=[
[[3, 96, 11, 4, 0],
[3,2,0],
[96, 256, 5, 1, 2],
[3,2,0],
[256,384, 3, 1, 1],
[384,384, 3, 1, 1],
[384,256, 3, 1, 1],
[3,2,0]]
]
vgg16=[
[[3, 64, 3, 1, 1],
[64, 64, 3, 1, 1],
[2,2,0],
[64, 128, 3, 1, 1],
[128, 128, 3, 1, 1],
[2,2,0],
[128,256, 3, 1, 1],
[256,256, 3, 1, 1],
[256,256, 3, 1, 1],
[2,2,0],
[256,512, 3, 1, 1],
[512,512, 3, 1, 1],
[512,512, 3, 1, 1],
[2,2,0],
[512,512, 3, 1, 1],
[512,512, 3, 1, 1],
[512,512, 3, 1, 1],
[2,2,0]]
]
net = [[ [3, 64, 3, 1, 1],
[64, 64, 3, 1, 1],
[2, 2, 0],
[64, 128, 3, 1, 1],
[128, 128, 3, 1, 1],
[2, 2, 0],
[128, 256, 3, 1, 1],
[256, 256, 3, 1, 1],
[256, 256, 3, 1, 1],
[256, 256, 3, 1, 1],
[2, 2, 0],
[256, 512, 3, 1, 1],
[512, 512, 3, 1, 1],
[512, 256, 3, 1, 1],
[256, 128, 3, 1, 1]]]
net.append( [[128, 128, 3, 1, 1],
[128, 128, 3, 1, 1],
[128, 128, 3, 1, 1],
[128, 512, 1, 1, 0],
[512, 38, 1, 1, 0]])
for i in range(2, 7):
net.append([
[185, 128, 7, 1, 3],
[128, 128, 7, 1, 3],
[128, 128, 7, 1, 3],
[128, 128, 7, 1, 3],
[128, 128, 7, 1, 3],
[128, 128, 1, 1, 0],
[128, 38, 1, 1, 0]
])
#!!!!!這裏的rf_k_1每次根據需要的網絡換成第一層的卷積核大小!!!!!!
stride_all_k_1=1
rf_k_1=3
flag=0
count=0
net_to_caculated=vgg16
for stage in range(len(net_to_caculated)):
#print(net[stage])
print("stage: ",stage)
for layer in net_to_caculated[stage]:
if flag==0:
if len(layer)==5:
rf=rf_k_1
stride_all_k_1=stride_all_k_1*layer[3]
else:
rf = rf_k_1
stride_all_k_1 = stride_all_k_1 * layer[1]
flag=1
else:
if len(layer) == 5:
rf=rf_k_1+(layer[2]-1)*stride_all_k_1
stride_all_k_1=stride_all_k_1*layer[3]
else:
rf = rf_k_1 + (layer[0] - 1) * stride_all_k_1
stride_all_k_1 = stride_all_k_1 * layer[1]
rf_k_1=rf
print("layer ",count," receptive field: ",rf)
print("stage ",stage," receptive field:",rf)