In che modo le convoluzioni 1x1 sono le stesse di un livello completamente connesso?


55

Di recente ho letto il commento di Yan LeCuns su convoluzioni 1x1 :

Nelle reti convoluzionali non esistono "livelli completamente connessi". Esistono solo livelli di convoluzione con kernel convoluzione 1x1 e una tabella di connessione completa.

È un fatto troppo raro che ConvNets non abbia bisogno di un input di dimensioni fisse. È possibile addestrarli su input che producono un singolo vettore di output (senza estensione spaziale) e quindi applicarli a immagini più grandi. Invece di un singolo vettore di output, si ottiene quindi una mappa spaziale dei vettori di output. Ogni vettore vede finestre di input in posizioni diverse sull'input. In quello scenario, i "livelli completamente connessi" agiscono davvero come convoluzioni 1x1.

Vorrei vedere un semplice esempio per questo.

Esempio

Supponiamo di avere una rete completamente connessa. Ha solo un livello di input e un livello di output. Il livello di input ha 3 nodi, il livello di output ha 2 nodi. Questa rete ha 32=6 parametri. Per renderlo ancora più concreto, supponiamo che tu abbia una funzione di attivazione ReLU nel livello di output e nella matrice del peso

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

Quindi la rete è f(x)=ReLU(Wx+b) con xR3 .

Come dovrebbe essere lo strato convoluzionale essere lo stesso? Che cosa significa LeCun con "tabella di connessione completa"?

Immagino che per ottenere una CNN equivalente dovrebbe avere esattamente lo stesso numero di parametri. L'MLP dall'alto ha 23+2=8 parametri.

Risposte:


29

Il tuo esempio

Nel tuo esempio abbiamo 3 unità di input e 2 di output. Per applicare le convoluzioni, pensa a quelle unità che hanno forma: [1,1,3]e [1,1,2], rispettivamente. In termini CNN, abbiamo mappe delle caratteristiche di 3input e 2output, ognuna con dimensioni spaziali 1 x 1.

n x nk[n,n,k]1x1[1, 1, 3]221×11×1×number of channels of the input


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

f(x)=ReLU((w1xw2x)+(b1b2))xR3

Trasformazione in codice reale

Per un esempio di vita reale, dai anche un'occhiata alla mia implementazione di vgg-fcn . Il codice fornito in questo file prende i pesi VGG, ma trasforma ogni livello completamente connesso in livelli convoluzionali. La rete risultante produce lo stesso output di vggquando applicata all'immagine di input della forma [244,244,3]. (Quando si applicano entrambe le reti senza riempimento).

Gli strati convoluzionali trasformati vengono introdotti nella funzione _fc_layer(linea 145). Hanno dimensioni del kernel 7x7per FC6 (che è massima, a partire pool5da VGG genera una mappa delle caratteristiche di forma [7,7, 512]. Livello FC7e FC8sono implementate come 1x1convoluzione.

"Tabella di connessione completa"

Non sono sicuro al 100%, ma potrebbe riferirsi a un filtro / kernel che ha la stessa dimensione della mappa delle caratteristiche di input. In entrambi i casi (Codice e il tuo esempio) le dimensioni spaziali sono massime nel senso che la dimensione spaziale del filtro è la stessa della dimensione spaziale dell'input.


"Quindi il kernel di voi convoluzioni 1x1 ha forma [1, 1, 3].". Che cosa? Sembra esserci un più grande fraintendimento delle convoluzioni. Ho pensato che se un kernel convoluzione avesse forma [1, 1, 3], allora si direbbe che è una convoluzione 1x1x3? Quindi la convoluzione 1x1 riguarda solo l'output, non il kernel?
Martin Thoma,

2
Per me kernel = filtersei d'accordo? >> "Quindi la convoluzione 1x1 riguarda solo l'output, non il kernel? Niente affatto. Una 3x3convoluzione può avere una forma di output arbitraria." In effetti, se si usa il padding e stride=1quindi il output shape = input shape. >> "Ho pensato che se un kernel convoluzione avesse forma [1, 1, 3], allora si direbbe che è una convoluzione 1x1x3?" No, non ho mai sentito qualcuno parlare di 3x3x512convoluzioni. Tuttavia, tutti i filtri di convoluzione che ho visto hanno una terza dimensione spaziale pari al numero di mappe caratteristiche del livello di input.
Marv,

Per riferimento, dai un'occhiata al corso Convolution Demodi Karpathies CS321n: cs231n.github.io/convolutional-networks/#conv . O all'API tensorflow: tensorflow.org/versions/r0.9/api_docs/python/nn.html#conv2d I filtri dovrebbero avere forma [filter_height, filter_width, in_channels, out_channels].
Marv,

Posso aggiungere la cosa con "1x1 convoluzioni sono 1 x 1 x numero di canali dell'ingresso" alla tua risposta? Questa era la fonte della mia confusione e continuo a dimenticarlo.
Martin Thoma,

Certo andare avanti!
MarvMind

4

nnimnnm

nnim

nnim

nnim

( Fonte )


1
n=1

2

Il kernel equivalente ha semplicemente la forma che ha l'input e calcola un prodotto tensor dot. (Uso la parola "forma" in quanto sembra esserci un po 'di confusione su "dimensione", che spesso ignora la dimensione del canale / profondità). Non è necessario "far scorrere il kernel attraverso l'input", poiché il kernel è grande quanto può essere. Citando le note del corso Stanford CS 231n :

qualsiasi livello FC può essere convertito in un livello CONV. Ad esempio, uno strato FC con K = 4096 che sta osservando un volume di input di dimensioni 7 × 7 × 512 può essere espresso in modo equivalente come uno strato CONV con F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096. In altre parole, stiamo impostando la dimensione del filtro esattamente sulla dimensione del volume di input, e quindi l'uscita sarà semplicemente 1 × 1 × 4096 poiché solo una singola colonna di profondità "si adatta" al volume di input, dando lo stesso risultato di il livello FC iniziale.

Credo che "F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096" qui significa che ogni kernel conv ha forma 7x7x512 e ci sono 4096 tali filtri.

La risposta precedente menzionava che l'ultimo fc di AlexNet (che riceve input con forma 1x1x4096 e calcola punteggi di classe 1000) è implementato come "convoluzione 1x1". Per essere completo, ciascuno di questi kernel conv ha forma 1x1x4096 e ce ne sono 1000.

Le Cunn spiega anche questo nel documento della CNN , pagina 8, descrizione di LeNet5:

Il livello C5 è un livello convoluzionale con 120 mappe caratteristiche. Ogni unità è collegata a un quartiere 5x5 su tutte e 16 le mappe delle caratteristiche di S4. Qui poiché la dimensione di S4 è anche 5x5, la dimensione delle mappe caratteristiche di C5 è 1x1; questo equivale a una connessione completa tra S4 e C5.


1

A tutti gli utenti principianti di PyTorch come me , non confondere il "livello completamente connesso" con un "livello lineare".

Uno strato lineare e convoluzioni 1x1 sono la stessa cosa. Mi ci è voluto un po 'di tempo per capire che non esiste uno "strato completamente connesso" - è semplicemente un appiattimento delle dimensioni spaziali in un tensore gigante 1D. L'appiattimento fa sì che ogni elemento in tutte le posizioni spaziali venga presentato come una mappa / canale / dimensione separata (come si desidera chiamarlo). Quindi, quando applichiamo uno strato lineare su un tensore appiattito , otteniamo un'operazione completamente connessa , che ovviamente non è la stessa di una convoluzione 1x1.

1x1j=01X[j]W0[j]+b[0]j=01X[j]W1[j]+b[1]j=01X[j]W2[j]+b[2]

O=W2×3X3×1+b2×1

Altre risposte che affermano che uno strato completamente connesso è semplicemente uno strato di convoluzione valido nxn per un input di dimensioni nxnè confuso (sebbene corretto).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.