L'unica differenza è la dimensionalità dello spazio di input. L'input per un livello convoluzionale ha la forma seguente:
input_shape = (batch_size, input_dims, canali)
Forma di input per conv1D : (batch_size, W, canali)
Esempio: 1 secondo segnale vocale stereo campionato a 44100 Hz, forma: (batch_size, 44100,2)
Forma di input per conv2D : (batch_size, (H, W), canali)
Esempio: immagine RGB 32x32, forma: (batch_size, 32,32,3)
Forma di input per conv3D : (batch_size, (H, w, D), canali)
Esempio (più complicato): 1 secondo video di immagini RGB 32x32 a 24 fps, forma: (batch_size, 32,32,3,24)
Che cos'è un canale?
La cosa fondamentale è pensare a cosa significa il canale per i nostri dati di input. Lo strato convoluzionale applica filtri diversi per ciascun canale, quindi i pesi dello strato conv hanno la seguente forma:
(kernel_size,num_channels,num_filter_per_channels)
Esempio:
Livello convoluzionale con 12 filtri e matrice quadrata del kernel della dimensione di 3. Questo livello applicherà 12 filtri diversi per ciascun canale. Negli esempi forniti in precedenza:
1 secondo segnale vocale stereo campionato a 44100 Hz, kernel_size = 3
12 x 2 = 24 filtri monodimensionali, 12 filtri per ciascun canale
Weigths shape: (3, 2, 12)
Immagine RGB 32x32, kernel_size = (3,3)
12 x 3 = 36 filtri bidimensionali, 12 filtri per ciascun canale
Weights shape: (3, 3, 3, 12)
1 secondo video di immagini RGB 32x32 a 24 fps, kernel_size = (3,3,3)
24 x 12 = 288 filtri tridimensionali, 12 filtri per ciascun canale
Weights shape: (3, 3, 3, 24, 12)
Pertanto, decidere cosa significa un canale è molto importante, poiché ogni canale ha il proprio set di filtri. Per i primi esempi, sembra semplice decidere che i segnali stereo e le immagini RGB sono canali diversi ... sono comunemente chiamati così (canali stereo, canali RGB). Nell'esempio video, è più ambiguo ... L'impostazione di un video come input 3D con la dimensione temporale come canale potrebbe non essere l'opzione migliore poiché in questo modo l'ordine in cui arrivano i frame temporali non ha importanza (le uscite per i filtri di ciascun canale sono riassunti) con conseguente perdita della dinamica temporale intrinseca dei dati di input. Un approccio migliore (a seconda dell'applicazione) è quello di elaborare le immagini RGB con convoluzioni 2D in una rete neurale ricorrente. Lo stesso succede con il segnale vocale,
È importante notare che un segnale con una dimensione di ingresso D può essere considerato come un segnale di dimensione D + 1 con un canale, ma lo spazio caratteristica risultante può essere meno rappresentativo / utile :
(44100,2) --> expand_dimension(axis=-1)--> ((44100,2),1)
Codice di Keras che supporta gli esempi
from keras import Input, Conv1D, Conv2D, Conv3D
#1D
in_ = Input(shape=(44100,2))
layer = Conv1D(filters=12,kernel_size=3)
out_ = layer(in_)
print("Weights shape: {}".format(layer.get_weights()[0].shape))
#2D
in_ = Input(shape=(32,32,3))
layer = Conv2D(filters=12,kernel_size=3)
out_ = layer(in_)
print("Weights shape: {}".format(layer.get_weights()[0].shape))
#3D
in_ = Input(shape=(32,32,3,24))
layer = Conv3D(filters=12,kernel_size=3)
out_ = layer(in_)
print("Weights shape: {}".format(layer.get_weights()[0].shape))