Meu entendimento é que a camada convolucional de uma rede neural convolucional tem quatro dimensões: input_channels, filter_height, filter_width, number_of_filters. Além disso, entendo que cada novo filtro é complicado por TODOS os canais de entrada (ou mapas de recursos / ativação da camada anterior).
NO ENTANTO, o gráfico abaixo do CS231 mostra cada filtro (em vermelho) sendo aplicado a um CANAL ÚNICO, em vez do mesmo filtro sendo usado nos canais. Isso parece indicar que existe um filtro separado para cada canal (neste caso, estou assumindo que sejam os três canais de cores de uma imagem de entrada, mas o mesmo se aplicaria a todos os canais de entrada).
Isso é confuso - existe um filtro exclusivo diferente para cada canal de entrada?
Fonte: http://cs231n.github.io/convolutional-networks/
A imagem acima parece contraditória a um trecho de "Fundamentos da aprendizagem profunda" de O'reilly :
"... os filtros não operam apenas em um único mapa de recursos. Eles operam em todo o volume de mapas de recursos que foram gerados em uma camada específica ... Como resultado, os mapas de recursos devem poder operar sobre volumes, não apenas áreas "
... Além disso, entendo que essas imagens abaixo estão indicando que o filtro THE MESMO está apenas envolvido em todos os três canais de entrada (contraditório com o que é mostrado no gráfico CS231 acima):
Respostas:
O antigo. De fato, existe um kernel separado definido para cada combinação de canal de entrada / canal de saída.
Normalmente, para uma arquitetura CNN, em um único filtro, conforme descrito por seu
number_of_filters
parâmetro, há um kernel 2D por canal de entrada. Existeminput_channels * number_of_filters
conjuntos de pesos, cada um dos quais descreve um núcleo de convolução. Portanto, os diagramas que mostram um conjunto de pesos por canal de entrada para cada filtro estão corretos. O primeiro diagrama também mostra claramente que os resultados da aplicação desses kernels são combinados, somando-os e adicionando viés para cada canal de saída.Isso também pode ser visto como o uso de uma convolução 3D para cada canal de saída, que possui a mesma profundidade da entrada. Qual é o que seu segundo diagrama está mostrando e também o que muitas bibliotecas farão internamente. Matematicamente, esse é o mesmo resultado (desde que as profundidades correspondam exatamente), embora o tipo de camada seja normalmente rotulado como "Conv2D" ou similar. Da mesma forma, se o seu tipo de entrada é inerentemente 3D, como voxels ou um vídeo, você pode usar uma camada "Conv3D", mas internamente ela pode ser implementada como uma convolução 4D.
fonte
input_channels
versões com pesos diferentes . Você tem uma fonte "oficial" que confirma esse entendimento?A figura a seguir que você usou na sua pergunta descreve com muita precisão o que está acontecendo. Lembre-se de que cada elemento do filtro 3D (cubo cinza) é composto de um valor diferente (
3x3x3=27
valores). Assim, três filtros 2D diferentes de tamanho3x3
podem ser concatenados para formar esse filtro 3D de tamanho3x3x3
.O
3x3x3
pedaço RGB da imagem é multiplicado por elementos por um filtro 3D (mostrado em cinza). Nesse caso, o filtro possui3x3x3=27
pesos. Quando esses pesos são multiplicados por elementos e depois somados, ele fornece um valor.Então, existe um filtro separado para cada canal de entrada?
SIM , existem tantos filtros 2D quanto o número de canais de entrada na imagem. No entanto , ajuda se você acha que, para matrizes de entrada com mais de um canal, existe apenas um filtro 3D (como mostrado na imagem acima).
Então, por que isso é chamado de convolução 2D (se o filtro é 3D e a matriz de entrada é 3D)?
Essa é uma convolução 2D, porque os passos do filtro são apenas das dimensões de altura e largura ( NÃO profundidade) e, portanto, a saída produzida por essa convolução também é uma matriz 2D. O número de direções de movimento do filtro determina as dimensões da convolução.
Nota: Se você desenvolver seu entendimento visualizando um único filtro 3D em vez de vários filtros 2D (um para cada camada), terá um tempo fácil para entender arquiteturas avançadas da CNN, como Resnet, InceptionV3, etc.
fonte
input_channels
versões com pesos diferentes . Se esse também é o seu entendimento, existe uma fonte "oficial" que confirme isso?Estou acompanhando as respostas acima com um exemplo concreto, na esperança de esclarecer melhor como a convolução funciona com relação aos canais de entrada e saída e aos pesos, respectivamente:
Seja o exemplo da seguinte forma (wrt para 1 camada convolucional):
input_channels=5
output_channels=56
Nós notamos que:
Essa camada convolucional contém assim:
56 filtros tridimensionais de tamanho 4x4x5 (= 80 pesos diferentes cada) para contabilizar os 56 canais de saída em que cada um tem um valor para a 3ª dimensão de 5 para corresponder aos 5 canais de entrada. No total, existem
number_of_filters=input_channel*output_channels=5*56=280
Filtros 2D de tamanho 4x4 (ou seja, 280x16 pesos diferentes no total).
fonte
Existem apenas restrições em 2D. Por quê?
Imagine uma camada totalmente conectada.
Seria muito grande, cada neurônio estaria conectado a talvez 1000x1000x3 neurônios de entrada. Mas sabemos que o processamento de pixels próximos faz sentido; portanto, nos limitamos a uma pequena vizinhança 2D, de modo que cada neurônio está conectado a apenas um 3x3 próximo de neurônios em 2D. Como não sabemos nada sobre canais, nos conectamos a todos os canais.
Ainda assim, haveria pesos demais. Mas, devido à invariância da tradução, um filtro que funcione bem em uma área provavelmente é útil em uma área diferente. Então, usamos o mesmo conjunto de pesos em 2D. Novamente, não existe essa invariância de tradução entre os canais, portanto não existe essa restrição lá.
fonte
Consulte a seção "Conectividade local" em http://cs231n.github.io/convolutional-networks/ e slide 7-18.
O hiperparâmetro "Receptive Field" do filtro é definido apenas pela altura e largura, pois a profundidade é fixada pela profundidade da camada anterior.
Observe que "A extensão da conectividade ao longo do eixo de profundidade é sempre igual à PROFUNDIDADE do volume de entrada" - ou- PROFUNDIDADE do mapa de ativação (no caso de camadas posteriores).
Intuitivamente, isso deve-se ao fato de os dados dos canais de imagem serem intercalados, não planares. Dessa forma, a aplicação do filtro pode ser obtida simplesmente pela multiplicação dos vetores de coluna.
OBSERVE que a Rede Convolucional aprende todos os parâmetros de filtro (incluindo a dimensão de profundidade) e são totais "h w input_layer_depth + 1 (viés)".
fonte
Eu recomendo o capítulo 2.2.1 da minha tese de mestrado como resposta. Para adicionar às respostas restantes:
Keras é seu amigo para entender o que acontece:
dá
Tente formular suas opções. O que isso significaria para os parâmetros se algo mais acontecesse?
Essa abordagem também ajuda você com outros tipos de camada, não apenas com camadas convolucionais.
Observe também que você é livre para implementar soluções diferentes, que podem ter outros números de parâmetros.
fonte
Apenas para deixar dois detalhes absolutamente claros:
Diga que você temN Canais de entrada 2D indo para N Canais de saída 2D. O número total de 2D3 × 3 filtro de pesos é realmente N2 . Mas como a convolução 3D é afetada, ou seja, se cada canal de entrada contribui com uma camada 2D para cada canal de saída, então cada canal de saída é composto inicialmente porN Camadas 2D, como elas são combinadas?
Isso tende a ser encoberto em quase todas as publicações que eu já vi, mas o conceito principal é oN2 Os canais de saída 2D são intercalados entre si para formar o N canais de saída, como baralhos de cartas embaralhados, antes de serem somados. Tudo isso é lógico quando você percebe que, ao longo das dimensões do canal de uma convolução (que nunca é ilustrada), você realmente tem uma camada totalmente conectada! Cada canal 2D de entrada, multiplicado por um único3 × 3 filtro, gera uma contribuição da camada de saída 2D para um único canal de saída. Uma vez combinadas, cada camada de saída é uma combinação de todas as camadas de entrada× um filtro exclusivo. É uma contribuição de todos para todos.
A maneira mais fácil de convencer-se disso é imaginar o que acontece em outros cenários e ver que a computação se degenera - ou seja, se você não intercala e recombina os resultados, as diferentes saídas não fazem nada de verdade - elas teria o mesmo efeito que uma única saída com pesos combinados.
fonte
Para quem tenta entender como as convoluções são calculadas, aqui está um trecho de código útil no Pytorch:
A execução disso fornece a seguinte saída:
Observe como cada canal da convolução soma todos os canais anteriores.
fonte