La seule différence est la dimensionnalité de l'espace d'entrée. L'entrée pour une couche convolutionnelle a la forme suivante:
input_shape = (batch_size, input_dims, canaux)
Forme d'entrée pour conv1D : (batch_size, W, canaux)
Exemple: 1 seconde de signal vocal stéréo échantillonné à 44100 Hz, forme: (batch_size, 44100,2)
Forme d'entrée pour conv2D : (batch_size, (H, W), canaux)
Exemple: image RVB 32x32, forme: (batch_size, 32,32,3)
Forme d'entrée pour conv3D : (batch_size, (H, w, D), canaux)
Exemple (plus délicat): vidéo d'une seconde d'images RVB 32x32 à 24 ips, forme: (batch_size, 32,32,3,24)
Qu'est-ce qu'une chaîne?
L'essentiel est de réfléchir à ce que le canal signifie pour nos données d'entrée. La couche convolutionnelle applique des filtres différents pour chaque canal, ainsi, les poids de la couche conv ont la forme suivante:
(kernel_size,num_channels,num_filter_per_channels)
Exemple:
Couche convolutionnelle avec 12 filtres et matrice à noyau carré de taille 3. Cette couche appliquera 12 filtres différents pour chaque canal. Dans les exemples donnés précédemment:
1 seconde signal vocal stéréo échantillonné à 44100 Hz, kernel_size = 3
12 x 2 = 24 filtres unidimensionnels, 12 filtres pour chaque canal
Weigths shape: (3, 2, 12)
Image RVB 32x32, kernel_size = (3,3)
12 x 3 = 36 filtres bidimensionnels, 12 filtres pour chaque canal
Weights shape: (3, 3, 3, 12)
1 seconde vidéo d'images RVB 32x32 à 24 ips, kernel_size = (3,3,3)
24 x 12 = 288 filtres tridimensionnels, 12 filtres pour chaque canal
Weights shape: (3, 3, 3, 24, 12)
Il est donc très important de décider ce que signifie un canal, car chaque canal a son propre ensemble de filtres. Pour les premiers exemples, il semble simple de décider que les signaux stéréo et les images RVB sont des canaux différents ... ils sont communément appelés ainsi (canaux stéréo, canaux RVB). Dans l'exemple vidéo, c'est plus ambigu ... Définir une vidéo comme une entrée 3D avec la dimension temporelle comme canal peut ne pas être la meilleure option car de cette façon, l'ordre dans lequel les images temporelles arrivent n'a pas d'importance (les sorties pour les filtres de chaque canal se résument) entraînant une perte de la dynamique temporelle intrinsèque des données d'entrée. Une meilleure approche (selon l'application) consiste à traiter les images RVB avec des convolutions 2D dans un réseau neuronal récurrent. La même chose se produit avec le signal vocal,
Il est important de noter qu'un signal avec une dimension d'entrée D peut être considéré comme un signal de dimension D + 1 avec un canal, mais l'espace caractéristique résultant peut être moins représentatif / utile :
(44100,2) --> expand_dimension(axis=-1)--> ((44100,2),1)
Code Keras supportant les exemples
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))