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 peso
Portanto, a rede é com .
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.
fonte
kernel = filter
você concorda? >> "Então a convolução 1x1 é apenas sobre a saída, não sobre o kernel? De maneira alguma. Uma3x3
convolução pode ter um formato de saída arbitrário." De fato, se o preenchimento for usado e, emstride=1
seguida, ooutput 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 sobre3x3x512
convoluçõ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.Convolution Demo
curso 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]
.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)n∗n i m n n m
Como você pediu, ele tem o mesmo número de parâmetros que o FCN, ou seja, (mais o viés):n∗n∗i∗m
FCN: (pesos por camada de entrada = canais de entrada ) (vezes a saída / largura da camada oculta)n∗n∗i ∗ ∗m
CNN: (cada núcleo) (núcleo por canal de entrada) (número de filtros)n∗n ∗i ∗m
( Fonte )
fonte
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 :
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:
fonte
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∑1j=0X[j]W0[j]+b[0] ∑1j=0X[j]W1[j]+b[1] ∑1j=0X[j]W2[j]+b[2]
1x1
convoluçã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] = .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 tamanhonxn
são confusas (embora corretas).fonte