Como a CNN '12 de Krizhevsky 'obtém 253.440 neurônios na primeira camada?

24

Em Alex Krizhevsky, et al. Na classificação Imagenet com redes neurais convolucionais profundas, eles enumeram o número de neurônios em cada camada (veja o diagrama abaixo).

A entrada da rede é 150.528-dimensional, e o número de neurônios nas camadas restantes da rede é dado por 253.440-186.624-64.896-64.896–43.264– 4096–4096-1000.

CNN

Uma visualização em 3D

O número de neurônios para todas as camadas após a primeira é claro. Uma maneira simples de calcular os neurônios é simplesmente multiplicar as três dimensões dessa camada ( planes X width X height):

  • Camada 2: 27x27x128 * 2 = 186,624
  • Camada 3: 13x13x192 * 2 = 64,896
  • etc.

No entanto, olhando para a primeira camada:

  • Camada 1: 55x55x48 * 2 = 290400

Observe que isso não é o 253,440especificado no documento!

Calcular tamanho da saída

A outra maneira de calcular o tensor de saída de uma convolução é:

Se a imagem de entrada for um tensor 3D nInputPlane x height x width, o tamanho da imagem de saída será nOutputPlane x owidth x oheightonde

owidth = (width - kW) / dW + 1

oheight = (height - kH) / dH + 1 .

(da documentação da Torch SpatialConvolution )

A imagem de entrada é:

  • nInputPlane = 3
  • height = 224
  • width = 224

E a camada de convolução é:

  • nOutputPlane = 96
  • kW = 11
  • kH = 11
  • dW = 4
  • dW = 4

(por exemplo 11, tamanho do kernel , passo 4)

Conectando esses números, obtemos:

owidth = (224 - 11) / 4 + 1 = 54 oheight = (224 - 11) / 4 + 1 = 54

Portanto, estamos um pouco abaixo das 55x55dimensões necessárias para corresponder ao papel. Eles podem estar preenchendo (mas o cuda-convnet2modelo define explicitamente o preenchimento como 0)

Se tomarmos as 54dimensões de tamanho, obteremos 96x54x54 = 279,936neurônios - ainda serão muitos.

Então, minha pergunta é esta:

Como eles conseguem 253.440 neurônios para a primeira camada convolucional? o que estou perdendo?

R. Girard
fonte
Você já resolveu isso? Apenas para ser pedante nos seus cálculos: largura e altura seriam realmente 54,25. Tentei descobrir isso e, como primeiro passo, dividimos os supostos 253440 neurônios entre 96 filtros, o que produz 2640 neurônios por filtro. Este não é um número quadrado. Então, ou nós dois temos um mal-entendido aqui, ou pode haver um erro dos autores ... Você os contatou?
213 Anderas
Mesmo comigo, isso é muito confuso. aliás, é verdade que a entrada é 224x224x3? Eu acho que deve ser 227x227x3. vamos ver se temos 227x227, 5 células na primeira esquerda e 5 células na última direita não podem ser o centro da convolução do kernel com tamanho 11x11. Portanto, o primeiro centro do núcleo é célula (6,6) e o último centro do núcleo na primeira linha é célula (6x222). Com o passo 4, obteremos o centro do kernel na sexta linha: célula na coluna: 6,10,14, ..., 222 e a formulação simples para o centro do kernel-k está na coluna = 6+ (k -1) * 4 de modo que coluna 222 é k-th centro a = (222-6) / 4 = 1 55.
4
Observe que 48 * 48 * 55 * 2 = 253440, portanto, é possível que eles tenham cometido um erro de digitação ao calcular o número de neurônios na primeira camada (multiplicado por 48 em vez de 55).
tsiki
@ Firebug Este é um uso interessante da tag [reference]. Pensei em usá-lo apenas para perguntas que pedem referências. Mas talvez eu estivesse errado. Você usa diferente?
Ameba diz Reinstate Monica

Respostas:

8

Da nota de Stanfords na NN:

Exemplo do mundo real. O Krizhevsky et al. a arquitetura que venceu o desafio ImageNet em 2012 aceitou imagens de tamanho [227x227x3]. Na primeira camada convolucional, foram utilizados neurônios com tamanho de campo receptivo F = 11, passo S = 4 e sem preenchimento zero P = 0. Como (227 - 11) / 4 + 1 = 55, e como a camada Conv tinha uma profundidade de K = 96, o volume de saída da camada Conv tinha tamanho [55x55x96]. Cada um dos 55 * 55 * 96 neurônios deste volume foi conectado a uma região de tamanho [11x11x3] no volume de entrada. Além disso, todos os 96 neurônios em cada coluna de profundidade estão conectados à mesma região [11x11x3] da entrada, mas é claro com pesos diferentes. Como um divertimento à parte, se você ler o jornal real, ele afirma que as imagens de entrada eram 224x224, o que certamente está incorreto porque (224 - 11) / 4 + 1 claramente não é um número inteiro. Isso confundiu muitas pessoas na história do ConvNets e pouco se sabe sobre o que aconteceu. Meu melhor palpite é que Alex usou o preenchimento zero de 3 pixels extras que ele não menciona no artigo.

ref: http://cs231n.github.io/convolutional-networks/

Essas notas acompanham a classe CS231n da Stanford CS: Redes neurais convolucionais para reconhecimento visual. Para perguntas / preocupações / relatórios de bugs sobre o contato com Justin Johnson sobre as tarefas ou entre em contato com Andrej Karpathy sobre as notas do curso

Bacon
fonte
É possível dar crédito nomeando o autor dessas notas?
Silverfish
Os autores são claramente auto-referenciados nas notas, consulte cs231n.github.io
Bacon
2
Embora eles sejam claramente referenciados se você seguir o link, a cotação também aparece aqui, portanto, também deve haver crédito aqui. Isso é parcialmente cortesia, mas também porque o link pode parar de funcionar (por exemplo, se o material for removido / pago / movido para um novo endereço). Infelizmente, temos um problema grave com o "apodrecimento do link" neste site - enquanto pretendemos servir como repositório de longo prazo de respostas de alta qualidade para perguntas estatísticas, muitas de nossas respostas mais antigas foram tornadas obsoletas por links que não funcionam mais . Portanto, geralmente é mais seguro tentar fazer as respostas o mais independentes possível.
Silverfish
0

Este artigo é realmente confuso. Primeiro, o tamanho de entrada das imagens está incorreto em 224x224 e não produz uma saída de 55. Esses neurônios são simplesmente como pixels agrupados em um, então a saída é uma imagem 2D de valores aleatórios (valores dos neurônios). Então, basicamente, o número de neurônios = largura x altura x profundidade, não há segredos para descobrir isso.

Moe
fonte