Le convoluzioni "appiattiscono le immagini"?


8

Sto cercando una buona spiegazione di come funzionano le convoluzioni nell'apprendimento profondo quando applicate a immagini multicanale. Ad esempio, supponiamo che io abbia un'immagine di 100 x 100 pixel con tre canali, RGB. Il tensore di input avrebbe quindi dimensioni 100 x 100 x 3.

Se applico una convoluzione con N filtri e un passo di uno, la dimensione di output sarà:

100 x 100 x 3 x N?

o

100 x 100 x N?

In altre parole, la convoluzione applicata "appiattisce" l'immagine o la convoluzione viene applicata su un canale per canale?

Risposte:


7

In tutte le implementazioni per CNN che elaborano immagini che ho visto, l'output in qualsiasi livello è

Width x Height x Channels

o qualche permutazione. Questo è lo stesso numero di dimensioni dell'input, nessuna dimensione aggiuntiva viene aggiunta dai livelli convoluzionali. Ogni canale della mappa delle caratteristiche nell'output di un livello CNN è un array 2D "appiattito" creato aggiungendo i risultati di più kernel 2D (uno per ciascun canale nel livello di input).

Di solito ci si aspetta che anche le immagini di input in scala di grigi siano rappresentate in Width x Height x 1modo tale che si adattino allo stesso modello e allo stesso modello di livello possa essere utilizzato.

È del tutto possibile costruire un progetto di livello che converta un livello di input di canali 2D + standard in un livello di canali 3D +. Non è qualcosa che ho visto prima, ma non si può mai escludere che potrebbe essere utile in un problema specifico.

Potresti anche vedere convoluzioni dei canali 3D + nelle CNN applicate al video, ma in tal caso, la struttura sarà una variazione di

Width x Height x Frames x Channels

Grazie mille. In realtà ho trovato un'altra buona spiegazione che include la forma del kernel di convoluzione qui: link
David Ruiz,

2

Dipende dal numero di filtri scelti. supponiamo che tu abbia scelto 64 filtri.

il tensore del peso sarà di forma [3, 3, 3, 64] (il terzo 3 è il numero di canali nel livello di input e 64 è il numero di canali nel livello di output) e la forma del tensore di polarizzazione [64]

l'output sarà se Pad = "SAME" e passo 1 per un'immagine di input di 224 * 224 * 3 = 224 * 224 * 64

l'output sarà se Pad = "Valido" e passo 1 per un'immagine in ingresso di 224 * 224 * 3 = 221 * 221 * 64

Ora con un input di 221 * 221 * 64 se si desidera creare 128 filtri nel livello successivo, la forma del vettore del peso sarà [3, 3, 64, 128] e la forma del bias vecotr sarà [128]

e forma dell'uscita - se Pad = "SAME" [221, 221, 128] - se Pad = "VALID" [198, 198, 128] considerando il passo = [1,1,1,1]

puoi controllare questi risultati mentre costruisci il grafico usando layername.get_shape ().


1
Tecnicamente la risposta alla domanda del PO non dipende dal numero di filtri. Quindi la tua prima frase potrebbe essere modificata / chiarita. Tuttavia, i valori di esempio sono utili, soprattutto chiarendo la forma dell'array dei pesi.
Neil Slater,

1

La dimensione di output di una convoluzione nel deep learning dipende da molteplici fattori

  1. la dimensione del filtro (aka kernel)
  2. il riempimento (se aggiungi o meno zeri attorno all'immagine e quanti)
  3. i numeri di filtro che usi
  4. il passo

La dipendenza più semplice è quella sul numero di filtri N. Ti dà il numero di mappe caratteristiche che il tuo output ha. Per l'ingresso che può essere i canali RGB, ovvero 3, per l'uscita questo numero può essere scelto liberamente.

Il prossimo fattore è lo zero padding. Se si utilizza una dimensione del filtro di (3,3) e un'imbottitura "valida", ovvero l'aggiunta di NO zeri attorno all'immagine, si ottiene un output di dimensione.

(100, 100, 3) -> (98, 98, N)

Poiché si utilizza un passo di 1. Se si sposta il filtro sull'immagine alla fine dell'immagine in ciascuna direzione, il filtro colpirà il bordo dopo 98 passaggi.

Tuttavia, se usi il padding "SAME" compensi la dimensione del filtro, nel caso di una dimensione del filtro di (3,3) che corrisponderebbe a una linea di zeri attorno all'immagine, finirai con:

(100, 100, 3) -> (100, 100, N)

Con un passo di 2, ad esempio, si sposta la posizione del filtro di due pixel. Pertanto, ottieni

(100, 100, 3) -> (50, 50, N)

1

I tre canali RGB sono contorti da kernel diversi e aggiunti in ciascuna mappa delle caratteristiche. Quindi, avrai 100 x 100 x N come primo strato di output.

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.