Estou procurando uma boa explicação de como funcionam as convoluções no aprendizado profundo quando aplicadas a imagens multicanais. Por exemplo, digamos que eu tenha uma imagem de 100 x 100 pixels com três canais, RGB. O tensor de entrada teria dimensões de 100 x 100 x 3.
Se eu aplicar uma convolução com N filtros e um passo de um, a dimensão de saída será:
100 x 100 x 3 x N?
ou
100 x 100 x N?
Em outras palavras, a convolução aplicada "aplaina" a imagem ou a convolução é aplicada canal por canal?
Em todas as implementações para CNNs que processam imagens que eu já vi, a saída em qualquer camada é
Width x Height x Channels
ou alguma permutação. Esse é o mesmo número de dimensões que a entrada, nenhuma dimensão adicional é adicionada pelas camadas convolucionais. Cada canal do mapa de recursos na saída de uma camada CNN é uma matriz 2D "achatada" criada pela adição dos resultados de vários núcleos 2D (um para cada canal na camada de entrada).
Geralmente, espera-se que Width x Height x 1até mesmo imagens de entrada em escala de cinza sejam representadas para que elas se ajustem ao mesmo padrão e ao mesmo modelo de camada.
É totalmente viável criar um design de camada que converta uma camada de entrada de canais 2D + padrão em uma camada de canais 3D +. Não é algo que eu já tenha visto antes, mas você nunca pode descartar que isso poderia ser útil em um problema específico.
Você também pode ver convoluções de canais 3D + nas CNNs aplicadas ao vídeo, mas, nesse caso, a estrutura apresentará alguma variação de
Ótimo, obrigado. Na verdade, encontrei outra boa explicação que inclui a forma do kernel de convolução aqui: ligação
David Ruiz
2
Depende do número de filtros que você escolher. digamos que você escolheu 64 filtros.
seu tensor de peso terá a forma [3, 3, 3, 64] (3º é o número de canais na camada de entrada e 64 é o número de canais na camada de saída) e o formato do tensor de polarização [64]
a saída será se Pad = "SAME" e o passo 1 para uma imagem de entrada de 224 * 224 * 3 = 224 * 224 * 64
a saída será se Pad = "Válido" e o passo 1 para uma imagem de entrada de 224 * 224 * 3 = 221 * 221 * 64
Agora, com uma entrada de 221 * 221 * 64, se você quiser criar 128 filtros na próxima camada, a sua forma vetorial de peso será [3, 3, 64, 128] e a forma polarizada de vecotr será [128]
e formato de saída - se Pad = "MESMO" [221, 221, 128] - se Pad = "VÁLIDO" [198, 198, 128] considerando o passo = [1,1,1,1]
você pode verificar esses resultados enquanto cria o gráfico usando layername.get_shape ().
Tecnicamente, a resposta à pergunta do OP não depende do número de filtros. Portanto, sua primeira frase pode ser alterada / esclarecida. No entanto, os valores de exemplo são úteis, especialmente deixando clara a forma da matriz de pesos.
Neil Slater
1
A dimensão de saída de uma convolução na aprendizagem profunda depende de vários fatores
o tamanho do filtro (também conhecido como kernel)
o preenchimento (se você adiciona zeros ou não à sua imagem e quantos)
os números de filtro que você usa
o passo
A dependência mais simples é a do número de filtros N. Ele fornece o número de mapas de recursos que sua saída possui. Para a entrada que pode ser os canais RGB, ou seja, 3, para a saída, esse número pode ser escolhido livremente.
O próximo fator é o preenchimento zero. Se você usar um tamanho de filtro de (3,3) e um preenchimento "válido", ou seja, adicionar zeros NÃO ao redor da imagem, você terá uma saída de dimensão.
(100, 100, 3) -> (98, 98, N)
Como você usa um passo de 1. Se você mover o filtro pela imagem no final da imagem em cada direção, o filtro atingirá a borda após 98 etapas.
No entanto, se você usar o preenchimento "SAME", compensa o tamanho do filtro - no caso de um tamanho de filtro de (3,3) que corresponda a uma linha de zeros ao redor da imagem - você terá:
(100, 100, 3) -> (100, 100, N)
Com um passo de 2, por exemplo, você altera a posição do filtro em dois pixels. Portanto, você obtém
Os três canais RGB são convoluídos por diferentes kernels e adicionados em cada mapa de recursos. Portanto, você terá 100 x 100 x N como primeira camada de saída.
Depende do número de filtros que você escolher. digamos que você escolheu 64 filtros.
seu tensor de peso terá a forma [3, 3, 3, 64] (3º é o número de canais na camada de entrada e 64 é o número de canais na camada de saída) e o formato do tensor de polarização [64]
a saída será se Pad = "SAME" e o passo 1 para uma imagem de entrada de 224 * 224 * 3 = 224 * 224 * 64
a saída será se Pad = "Válido" e o passo 1 para uma imagem de entrada de 224 * 224 * 3 = 221 * 221 * 64
Agora, com uma entrada de 221 * 221 * 64, se você quiser criar 128 filtros na próxima camada, a sua forma vetorial de peso será [3, 3, 64, 128] e a forma polarizada de vecotr será [128]
e formato de saída - se Pad = "MESMO" [221, 221, 128] - se Pad = "VÁLIDO" [198, 198, 128] considerando o passo = [1,1,1,1]
você pode verificar esses resultados enquanto cria o gráfico usando layername.get_shape ().
fonte
A dimensão de saída de uma convolução na aprendizagem profunda depende de vários fatores
A dependência mais simples é a do número de filtros
N
. Ele fornece o número de mapas de recursos que sua saída possui. Para a entrada que pode ser os canais RGB, ou seja, 3, para a saída, esse número pode ser escolhido livremente.O próximo fator é o preenchimento zero. Se você usar um tamanho de filtro de (3,3) e um preenchimento "válido", ou seja, adicionar zeros NÃO ao redor da imagem, você terá uma saída de dimensão.
Como você usa um passo de 1. Se você mover o filtro pela imagem no final da imagem em cada direção, o filtro atingirá a borda após 98 etapas.
No entanto, se você usar o preenchimento "SAME", compensa o tamanho do filtro - no caso de um tamanho de filtro de (3,3) que corresponda a uma linha de zeros ao redor da imagem - você terá:
Com um passo de 2, por exemplo, você altera a posição do filtro em dois pixels. Portanto, você obtém
fonte
Os três canais RGB são convoluídos por diferentes kernels e adicionados em cada mapa de recursos. Portanto, você terá 100 x 100 x N como primeira camada de saída.
fonte