La única diferencia es la dimensionalidad del espacio de entrada. La entrada para una capa convolucional tiene la siguiente forma:
input_shape = (lote_tamaño, input_dims, canales)
Forma de entrada para conv1D : (batch_size, W, canales)
Ejemplo: señal de voz estéreo de 1 segundo muestreada a 44100 Hz, forma: (tamaño de lote, 44100,2)
Forma de entrada para conv2D : (batch_size, (H, W), canales)
Ejemplo: imagen RGB 32x32, forma: (tamaño de lote, 32,32,3)
Forma de entrada para conv3D : (tamaño de lote, (H, w, D), canales)
Ejemplo (más complicado): video de 1 segundo de imágenes RGB de 32x32 a 24 fps, forma: (tamaño de lote, 32,32,3,24)
¿Qué es un canal?
La clave es pensar qué significa el canal para nuestros datos de entrada. La capa convolucional aplica diferentes filtros para cada canal, por lo tanto, los pesos de la capa conv tienen la siguiente forma:
(kernel_size,num_channels,num_filter_per_channels)
Ejemplo:
Capa convolucional con 12 filtros y matriz de núcleo cuadrado de tamaño 3. Esta capa aplicará 12 filtros diferentes para cada canal. En los ejemplos dados anteriormente:
Señal de voz estéreo de 1 segundo muestreada a 44100 Hz, kernel_size = 3
12 x 2 = 24 filtros unidimensionales, 12 filtros para cada canal
Weigths shape: (3, 2, 12)
Imagen RGB 32x32, kernel_size = (3,3)
12 x 3 = 36 filtros bidimensionales, 12 filtros para cada canal
Weights shape: (3, 3, 3, 12)
1 segundo video de imágenes RGB de 32x32 a 24 fps, kernel_size = (3,3,3)
24 x 12 = 288 filtros tridimensionales, 12 filtros para cada canal
Weights shape: (3, 3, 3, 24, 12)
Por lo tanto, decidir qué significa un canal es muy importante, ya que cada canal tiene su propio conjunto de filtros. Para los primeros ejemplos, parece sencillo decidir que las señales estéreo y las imágenes RGB son canales diferentes ... comúnmente se denominan así (canales estéreo, canales RGB) de hecho. En el ejemplo de video, es más ambiguo ... Configurar un video como una entrada 3D con la dimensión temporal como canal puede no ser la mejor opción ya que de esa manera, el orden en que vienen los cuadros temporales no importa (las salidas para los filtros de cada canal se resumen) lo que resulta en la pérdida de la dinámica temporal intrínseca de los datos de entrada. Un mejor enfoque (dependiendo de la aplicación) es procesar las imágenes RGB con convoluciones 2D en una red neuronal recurrente. Lo mismo sucede con la señal de voz,
Es importante tener en cuenta que una señal con una dimensión de entrada D puede considerarse como una señal de dimensión D + 1 con un canal, pero el espacio de función resultante puede ser menos representativo / útil :
(44100,2) --> expand_dimension(axis=-1)--> ((44100,2),1)
Código Keras apoyando los ejemplos
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))