O que significa convolução 1x1 em uma rede neural?

106

Atualmente, estou fazendo o Udacity Deep Learning Tutorial. Na lição 3, eles falam sobre uma convolução 1x1. Essa convolução 1x1 é usada no Google Inception Module. Estou tendo problemas para entender o que é uma convolução 1x1.

Eu também vi este post de Yann Lecun.

Alguém poderia gentilmente me explicar isso?

jkschin
fonte
Ver também um relacionado questão
gkcn
1
Aqui está um post sobre esses módulos que entraram em detalhes sobre as circunvoluções 1x1: hackathonprojects.wordpress.com/2016/09/25/...
Tommy
1
Simplificando, a idéia é reduzir o número de canais no volume 3D, acelerando o cálculo.
onerhao

Respostas:

113

(N,F,H,W)

  • N
  • F
  • H,W

F1(N,F1,H,W)

F1>FF1<F

De fato, no artigo do Google Inception, Indo mais fundo com convoluções , eles declaram (negrito é meu, não pelos autores originais):

Um grande problema com os módulos acima, pelo menos nessa forma ingênua, é que mesmo um número modesto de convoluções 5x5 pode ser proibitivamente caro no topo de uma camada convolucional com um grande número de filtros.

Isso leva à segunda idéia da arquitetura proposta: aplicar criteriosamente reduções e projeções de dimensão onde quer que os requisitos computacionais aumentem demais. Isso se baseia no sucesso das incorporações: mesmo as de baixa dimensão podem conter muitas informações sobre um patch de imagem relativamente grande ... As convoluções 1x1 são usadas para calcular as reduções antes das caras convoluções 3x3 e 5x5. Além de serem utilizados como reduções, incluem também o uso de ativação linear retificada, o que os torna de dupla finalidade.

Portanto, na arquitetura Inception, usamos os filtros convolucionais 1x1 para reduzir a dimensionalidade na dimensão do filtro. Como expliquei acima, essas camadas 1x1 conv podem ser usadas em geral para alterar a dimensionalidade do espaço do filtro (aumentar ou diminuir) e na arquitetura Inception vemos como esses filtros 1x1 podem ser eficazes na redução da dimensionalidade, explicitamente no espaço da dimensão do filtro , não o espaço da dimensão espacial.

Talvez haja outras interpretações dos filtros conv 1x1, mas eu prefiro essa explicação, especialmente no contexto da arquitetura do Google Inception.

Indie AI
fonte
3
Será que o conv 1x1 comprime a dimensão anterior do filtro para 1, antes de implementar o conv 5x5?
Leonard Loo
1
@LeonardLoo cada kernel 1x1 reduz a dimensão do filtro para 1, mas você pode ter vários kernels em uma convolução 1x1, portanto o número de "filtros" pode ser arbitrário de sua escolha.
Fazzolini 19/05
43

Uma convolução 1x1 simplesmente mapeia um pixel de entrada com todos os seus canais para um pixel de saída, sem observar nada ao seu redor. É frequentemente usado para reduzir o número de canais de profundidade, pois muitas vezes é muito lento para multiplicar volumes com profundidades extremamente grandes.

input (256 depth) -> 1x1 convolution (64 depth) -> 4x4 convolution (256 depth)

input (256 depth) -> 4x4 convolution (256 depth)

O inferior é aproximadamente ~ 3.7x mais lento.

Teoricamente, a rede neural pode 'escolher' quais cores de entrada devem ser vistas usando isso, em vez de força bruta multiplicando tudo.

Debreuil grátis
fonte
19
Eu diria que o 1x1 mapeia não apenas um pixel para um pixel de saída, mas reduz todos os canais de pixel de entrada para um pixel. No seu exemplo na primeira linha, existem 256 canais para entrada e cada um dos 64 núcleos 1x1 recolhe todos os 256 canais de entrada para apenas um "pixel" (número real). O resultado é que você tem 64 canais agora em vez de 256 com a mesma dimensão espacial, o que torna a convolução 4x4 computacionalmente mais barata do que no exemplo da segunda linha.
Fazzolini 19/05
Bom ponto, atualizará o post :) #
004 Debreuil Free
3
De onde você tirou 3,7x mais lento?
CMCDragonkai
@CMCDragonkai Suponha que o custo de computação seja proporcional ao número de pesos. No caso posterior, o num_weights = in_depth x out_depth x kernel_size = 256x256x4x4. No primeiro caso num_weights = 256x64x1x1+64x265x4x4=256x64x17,. Tome a proporção e isso dá 256/17 ~ 3.7. Verifique a página 9 deste documento para obter uma visualização de como os pesos dos números estão relacionados à profundidade de entrada e profundidade de saída. arxiv.org/pdf/1603.07285.pdf
Nelson Dinh
11

any

https://datascience.stackexchange.com/questions/9175/how-do-subsequent-convolution-layers-work

Em particular, o Tipo 2.2 é a descrição correta de uma convolução lá.

Outra resposta útil:

https://ai.stackexchange.com/questions/5769/in-a-cnn-does-each-new-filter-have-different-weights-for-each-input-channel-or

Esta resposta explica como você tem um filtro separado para cada combinação de canais de entrada / saída . Após o cálculo de cada uma delas, os resultados são somados sobre o eixo do canal de entrada, deixando o número de valores do canal de saída .

Aqui está um vídeo que achei que me ajudou a entender como funciona uma convolução 1x1.

https://www.coursera.org/lecture/convolutional-neural-networks/networks-in-networks-and-1x1-convolutions-ZTb8x

Aqui estão as principais coisas que obtive disso:

  • mnf1(m,n,f1)f1mnf2(m,n,f2)
  • f2<f1f1f2
Simon Alford
fonte
(m,n,f1)
3

Vou tentar explicar de forma mais intuitiva e resumida com ilustrações!

Um conv 1 * 1 (aka rede na rede )?

digamos que você insira é (n_H, n_W, n_c_prev). Você pode pensar em (1 * 1 * n_c_prev) como um único neurônio (uma rede totalmente conectada - por que N / w em N / w ) que está recebendo números (n_c_prev) na entrada multiplicando-os por (1 * 1 * n_c_prev ) e, em seguida, adicionando e obtendo ReLu e saída (n_H, n_W) e se você tiver vários filtros (n_c), a saída será (n_H, n_W, n_C).

Portanto, você pode usar a camada de pooling para reduzir as dimensões espaciais (n_H, n_W) e pode usar 1 * 1 conv para reduzir o n_c_prev (ou seja, o número de canais), o que economiza muitos cálculos. Por exemplo

insira a descrição da imagem aqui

Portanto, um take away

  • Você pode usar uma camada convolucional 1x1 para reduzir n_C, mas não n_H, n_W.

  • Você pode usar uma camada de pool para reduzir n_H, n_W e n_C.

Em outras palavras, insira a descrição da imagem aqui

  • o que você está fazendo usando o filtro CONV 1 * 1 é? você basicamente usa "1 * 1 * num_input_channel_of_featureMap" e convolve (elementwise * seguido de +) esse volume sobre image / featureMap do tamanho "W H num_input_channel_of_featureMap" e o que você obtém é uma saída do tamanho "W * H".

  • Agora, você pode usar o número "#filters" desse tipo "1 * 1 * num_input_channel_of_featureMap" e obter o volume "W H #filter" como saída final!

  • Mais precisamente, você está multiplicando "1 * 1" esses 32 pesos diferentes (1 * 1 Volume) por uma fatia na mesma posição no mapa de recursos de entrada seguido por ReLu e obtém um único número correspondente gerado, visto como pixel de cor verde !

  • 1 * 1 CONV ajuda a diminuir o número de canais e economizar em cálculos em algumas redes (INCEPTIONS).!

  • Mas, é claro, se você deseja manter o número de canais igual ao do mapa de recursos de entrada, tudo bem, a única coisa que o CONV 1 * 1 faz é simples aplicar a não linearidade ReLU a ele, o que permite aprender funções complexas em NN .

anu
fonte
1

Mais uma idéia sobre redução de dimensionalidade no contexto de filtros 1x1:

Tomemos, por exemplo, uma camada 4096x8x8 fc7 da FCN. O que acontece se a próxima camada (chamada fc8) for 2048x8x8 com tamanho de filtro 1? O fc7 é muito profundo na rede, cada um dos seus recursos 4096 é semanticamente rico, mas cada neurônio (por exemplo, a imagem de entrada é 250x250x3) possui um grande campo receptivo. Em outras palavras, se um neurônio é muito ativo, sabemos que em algum lugar do seu campo semântico há uma característica correspondente presente.

Tomemos, por exemplo, um neurônio superior esquerdo em fc8 com um filtro 1x1. Ele se conecta a todos os 4096 neurônios / características apenas no mesmo campo receptivo (canto superior esquerdo da imagem), cada um dos quais é ativado por uma única característica. Alguns (vamos mesmo 500) deles são muito ativos. Se o neurônio resultante também for muito ativo, significa que provavelmente aprendeu a identificar 1 ou mais características nesse campo receptivo. Depois de fazer isso 2048 vezes para os neurônios mais à esquerda no fc8, alguns deles (por exemplo, 250) serão muito ativos, o que significa que eles 'coletaram' recursos do mesmo campo receptivo através do fc7 e muitos provavelmente mais do que 1.

Se você continuar reduzindo a dimensionalidade, um número decrescente de neurônios estará aprendendo um número crescente de características do mesmo campo receptivo. E como os parâmetros espaciais 8x8 permanecem os mesmos, não alteramos a 'visão' de cada neurônio, portanto, não diminuímos a aspereza espacial.

Você pode dar uma olhada em 'Redes totalmente convolucionais' de Long, Shelhamer e Darrel.

Alex
fonte
1
Eu acho que esta é outra boa intuição do mecanismo, mas eu vou ter que voltar a ele, porque acho que a notação para as dimensões confuso, e, especialmente, "Depois de ter feito isso 2048 vezes para a esquerda-superior neurônios em fc8 ".
WillC
Não entendi muito bem o que você está tentando dizer, poderia esclarecer melhor?
Michael Heidelberg
0

A operação matemática da convolução significa calcular o produto de duas funções (contínuas ou discretas) em todas as posições de mudança possíveis.

v×v

As aplicações de processamento de imagens de redes neurais - incluindo redes neurais convolucionais - foram revisadas em: [M. Egmont-Petersen, D. de Ridder, H. Handels. Processamento de imagem com redes neurais - uma revisão , Pattern Recognition , vol. 35, n ° 10, pp. 2279-2301, 2002].

Match Maker EE
fonte