【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)

 

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