Red de conocimiento informático - Conocimiento informático - Cómo calcular el tamaño del campo receptivo de una red neuronal convolucional

Cómo calcular el tamaño del campo receptivo de una red neuronal convolucional

Al calcular el campo receptivo, hay varios puntos que deben explicarse:

(1) El tamaño del campo receptivo del elemento de imagen característica de salida de la primera capa convolucional es igual al tamaño del filtro

(2) El tamaño del campo receptivo de una capa convolucional más profunda está relacionado con el tamaño y el tamaño de paso de los filtros de todas las capas anteriores.

(3) Al calcular el Se ignora el tamaño del campo receptivo y la influencia de los bordes de la imagen.

Aquí cada capa convolucional también tiene el concepto de zancada, que es el producto de las zancadas de todas las capas anteriores.

Es decir, zancadas(i) = zancada(1) * zancada(2) * ...*zancada(i-1)

El tamaño del campo receptivo se calcula desde arriba hasta abajo En otras palabras,

RF = 1 #El tamaño del campo receptivo en el mapa de características que se calculará

Para las capas en (de arriba a abajo):

RF = ((RF -1)* zancada) fsize

zancada representa la zancada de la convolución; fsize representa el tamaño del filtro de la capa convolucional

Implementado en Python Calcular el tamaño de los campos receptivos de cada capa de los mapas de características de salida de red Alexnet zf-5 y VGG16, código de implementación:

#! /usr/bin/env pythonnet_struct = {'alexnet': {'net':,,,,,,,], 'nombre': ['conv1', 'pool1', 'conv2', 'pool2', 'conv3 ', 'conv4', 'conv5', 'pool5']}, 'vgg16': {'net': [,,,,,,,,.,,

,,,,,, ,,], 'nombre':,,,,,], 'nombre': ['conv1', 'pool1', 'conv2', 'pool2', 'conv3', 'conv4', 'conv5']}

imsize = 224def outFromIn(isz, net, Layernum):

totstride = 1

insize = isz para la capa en el rango (layernum):

fsize, stride, pad = net[layer]

outsize = (insize - fsize 2*pad) / stride 1

insize = outsize

totstride = totstride * stride return outsize, totstridedef inFromOut(net, Layernum):

RF = 1 para capa en reversa(range(layernum)):

fsize, stride, pad = net[layer].stride, pad = net[layer]

RF = ((RF -1)* stride) fsize return RFif __name__ == '__main__': print "tamaños de salida de capa dados image = dxd " (imsize, imsize)

para net en net_struct.keys(): print '************el nombre de la estructura net es s********* *** *****' neto para i en rango(len(net_struct[net]['net'])):

p = outFromIn(imsize, net_struct[net]['net' ], i 1)

rf = inFromOut(net_struct[net]['net'], i 1) print "L

ayer Nombre = s, Tamaño de salida = 3d, Zancada = 3d, Tamaño de RF = 3d" (net_struct[net]['name'][i], p[0], p[1], rf)