一、感受野
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)