Escolhendo o tamanho do filtro, avanços etc. em uma CNN?

12

Estive assistindo as palestras CS231N de Stanford e estou tentando entender alguns problemas nas arquiteturas da CNN. O que estou tentando entender é se existem algumas diretrizes gerais para escolher o tamanho do filtro de convolução e coisas como avanços ou isso é mais uma arte do que uma ciência?

Entendo que o pool existe principalmente para induzir alguma forma de invariância da tradução em um modelo. Por outro lado, não tenho uma boa intuição de como o tamanho da passada é escolhido. Existem outras diretrizes para isso, exceto tentar comprimir o tamanho da camada atual ou tentar obter um campo receptivo maior para um neurônio? Alguém conhece algum artigo bom ou similar que discuta isso?

DST
fonte

Respostas:

9

Como um texto introdutório para todas as questões mencionadas, eu recomendaria o livro de aprendizado profundo . Ele fornece uma ampla visão geral do campo. Explica o papel que cada um desses parâmetros desempenha.

Na minha opinião, é muito útil ler sobre algumas das arquiteturas mais populares (resnet, iniciação, alex-net) e extrair as idéias principais que levam às decisões de design. Depois de ler o livro acima mencionado.

No currículo das palestras a que você se refere, é explicado em grande detalhe como a camada de convolução adiciona um grande número de parâmetros (pesos, vieses) e neurônios. Essa camada, uma vez treinada, é capaz de extrair padrões de significado da imagem. Para camadas inferiores, esses filtros se parecem com extratores de bordas. Para camadas mais altas, essas formas primitivas são combinadas para descrever formas mais complexas. Esses filtros envolvem um alto número de parâmetros e um grande problema no design de redes profundas para descrever formas complexas e ainda reduzir o número de parâmetros.

Como os pixels vizinhos estão fortemente correlacionados (especialmente nas camadas mais baixas), faz sentido reduzir o tamanho da saída subamostrando (agrupando) a resposta do filtro. Quanto mais afastados dois pixels estiverem um do outro, menos correlacionados. Portanto, um grande avanço na camada de pool leva a uma grande perda de informações. Falando livremente. Uma passada de 2 e um tamanho de kernel 2x2 para a camada de pool é uma escolha comum.

Uma abordagem mais sofisticada é a rede de Iniciação ( Aprofundando com as convoluções ), onde a idéia é aumentar a esparsidade, mas ainda conseguir uma maior precisão, trocando o número de parâmetros em uma camada convolucional versus um módulo de iniciação para redes mais profundas.

Um bom artigo que fornece dicas sobre arquiteturas atuais e o papel de algumas das dimensões do projeto de maneira estruturada e sistemática é o SqueezeNet: precisão no nível AlexNet com 50x menos parâmetros e tamanho do modelo <0,5MB . Ele se baseia nas idéias introduzidas nos modelos mencionados anteriormente.

jpmuc
fonte
1

Se você considerar um aprendizado melhor ao longo do tempo, quero sugerir esses tamanhos de kernel e stride;

Em relação ao tamanho do filtro, acho que depende das características da sua imagem. Por exemplo, é necessária uma grande quantidade de pixels para que a rede reconheça o objeto; você pode usar filtros maiores; por outro lado, se os objetos forem um pouco pequenos ou recursos locais, considere aplicar filtros menores em relação ao tamanho da imagem de entrada.

Para o tamanho da passada, para mim, a passada menor seria melhor para capturar os detalhes mais refinados da imagem de entrada.

Para mim, o benefício do pool é que ele extrai os recursos mais nítidos de uma imagem. Em geral, os recursos mais nítidos se parecem com a melhor representação de nível inferior de uma imagem.

Cloud Cho
fonte