In che modo la CNN "12" di Krizhevsky ottiene 253.440 neuroni nel primo strato?


24

In Alex Krizhevsky, et al. La classificazione di Imagenet con reti neurali profonde convoluzionali enumera il numero di neuroni in ogni strato (vedi diagramma sotto).

L'input della rete è di 150.528 dimensioni e il numero di neuroni negli strati rimanenti della rete è dato da 253.440–186.624–64.896–64.896–43.264– 4096–4096–1000.

CNN

Una vista 3D

Il numero di neuroni per tutti gli strati dopo il primo è chiaro. Un modo semplice per calcolare i neuroni è semplicemente moltiplicare le tre dimensioni di quello strato ( planes X width X height):

  • Strato 2: 27x27x128 * 2 = 186,624
  • Livello 3: 13x13x192 * 2 = 64,896
  • eccetera.

Tuttavia, guardando il primo strato:

  • Strato 1: 55x55x48 * 2 = 290400

Si noti che questo non è 253,440come specificato nel documento!

Calcola le dimensioni dell'output

L'altro modo per calcolare il tensore di output di una convoluzione è:

Se l'immagine di input è un tensore 3D nInputPlane x height x width, la dimensione dell'immagine di output sarà nOutputPlane x owidth x oheightdove

owidth = (width - kW) / dW + 1

oheight = (height - kH) / dH + 1 .

(dalla documentazione di Torch SpatialConvolution )

L'immagine di input è:

  • nInputPlane = 3
  • height = 224
  • width = 224

E il livello di convoluzione è:

  • nOutputPlane = 96
  • kW = 11
  • kH = 11
  • dW = 4
  • dW = 4

(es. dimensione del kernel 11, falcata 4)

Collegando questi numeri otteniamo:

owidth = (224 - 11) / 4 + 1 = 54 oheight = (224 - 11) / 4 + 1 = 54

Quindi siamo a corto di 55x55dimensioni di cui abbiamo bisogno per abbinare il foglio. Potrebbero essere padding (ma il cuda-convnet2modello imposta esplicitamente il padding su 0)

Se prendiamo le 54dimensioni della dimensione otteniamo i 96x54x54 = 279,936neuroni - ancora troppi.

Quindi la mia domanda è questa:

Come ottengono 253.440 neuroni per il primo strato convoluzionale? Cosa mi sto perdendo?


Hai mai risolto questo? Giusto per essere pedanti con i tuoi calcoli: larghezza e altezza sarebbero effettivamente 54,25. Ho cercato di capirlo, e come primo passo ho diviso i 253440 neuroni presunti tra 96 ​​filtri, che produce 2640 neuroni per filtro. Questo non è un numero quadrato. Quindi o entrambi abbiamo un malinteso qui, o potrebbe esserci un errore da parte degli autori ... Li hai contattati?
anderas,

lo stesso con me, questo mi confonde molto. a proposito c'è vero l'ingresso è 224x224x3? penso che debba essere 227x227x3. vediamo se abbiamo 227x227, 5 celle sulla prima sinistra e 5 celle sull'ultima destra non possono essere al centro della convoluzione del kernel con dimensioni 11x11. Quindi il primo centro del kernel è cell (6,6) e l'ultimo del kernel centrale nella prima riga è cell (6x222). Con stride-4 otterremo il centro del kernel nella riga sesta sono: cell on column: 6,10,14, ..., 222 e la semplice formulazione per il centro del kernel-k è nella colonna = 6+ (k -1) * 4 in modo che la colonna 222 sia il k-esimo centro = (222-6) / 4 +1 = 55.

4
Nota che 48 * 48 * 55 * 2 = 253440, quindi è possibile che abbiano avuto un refuso nel calcolo del numero di neuroni nel primo strato (moltiplicato per 48 anziché 55).
Tsiki,


@Firebug Questo è un uso interessante del tag [riferimenti]. Ho pensato che lo usiamo solo per domande che richiedono riferimenti. Ma forse mi sbagliavo. Lo usi in modo diverso?
ameba dice Ripristina Monica il

Risposte:


8

Dalla nota di Stanford su NN:

Esempio del mondo reale. Il Krizhevsky et al. l'architettura che ha vinto la sfida ImageNet nel 2012 ha accettato immagini di dimensioni [227x227x3]. Nel primo strato convoluzionale, utilizzava neuroni con dimensione del campo ricettivo F = 11, falcata S = 4 e nessuna imbottitura zero P = 0. Poiché (227 - 11) / 4 + 1 = 55 e poiché il livello Conv aveva una profondità di K = 96, il volume di output del livello Conv aveva dimensioni [55x55x96]. Ciascuno dei neuroni 55 * 55 * 96 in questo volume era collegato a una regione di dimensioni [11x11x3] nel volume di input. Inoltre, tutti i 96 neuroni in ciascuna colonna di profondità sono collegati alla stessa regione [11x11x3] dell'input, ma ovviamente con pesi diversi. Per inciso, se leggi il documento vero e proprio afferma che le immagini in input erano 224x224, il che è sicuramente errato perché (224 - 11) / 4 + 1 non è chiaramente un numero intero. Ciò ha confuso molte persone nella storia di ConvNets e si sa poco di quello che è successo. La mia ipotesi migliore è che Alex abbia usato zero padding di 3 pixel extra che non menziona nel documento.

rif: http://cs231n.github.io/convolutional-networks/

Queste note accompagnano la classe CS231n di Stanford CS: reti neurali convoluzionali per il riconoscimento visivo. Per domande / dubbi / segnalazioni di bug riguardanti contattare Justin Johnson per quanto riguarda i compiti, oppure contattare Andrej Karpathy per quanto riguarda le note del corso


È possibile dare credito nominando l'autore di quelle note?
Silverfish,

Gli autori sono chiaramente autoreferenziati nelle note, vedi cs231n.github.io
Bacon

2
Sebbene siano chiaramente indicati se segui il link, la citazione appare anche qui, quindi dovrebbe esserci credito dato anche qui. Questo è in parte per gentile concessione, ma anche dal momento che il collegamento potrebbe smettere di funzionare (ad esempio se il materiale viene rimosso / paywalled / spostato in un nuovo indirizzo). Sfortunatamente abbiamo un grave problema con "link rot" su questo sito - mentre intendiamo servire come repository a lungo termine di risposte di alta qualità a domande statistiche, molte delle nostre risposte più vecchie sono state rese obsolete da link che non funzionano più . Quindi è generalmente più sicuro cercare di rendere le risposte il più autonome possibili.
Silverfish,

0

Questo documento è davvero confuso. Prima di tutto, la dimensione di input delle immagini non è corretta 224x224 non fornisce un output di 55. Quei neuroni sono semplicemente come pixel raggruppati in uno, quindi l'output è un'immagine 2D di valori casuali (valori dei neuroni). Quindi in pratica il numero di neuroni = larghezza x altezza x profondità, non ci sono segreti per capirlo.

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.