🧱 Nota Bene — Padding nella profondità (dimensione )

Nella convoluzione 3D, il kernel ha dimensione e viene fatto scorrere lungo tutte e tre le dimensioni: profondità (), altezza (), larghezza ().

Se la profondità del kernel è tale da “sforare” i bordi del volume di input,
allora si applica un padding anche lungo la profondità, analogamente a quanto avviene per e .


Senza padding:

  • Il kernel può essere centrato solo dove entra completamente.
  • L’output ha profondità ridotta:
    (con stride = 1)

Con padding:

  • Si aggiunge padding sopra e sotto lungo (profondità).
  • Questo consente al kernel di scorrere anche ai bordi del volume.
  • L’output può mantenere la stessa profondità dell’input.

📌 Esempio:

  • Input:
  • Kernel:
  • Padding:

→ Il kernel può scorrere da a
→ Output:


🛠️ Conclusione:
Il padding in profondità è opzionale, ma fondamentale per mantenere l’allineamento tra input e output o per controllare la dimensione dell’output desiderato.

🎯 Nota Bene — Numero di Canali di Uscita ()

Sia nella convoluzione 2D che in quella 3D, il numero di canali di uscita è una scelta indipendente dalle dimensioni spaziali del filtro convoluzionale.

  • Per ottenere feature map in uscita, la rete apprende filtri distinti.
  • Ogni filtro convoluzionale ha dimensione:
    • In 2D:
    • In 3D:

🧠 Il numero di filtri (cioè ) determina la profondità dell’output,
ma non dipende dalle dimensioni spaziali del filtro, che controllano invece l’estensione locale dell’analisi sull’input.

🧭 Nota Bene — Differenza tra dati e

Quando si lavora con reti convoluzionali, è fondamentale distinguere correttamente la struttura dell’input, soprattutto nel caso tridimensionale.


Caso 1 — Dati 2D multicanale → Forma:

  • Ogni punto contiene un vettore di valori (es. RGB).
  • Può essere visto come immagini 2D, una per ciascun canale.

✅ Convoluzione 2D → Filtro:


Caso 2 — Dati 3D multicanale → Forma:

Quando si lavora con un input 3D multicanale di forma ,
ci sono due modi naturali di raggruppare i dati:


  1. Raggruppamento per canale (scelto dalle CNN 3D):

    • Si fissa un canale .
    • L’intero volume tridimensionale relativo a quel canale è trattato come un blocco 3D.
    • In totale: blocchi 3D separati.

    Questo è il punto di vista usato nei layer convoluzionali 3D:
    l’input è rappresentato come un tensore 4D
    (canali profondità altezza larghezza).


  1. Raggruppamento per profondità:

    • Si fissa un indice di profondità .
    • Ogni slice corrisponde a un frame 2D di dimensione con canali.
    • In totale: frame 2D multicanale, come nei video.

    Questo punto di vista è utile quando rappresenta il tempo,
    o una sequenza ordinata di dati (frame, istanti, scansioni).


📌 Quando usare ciascuna rappresentazione?

  • Se rappresenta una dimensione spaziale o temporale reale
    (es. profondità, tempo nei video, asse nelle TAC),
    si usa il raggruppamento per canale → convoluzione 3D standard.

  • Se invece è una proprietà interna al canale (es. spettro, feature astratte),
    può essere trattato come parte dei canali:
    si ridefinisce e si può usare convoluzione 2D.

ℹ️ Profondità dell’output nella convoluzione 3D

In una convoluzione 3D, ogni canale di output genera una feature map tridimensionale,
di forma: .

La profondità dell’output dipende da:

  • profondità dell’input:
  • dimensione del kernel lungo la profondità:
  • padding lungo la profondità:
  • stride lungo la profondità:

🧮 Formula generale per la profondità dell’output:


📌 Quindi:

  • Se non si usa padding ():

    👉 L’output avrà profondità ridotta rispetto all’input.

  • Se si desidera che l’output abbia la stessa profondità dell’input (),
    allora bisogna usare il **padding :


✅ Il numero di canali di output è indipendente dalla profondità:
può essere scelto liberamente, come avviene nella convoluzione 2D.

Differenza tra e

❗ È importante ricordare che nella convoluzione 3D:

  • è la profondità dell’input (cioè quante “slice” ha ogni blocco 3D)
  • è la profondità del kernel, ovvero quanto “spesso” è ciascun kernel 3D

Non è necessario che .

Al contrario:

  • Spesso , così il kernel può scorrere lungo la profondità
  • Questo consente di catturare pattern locali nel tempo (es. video o segnali volumetrici)

📌 Analogamente a quanto avviene per altezza e larghezza (, ), anche agisce come una finestra mobile che si sposta lungo l’asse della profondità.

Questo approccio permette di generare un output tridimensionale con profondità (a meno che non si usi padding “same” per mantenere ).