感受野計算

2021-08-13 05:00:54 字數 2637 閱讀 4521

這兩篇部落格各有優缺點,我結合自己的理解分析一下。

概念:

感受野(receive field)是指當前feature map中的乙個原子點p與輸入層中多少個原子個數相關的問題,假設輸入層相關的點為(rf*rf)個(假設長寬兩個方向上做同樣尺度的操作),即輸入層中rf*rf個原子值的變化會影響當前feature map中的指定原子p,而輸入層中其他原子變化並不會影響這個指定原子p。顯然區域性感受野只跟kernel size有關,與stride無關。這也是卷積層的兩個重要特性之一(區域性感受野和引數共享)。顯然rf>=1.

當然感受野也可以作為乙個相對概念,即不一定是相對於輸入層的感受野,你也可以定義任意層l1相對於另外任意層l2的相對域(只需要滿足約束條件:l2不能再l1層的後面,檔l1==l2時,rf==1).

問題:求任意層的輸出feature map上的感受野f(則感受原子點個數即為f*f).

首先我們來分析比較簡單的一種情況:

輸入層通過第1層(type = conv,kernel_size =3,stride =1),再通過第2層(type = pool,kernel_size =2,stride =2),求第2層的輸出feature map 在輸入層的感受野f.

顯然,這是很簡單的模型,第一層對於輸入層的感受野為3(只跟kernel_size有關),第二層對第一層的感受野為2(只跟kernel_size有關),那第二層對輸入層呢?動手畫一畫,就知道第2層對輸入層的感受野為4*4。我們在分析的過程中,是不是現求第二層對第一層的感受野,然後結合第一層對輸入層的感受野,算出第二層對輸入層的感受野。這就等價乙個遞迴關係。

現在來看一般情況

:假設第i層上對第j層的區域性感受野為f(i,j),顯然i>=j.假定輸入層為第0層。

則現在問題轉化為求f(i,0)的問題。由上面分析可知f(i,i)=1,現只需要求出f(i,j) 與f(i,j-1)層的關係,即可通過f(i,i)求出f(i,0).

通過簡單情況和畫圖分析,可得出遞迴關係式,f(i,j-1) = kernel_size_j + (f(i,j)-1)*stride_j,kernel_size_j表示的第j層的kernel_size,stride_j表示第j層的stride.這個式子分為兩部分,一部分是指kernel_size_j,即區域性感受野,另一部分是stride,可理解為當前層在每多乙個原子,上一層的感受野多增加stride個(在第乙個區域性感受野的基礎上增加的)(只考慮乙個方向的大小)。

則由遞迴關係和f(i,i) =1,可求出f(i,0).注意f(i,0)和f(i-1,0)並沒有任何關係

。現貼上部落格中寫的**,挺好理解的,贊博主~

[python]

view plain

copy

net_struct = ,  

'vgg16'

: ,  

'zf-5'

:}  

imsize = 224

defoutfromin(isz, net, layernum):  

totstride = 1

insize = isz  

forlayer 

inrange(layernum):  

fsize, stride, pad = net[layer]  

outsize = (insize - fsize + 2

*pad) / stride + 

1insize = outsize  

totstride = totstride * stride  

return

outsize, totstride  

definfromout(net, layernum):  

rf = 1

forlayer 

inreversed(range(layernum)):  

fsize, stride, pad = net[layer]  

rf = ((rf -1

)* stride) + fsize  

return

rf  

if__name__ == 

'__main__'

:  print

("layer output sizes given image = %dx%d"

% (imsize, imsize))  

fornet 

innet_struct.keys():  

print

('************net structrue name is %s**************'

% net)  

fori 

inrange(len(net_struct[net][

'net'

])):  

p = outfromin(imsize,net_struct[net]['net'

], i+

1)  

rf = infromout(net_struct[net]['net'

], i+

1)  

print

("layer name = %s, output size = %3d, stride = % 3d, rf size = %3d"

% (net_struct[net][

'name'

][i], p[

0], p[

1], rf))  

感受野計算

定義 感受野 receptive field 指的是神經網路中神經元 看到的 輸入區域,在卷積神經網路中,感受野的定義是卷積神經網路每一層輸出的特徵圖 feature map 上的畫素點在原始影象上對映的區域大小。計算方式 l k lk 1 f k 1 i 0k 1 si l k l f k 1 p...

感受野的計算

感受野 receptive field 指的是神經網路中神經元 看到的 輸入區域,在卷積神經網路中,feature map上某個元素的計算受輸入影象上某個區域的影響,這個區域即該元素的感受野。卷積神經網路中,越深層的神經元看到的輸入區域越大,如下圖所示,kernel size 均為3 33 3,st...

撥雲見日 卷積網路感受野的計算

寫在最前,正向感受野計算公式rn rn 1 k 1 i 1n 1si r n r k 1 quad prod quad rn rn 1 k 1 i 1 n 1 si 其中k為卷積核尺寸,s為步長。幾個部落格把這個公式抄來抄去,也沒個所以然,實在是頭疼看不懂,所以推導一下。先簡單介紹一下普通卷積和擴張...