【CNN感受野计算】python 示例含盖 vgg alexnet rtpose等

一、感受野

      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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章