Eu estava pesquisando alguma literatura relacionada a redes totalmente convolucionais e encontrei a seguinte frase ,

Uma rede totalmente convolucional é alcançada substituindo as camadas totalmente conectadas ricas em parâmetros em arquiteturas CNN padrão por camadas convolucionais com $ 1 \ times 1 $ kernels.

Tenho duas perguntas.

  1. O que significa rico em parâmetros ? É chamado de rico em parâmetros porque as camadas totalmente conectadas passam parâmetros sem qualquer tipo de redução “espacial”?

  2. Além disso, como os kernels $ 1 \ times 1 $ funcionam? O kernel “t $ 1 \ times 1 $ não significa simplesmente que alguém está deslizando um único pixel sobre a imagem? Estou confuso sobre isso.

Resposta

Redes de convolução total

A rede de convolução total (FCN) é uma rede neural que realiza apenas operações de convolução (e subamostragem ou upsampling). Equivalentemente, um FCN é um CNN sem camadas totalmente conectadas.

Redes neurais de convolução

A rede neural de convolução (CNN) típica não é totalmente convolucional porque frequentemente contém camadas totalmente conectadas também (que não realizam a operação de convolução), que são ricas em parâmetros , no sentido de que têm muitos parâmetros (em comparação com sua convolução equivalente camadas), embora as camadas totalmente conectadas também possam ser vistas como convoluções com ker nels que cobrem todas as regiões de entrada , que é a ideia principal por trás da conversão de um CNN em um FCN. Veja este vídeo de Andrew Ng que explica como converter uma camada totalmente conectada em uma camada convolucional.

Um exemplo de um FCN

Um exemplo de uma rede totalmente convolucional é a U-net (chamado desta forma por causa de sua forma de U, que você pode ver na ilustração abaixo), que é uma rede famosa usada para semântica segmentação , ou seja, classificar os pixels de uma imagem para que os pixels que pertencem à mesma classe (por exemplo, uma pessoa) sejam associados ao mesmo rótulo (ou seja, pessoa), também conhecido como pixel-wise ( ou densa) classificação.

insira a descrição da imagem aqui

Segmentação semântica

Portanto, na segmentação semântica, você deseja associar um rótulo a cada pixel (ou pequeno pedaço de pixels) da imagem de entrada. Aqui está uma ilustração mais sugestiva de uma rede neural que realiza segmentação semântica.

insira a descrição da imagem aqui

Segmentação de instância

Também existe segmentação de instância , onde você também deseja diferenciar diferentes instâncias da mesma classe (por exemplo, você deseja distinguir duas pessoas na mesma imagem rotulando-as de maneiras diferentes). Um exemplo de rede neural usada para segmentação de instância é máscara R-CNN . A postagem do blog Segmentação: U-Net, Mask R-CNN e Aplicativos Médicos (2020) por Rachel Draelos descreve esses dois problemas e redes muito bem.

Aqui está um exemplo de uma imagem onde instâncias da mesma classe (ou seja, pessoa) foram rotuladas de forma diferente (laranja e azul).

insira a descrição da imagem aqui

Ambas as segmentações semânticas e de instância são tarefas de classificação densas (especificamente, elas caem na categoria de segmentação de imagem ), ou seja, você deseja classificar cada pixel ou muitos pequenos fragmentos de pixels de uma imagem.

$ 1 \ times 1 $ convoluções

No diagrama U-net acima, você pode ver que há apenas convoluções, copiar e cortar, máx- operações de pooling e upsampling. Não há camadas totalmente conectadas.

Então, como associamos um rótulo a cada pixel (ou um pequeno trecho de p ixels) da entrada? Como realizamos a classificação de cada pixel (ou patch) sem uma camada final totalmente conectada?

É aí que o $ 1 \ times 1 $ as operações de convolução e upsampling são úteis!

No caso do diagrama U-net acima (especificamente, a parte superior direita do diagrama, que é ilustrada abaixo para maior clareza), dois $ 1 \ times 1 \ times 64 $ kernels são aplicados ao volume de entrada (não às imagens!) para produzir dois mapas de recursos de tamanho $ 388 \ times 388 $ . Eles usaram dois núcleos $ 1 \ times 1 $ porque havia duas classes em seus experimentos (célula e não célula). A postagem do blog mencionada também fornece a intuição por trás disso, então você deve lê-la.

insira a descrição da imagem aqui

Se você tentou analisar o diagrama U-net cuidadosamente, notará que os mapas de saída têm dimensões espaciais (altura e peso) diferentes das imagens de entrada, que têm dimensões $ 572 \ vezes 572 \ vezes 1 $ .

Isso “s bem porque nosso objetivo geral é realizar uma classificação densa (ou seja, classificar patches da imagem, onde os patches podem conter apenas um pixel ), embora eu tenha dito que teríamos realizado uma classificação baseada em pixels, então talvez você esperasse que as saídas tivessem as mesmas dimensões espaciais exatas das entradas. No entanto, observe que, na prática, você também pode ter os mapas de saída para ter a mesma dimensão espacial das entradas: você apenas faria ed para realizar uma operação de upsampling (deconvolução) diferente.

Como as convoluções $ 1 \ vezes 1 $ funcionam?

A $ 1 \ times 1 $ convolução é apenas a convolução 2d típica, mas com um kernel $ 1 \ times1 $ .

Como você provavelmente já sabe (e se não sabia, agora você sabe), se tiver um $ g \ times g $ kernel que é aplicado a uma entrada de tamanho $ h \ times w \ times d $ , onde $ d $ é a profundidade do volume de entrada (que, por exemplo, no caso de imagens em tons de cinza, é $ 1 $ ), o kernel realmente tem a forma $ g \ times g \ times d $ , ou seja, a terceira dimensão do kernel é igual à terceira dimensão da entrada à qual ele é aplicado. Este é sempre o caso, exceto para as convoluções 3d, mas agora estamos falando sobre as convoluções 2d típicas! Veja esta resposta para obter mais informações.

Portanto, no caso, queremos aplicar um $ 1 \ times 1 $ convolução para uma entrada de forma $ 388 \ times 388 \ times 64 $ , onde $ 64 $ é a profundidade da entrada, então os reais $ 1 \ times 1 $ kernels que precisaremos usar têm forma $ 1 \ times 1 \ times 64 $ (como eu disse acima para o U-net). A maneira como você reduz a profundidade da entrada com $ 1 \ vezes 1 $ é determinada pelo número de $ 1 \ vezes 1 $ kernels que você deseja usar. Isso é exatamente a mesma coisa que para qualquer operação de convolução 2d com kernels diferentes (por exemplo, $ 3 \ vezes 3 $ ).

No caso do U-net, as dimensões espaciais da entrada são reduzidas da mesma forma que as dimensões espaciais de qualquer entrada para uma CNN são reduzidas (isto é, convolução 2d seguida por operações de redução da resolução). A principal diferença (além de não usar camadas totalmente conectadas) entre a U-net e outras CNNs é que a U-net realiza operações de upsampling, então pode ser vista como um codificador (parte esquerda) seguido por um decodificador (parte direita) .

Comentários

  • Obrigado por sua resposta detalhada, eu realmente aprecio isso!

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *