CNN學習:如何計算模型的感受野?

CNN學習:如何計算模型的感受野?

閱讀論文時常常看見論文中說感受野的大小,對於有些問題,需要了解更多的上下文信息,則需要相對大的感受野。那麼,這裏的感受野是什麼意思呢?

感受野可以理解爲卷積神經網絡輸出的feature map中一個像素點對應的原圖片中區域的大小,或者說feature map中的一個像素點的值是受原圖片中的多大的區域影響的,也可以間接地模型融合上下文信息的多少。

那麼,感受野如何計算呢?

  • 每一層計算從上往下,top-down,即從最後一層開始計算。
  • 這裏的ksize是卷積核大小,stride是每一層的stride, RF是感受野大小

函數:

def receptiveField(net, n_layers):
 for layer in range(n_layers):
 RF = 1
 ksize, stride, pad = net[layer]
 RF = ((RF-1)*stride) + ksize
 return RF

示例:

  • 以下面的這個網絡爲例,計算網絡的感受野
net_D_B(
 (netD_B): DataParallel(
 (module): NLayerDiscriminator(
 (model): Sequential(
 (0): Conv2d(3, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
 (1): LeakyReLU(0.2, inplace)
 (2): Conv2d(64, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
 (3): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False)
 (4): LeakyReLU(0.2, inplace)
 (5): Conv2d(128, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
 (6): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False)
 (7): LeakyReLU(0.2, inplace)
 (8): Conv2d(256, 512, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
 (9): InstanceNorm2d(512, eps=1e-05, momentum=0.1, affine=False)
 (10): LeakyReLU(0.2, inplace)
 (11): Conv2d(512, 1, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1)) # 30
 ))))
  • 計算:
    • 初始化:RF = 1
    • 第五層:RF5 = ( 1-1 ) * 1 + 4 = 4
    • 第四層:RF4 = ( 7-1 ) * 1 + 4 = 7
    • 第三層:RF3 = (7-1 ) * 2 + 4 = 16
    • 第二層:RF4 = (16-1) * 2 + 4 = 34
    • 第一層:RF4 = (34-1) * 2 + 4 = 70
  • 上面的層數,表示計算到哪一層,而不是第幾層的感受野,若計算中間某一層的感受野,則將那一層從1開始計算
  • 計算得到該網絡在圖片上感受野爲70*70,這也是pix2pix中patchGAN的原理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章