Como as convoluções 1x1 são iguais às de uma camada totalmente conectada?

55

Li recentemente o comentário de Yan LeCuns sobre convoluções 1x1 :

Nas redes convolucionais, não existem "camadas totalmente conectadas". Existem apenas camadas de convolução com kernels de convolução 1x1 e uma tabela de conexão completa.

É um fato raramente compreendido que ConvNets não precisam ter uma entrada de tamanho fixo. Você pode treiná-los em entradas que produzam um único vetor de saída (sem extensão espacial) e depois aplicá-las a imagens maiores. Em vez de um único vetor de saída, você obtém um mapa espacial dos vetores de saída. Cada vetor vê janelas de entrada em diferentes locais na entrada. Nesse cenário, as "camadas totalmente conectadas" realmente atuam como convoluções 1x1.

Eu gostaria de ver um exemplo simples para isso.

Exemplo

Suponha que você tenha uma rede totalmente conectada. Possui apenas uma camada de entrada e uma camada de saída. A camada de entrada possui 3 nós, a camada de saída possui 2 nós. Esta rede possui parâmetros. Para torná-lo ainda mais concreto, digamos que você tenha uma função de ativação ReLU na camada de saída e na matriz de peso32=6

W=(011235)R2×3b=(813)R2

Portanto, a rede é com .f(x)=ReLU(Wx+b)xR3

Como a camada convolucional deveria parecer a mesma? O que significa LeCun com "tabela de conexão completa"?

Eu acho que para obter uma CNN equivalente, teria que ter exatamente o mesmo número de parâmetros. O MLP acima tem parâmetros.23+2=8

Martin Thoma
fonte

Respostas:

29

Seu exemplo

No seu exemplo, temos 3 unidades de entrada e 2 de saída. Para aplicar convoluções, pense nas unidades que têm forma: [1,1,3]e [1,1,2], respectivamente. Em termos da CNN, temos mapas de recursos de 3entrada e 2saída, cada um com dimensões espaciais 1 x 1.

A aplicação de uma n x nconvolução a uma camada com kmapas de recursos exige que você tenha um núcleo de forma [n,n,k]. Portanto, o núcleo de suas 1x1convoluções tem forma [1, 1, 3]. Você precisa 2desses núcleos (ou filtros) para produzir os 2mapas dos recursos de saída. Observe: convoluções realmente são convoluções. O último é raramente mencionado.1×11×1×number of channels of the input

De fato, se você escolher como kernels e viés:

w1=(011)R3w2=(235)R3b=(813)R2

A camada conv calculará com .f(x)=ReLU((w1xw2x)+(b1b2))xR3

Transformação em código real

Para um exemplo da vida real, também dê uma olhada na minha implementação vgg-fcn . O código fornecido neste arquivo leva os pesos VGG, mas transforma todas as camadas totalmente conectadas em camadas convolucionais. A rede resultante produz a mesma saída que vggquando aplicada à imagem de entrada da forma [244,244,3]. (Ao aplicar as duas redes sem preenchimento).

As camadas convolucionais transformadas são introduzidas na função _fc_layer(linha 145). Eles têm tamanho de kernel 7x7para FC6 (que é máximo, pois o pool5VGG produz um mapa de características [7,7, 512]. Camada FC7e FC8é implementado como 1x1convolução.

"Tabela de conexão completa"

Não tenho 100% de certeza, mas ele pode se referir a um filtro / kernel que possui a mesma dimensão do mapa de recursos de entrada. Nos dois casos (Código e seu Exemplo), as dimensões espaciais são máximas no sentido de que a dimensão espacial do filtro é igual à dimensão espacial da entrada.

MarvMind
fonte
"Portanto, o núcleo de suas convoluções 1x1 tem forma [1, 1, 3].". O que? Parece haver um maior mal-entendido de convoluções. Eu pensei que se um kernel de convolução tem forma [1, 1, 3], então alguém poderia dizer que é uma convolução 1x1x3? Então a convolução 1x1 é apenas sobre a saída, não sobre o kernel?
Martin Thoma
2
Para mim kernel = filtervocê concorda? >> "Então a convolução 1x1 é apenas sobre a saída, não sobre o kernel? De maneira alguma. Uma 3x3convolução pode ter um formato de saída arbitrário." De fato, se o preenchimento for usado e, em stride=1seguida, o output shape = input shape. >> "Eu pensei que se um kernel de convolução tivesse forma [1, 1, 3], alguém poderia dizer que é uma convolução 1x1x3?" Não, eu nunca ouvi alguém falando sobre 3x3x512convoluções. No entanto, todos os filtros de convolução que eu vi têm uma terceira dimensão espacial igual ao número de mapas de características da camada de entrada.
MarvMind
Para referência, consulte o Convolution Democurso Karpathies CS321n: cs231n.github.io/convolutional-networks/#conv . Ou na API tensorflow: tensorflow.org/versions/r0.9/api_docs/python/nn.html#conv2d Os filtros devem ter forma [filter_height, filter_width, in_channels, out_channels].
MarvMind 18/07
Posso acrescentar o item com "convoluções 1x1 são 1 x 1 x número de canais da entrada" à sua resposta? Esta foi a fonte da minha confusão e eu continuo esquecendo isso.
Martin Thoma
Claro vá em frente!
MarvMind
4

Uma camada totalmente ligado (por tamanho de entrada de novo com canais, e neurónios de saída) não é equivalente a uma camada de 1x1 convolução mas sim para um x camada convolução (isto é, um grande núcleo, mesmo tamanho que nenhuma entrada- pad) com número de filtros igual à saída FC / camada oculta (ou seja, filtros)nnimnnm

Como você pediu, ele tem o mesmo número de parâmetros que o FCN, ou seja, (mais o viés):nnim

FCN: (pesos por camada de entrada = canais de entrada ) (vezes a saída / largura da camada oculta)nnim

CNN: (cada núcleo) (núcleo por canal de entrada) (número de filtros)nnim

( Fonte )

Michael Yahalom
fonte
11
É claro que essas duas coisas são equivalentes no caso especial ; Eu acho que é aí que entra a confusão.n=1
Yibo Yang 15/10
2

O kernel equivalente simplesmente tem qualquer forma que a entrada tenha e calcula um produto de ponto tensorial. (Eu uso a palavra "forma", pois parece haver alguma confusão sobre "tamanho", que geralmente ignora a dimensão do canal / profundidade). Não há "deslizar o kernel pela entrada" envolvido, pois o kernel é o maior possível. Citando Stanford CS 231n notas do curso :

qualquer camada FC pode ser convertida em uma camada CONV. Por exemplo, uma camada FC com K = 4096 que está visualizando algum volume de entrada de tamanho 7 × 7 × 512 pode ser expressa de forma equivalente como uma camada CONV com F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096. Em outras palavras, estamos definindo o tamanho do filtro para ser exatamente o tamanho do volume de entrada e, portanto, a saída será simplesmente 1 × 1 × 4096, pois apenas uma coluna de profundidade “se encaixa” no volume de entrada, resultando em idêntico resultado. a camada FC inicial.

Eu acredito que "F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096" aqui significa que cada kernel de conv tem formato 7x7x512 e existem 4096 desses filtros.

A resposta anterior mencionou que o último FC do AlexNet (que recebe entrada com o formato 1x1x4096 e calcula 1000 notas da classe) é implementado como "convolução 1x1". Para ser completo, cada um desses kernel conv tem o formato 1x1x4096 e há 1000 deles.

Le Cunn também explica isso no documento da CNN , página 8, descrição do LeNet5:

A camada C5 é uma camada convolucional com 120 mapas de recursos. Cada unidade está conectada a um bairro 5x5 em todos os 16 mapas de recursos do S4. Aqui, como o tamanho do S4 também é de 5x5, o tamanho dos mapas de recursos do C5 é de 1x1; isso equivale a uma conexão completa entre S4 e C5.

Yibo Yang
fonte
1

Para qualquer usuário novato do PyTorch como eu - não confunda "camada totalmente conectada" com uma "camada linear".

Uma camada linear e convoluções 1x1 são a mesma coisa. Demorei um pouco para entender que não existe uma "camada totalmente conectada" - é simplesmente um achatamento das dimensões espaciais em um tensor gigante 1D. O achatamento faz com que todos os elementos em todos os locais espaciais sejam apresentados como um mapa / canal / dimensão de recurso separado (como você quiser chamar). Portanto, quando aplicamos uma camada linear em um tensor achatado , obtemos uma operação totalmente conectada , que obviamente não é a mesma que uma convolução 1x1.

Uma 1x1convolução é simplesmente um somatório ponderado dos mapas de recursos de entrada, na pergunta do OP, 3. O [0] = . Da mesma forma, O [1] = e O [2] = .j=01X[j]W0[j]+b[0]j=01X[j]W1[j]+b[1]j=01X[j]W2[j]+b[2]

As 3 equações acima se abrem para se tornar .O=W2×3X3×1+b2×1

Outras respostas que afirmam que uma camada totalmente conectada é simplesmente uma camada de convolução válida nxn para uma entrada de tamanho nxnsão confusas (embora corretas).

Rakshit Kothari
fonte