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的原理