Cosa significa convoluzione 1x1 in una rete neurale?


106

Attualmente sto facendo il tutorial di apprendimento profondo Udacity. Nella lezione 3, parlano di una convoluzione 1x1. Questa convoluzione 1x1 viene utilizzata in Google Inception Module. Ho difficoltà a capire cos'è una convoluzione 1x1.

Ho visto anche questo post di Yann Lecun.

Qualcuno potrebbe gentilmente spiegarmi questo?


Vedi anche una domanda
gkcn

1
Ecco un post sul blog su questi moduli che è andato in dettaglio sulle convoluzioni 1x1: hackathonprojects.wordpress.com/2016/09/25/…
Tommy

1
Per dirla semplicemente, l'intera idea è quella di ridurre il numero di canali nel volume 3D, accelerando così il calcolo.
onerhao

Risposte:


113

Supponiamo che io abbia uno strato conv che genera un tensore a forma di dove:(N,F,H,W)

  • N è la dimensione del lotto
  • F è il numero di filtri convoluzionali
  • H,W sono le dimensioni spaziali

Supponiamo che questo output sia inserito in un layer conv con filtri 1x1, zero padding e falcata 1. Quindi l'output di questo layer conv 1x1 avrà forma .F1(N,F1,H,W)

Quindi i filtri conv 1x1 possono essere usati per cambiare la dimensionalità nello spazio del filtro. Se allora stiamo aumentando la dimensionalità, se stiamo diminuendo la dimensionalità, nella dimensione del filtro.F1>FF1<F

Infatti, nell'articolo di Google Inception Going Deeper with Convolutions , affermano (il grassetto è mio, non di autori originali):

Un grosso problema con i moduli di cui sopra, almeno in questa forma ingenua, è che anche un numero modesto di convoluzioni 5x5 può essere proibitivamente costoso su uno strato convoluzionale con un gran numero di filtri.

Questo porta alla seconda idea dell'architettura proposta: applicare con giudizio riduzioni e proiezioni dimensionali ovunque i requisiti computazionali aumenterebbero troppo altrimenti. Questo si basa sul successo degli incorporamenti: anche gli incorporamenti a bassa dimensione potrebbero contenere molte informazioni su una patch di immagine relativamente grande ... Le convoluzioni 1x1 vengono utilizzate per calcolare le riduzioni prima delle costose convoluzioni 3x3 e 5x5. Oltre ad essere utilizzati come riduzioni, includono anche l'uso dell'attivazione lineare rettificata che li rende a duplice scopo.

Quindi, nell'architettura di Inception, utilizziamo i filtri convoluzionali 1x1 per ridurre la dimensionalità nella dimensione del filtro. Come ho spiegato sopra, questi strati conv di 1x1 possono essere usati in generale per cambiare la dimensionalità dello spazio del filtro (aumentare o diminuire) e nell'architettura Inception vediamo quanto questi filtri 1x1 possano essere efficaci per la riduzione della dimensionalità, esplicitamente nello spazio della dimensione del filtro , non lo spazio dimensionale spaziale.

Forse ci sono altre interpretazioni dei filtri conv di 1x1, ma preferisco questa spiegazione, specialmente nel contesto dell'architettura di Google Inception.


3
È che il conv 1x1 comprime la dimensione del filtro precedente su 1, prima di implementare il conv 5x5?
Leonard Loo,

1
@LeonardLoo ogni kernel 1x1 riduce la dimensione del filtro a 1, ma puoi avere più kernel in una convoluzione 1x1, quindi il numero di "filtri" può essere arbitrario a tua scelta.
Fazzolini,

43

Una convoluzione 1x1 mappa semplicemente un pixel di input con tutti i suoi canali su un pixel di output, senza guardare nulla attorno a se stesso. Viene spesso utilizzato per ridurre il numero di canali di profondità, poiché spesso è molto lento moltiplicare i volumi con profondità estremamente grandi.

input (256 depth) -> 1x1 convolution (64 depth) -> 4x4 convolution (256 depth)

input (256 depth) -> 4x4 convolution (256 depth)

Quello in basso è circa 3,7 volte più lento.

Teoricamente la rete neurale può 'scegliere' quali input 'colori' guardare usando questo, invece della forza bruta moltiplicando tutto.


19
Direi che 1x1 associa non solo un pixel a un pixel di output, ma comprime tutti i canali di pixel di input su un pixel. Nel tuo esempio nella prima riga, ci sono 256 canali per l'input e ognuno dei 64 kernel 1x1 comprime tutti i 256 canali di input in un solo "pixel" (numero reale). Il risultato è che ora hai 64 canali invece di 256 con la stessa dimensione spaziale, il che rende la convoluzione 4x4 più computazionalmente più economica che nell'esempio della tua seconda riga.
Fazzolini,

Buon punto, aggiornerò il post :)
Free Debreuil

3
Da dove hai preso 3,7 volte più lentamente?
CMCDragonkai,

@CMCDragonkai Supponiamo che il costo di calcolo sia proporzionale al numero di pesi. Nel secondo caso, il num_weights = in_depth x out_depth x kernel_size = 256x256x4x4. Nel primo caso num_weights = 256x64x1x1+64x265x4x4=256x64x17,. Prendi il rapporto e questo dà 256/17 ~ 3.7. Controllare questo documento a pagina 9 per una visualizzazione su come i pesi num sono correlati alla profondità di input e alla profondità di output. arxiv.org/pdf/1603.07285.pdf
Nelson Dinh

11

Il motivo principale non ho capito circonvoluzioni 1x1 è perché non ho capito come circonvoluzioni davvero lavorato il fattore-chiave è come calcolare una convoluzione di più canali / filtri opere. Per capirlo, ho trovato utile anche questa risposta:any

https://datascience.stackexchange.com/questions/9175/how-do-subsequent-convolution-layers-work

In particolare, il Tipo 2.2 è la descrizione corretta di una convoluzione lì.

Un'altra risposta utile:

https://ai.stackexchange.com/questions/5769/in-a-cnn-does-each-new-filter-have-different-weights-for-each-input-channel-or

Questa risposta spiega come hai un filtro separato per ogni combinazione di canali in / out . Dopo aver calcolato ciascuno di questi, i risultati vengono sommati sull'asse del canale di input lasciando il numero di valori del canale di output .

Ecco un video che ho trovato che mi ha aiutato a capire come funziona una convoluzione 1x1.

https://www.coursera.org/lecture/convolutional-neural-networks/networks-in-networks-and-1x1-convolutions-ZTb8x

Ecco le cose principali che ne ho ricavato:

  • L'input di una convoluzione 1x1 è di solito convoluzioni precedenti che hanno dimensioni x . Ma se ci fossero filtri nell'ultimo livello di convoluzioni, otterrai una matrice sagomata . Una convoluzione 1x1 è in realtà un vettore di dimensioni che si avvolge su tutta l'immagine, creando un filtro di output di x . Se si hanno convoluzioni 1x1, l'output di tutte le convoluzioni 1x1 è size .mnf1(m,n,f1)f1mnf2(m,n,f2)
  • Quindi una convoluzione 1x1, presupponendo , può essere vista come una nuova rappresentazione dei filtri tramite i filtri . Consente alla rete di addestrare su come ridurre la dimensione nel modo più efficiente.f2<f1f1f2

Ok, questo è l'unico posto finora che ha spiegato correttamente che la convoluzione 1x1 è in realtà un prodotto 'punto' con(m,n,f1)
Red Floyd

3

Proverò a spiegare più intuitivamente e in breve con le illustrazioni!

Un conv 1 * 1 (noto anche come network in network )?

supponiamo che l'input sia (n_H, n_W, n_c_prev). Puoi pensare a (1 * 1 * n_c_prev) come un singolo neurone (una rete completamente connessa -ie perché N / w in N / w ) che sta prendendo in (n_c_prev) numeri nell'input moltiplicandoli con (1 * 1 * n_c_prev ) e quindi aggiungendo e quindi prendendo ReLu e output (n_H, n_W) e se si hanno più filtri (n_c), l'output sarebbe (n_H, n_W, n_C).

Quindi è possibile utilizzare il pooling layer per ridurre le dimensioni spaziali (n_H, n_W) e utilizzare 1 * 1 conv per ridurre n_c_prev (ovvero il numero di canali) che consente di risparmiare molti calcoli. Per esempio

inserisci qui la descrizione dell'immagine

Pertanto, un take away

  • È possibile utilizzare un livello convoluzionale 1x1 per ridurre n_C ma non n_H, n_W.

  • È possibile utilizzare un livello di pooling per ridurre n_H, n_W e n_C.

In altre parole, inserisci qui la descrizione dell'immagine

  • cosa stai facendo usando il filtro CONV 1 * 1 è? in pratica prendi "1 * 1 * num_input_channel_of_featureMap" dimensioni pesi e contorti (elementally * seguito da +) questo volume su image / featureMap di dimensioni "W H num_input_channel_of_featureMap" e quello che ottieni è un output di dimensioni "W * H".

  • Ora puoi usare il numero "#filters" di questo tipo "1 * 1 * num_input_channel_of_featureMap" e ottenere il volume "W H #filter" come output finale!

  • Più precisamente, stai moltiplicando "1 * 1" con 32 diversi pesi (1 * 1 Volume) con una fetta nella stessa posizione nella mappa delle caratteristiche di input seguita da ReLu e ottieni un singolo numero corrispondente generato, visto come pixel di colore verde !

  • 1 * 1 CONV aiuta a ridurre il numero di canali e a risparmiare sui calcoli in alcune reti (INCEPTIONS).!

  • Ma, naturalmente, se vuoi mantenere lo stesso numero di canali della mappa delle caratteristiche di input, va bene lo stesso, l'unica cosa che 1 * 1 CONV fa è semplicemente applicare ReLU Non linearità ad essa che gli consente di imparare funzioni complesse in NN .


1

Un'altra idea sulla riduzione della dimensionalità nel contesto dei filtri 1x1:

Prendiamo ad esempio uno strato fc7 4096x8x8 di FCN. Cosa succede se il livello successivo (chiamalo fc8) è 2048x8x8 con dimensione filtro 1? fc7 è molto profondo all'interno della rete, ognuna delle sue 4096 caratteristiche è semanticamente ricca, ma ogni neurone (ad esempio l'immagine di input è 250x250x3) ha un ampio campo ricettivo. In altre parole, se un neurone è molto attivo, sappiamo che da qualche parte nel suo campo semantico c'è una caratteristica corrispondente presente.

Prendiamo ad esempio un neurone più in alto a sinistra in fc8 con un filtro 1x1. Si collega a tutti i 4096 neuroni / caratteristiche solo nello stesso campo ricettivo (angolo in alto a sinistra dell'immagine), ciascuno dei quali è attivato da una singola caratteristica. Alcuni (diciamo gli stessi 500) sono molto attivi. Se anche il neurone risultante è molto attivo, significa che probabilmente ha imparato a identificare 1 o più caratteristiche in questo campo ricettivo. Dopo averlo fatto 2048 volte per i neuroni più in alto a sinistra in fc8, molti di essi (ad es. 250) saranno molto attivi, il che significa che hanno "raccolto" le caratteristiche dallo stesso campo ricettivo attraverso fc7 e molti molto probabilmente più di uno.

Se continui a ridurre la dimensionalità, un numero decrescente di neuroni imparerà un numero crescente di caratteristiche dallo stesso campo ricettivo. E poiché i parametri spaziali 8x8 rimangono gli stessi, non cambiamo la "visione" di ciascun neurone, quindi non diminuiamo la ruvidezza spaziale.

Potresti dare un'occhiata a "Reti convoluzionali" di Long, Shelhamer e Darrel.


1
Io penso che questa è un'altra buona intuizione del meccanismo, ma ho intenzione di dover tornare ad esso, perché trovo la notazione per le dimensioni confondere, e soprattutto "Dopo aver fatto questo 2048 volte per la sinistra-alto neuroni in fc8 ".
WillC

Non ho capito molto bene cosa stai cercando di dire, potresti chiarire per favore?
Michael Heidelberg,

0

L'operazione matematica della convoluzione significa calcolare il prodotto di due funzioni (continue o discrete) su tutte le posizioni di spostamento possibili.

In un'immagine bidimensionale (livello di grigio), una convoluzione viene eseguita da un'operazione a finestra scorrevole, in cui la finestra (kernel della convoluzione 2-d) è una matrice .v×v

Le applicazioni di elaborazione delle immagini delle reti neurali - comprese le reti neurali convoluzionali - sono state riviste in: [M. Egmont-Petersen, D. de Ridder, H. Handels. Elaborazione di immagini con reti neurali - una recensione , Pattern Recognition , Vol. 35, n. 10, pagg. 2279-2301, 2002].

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.