A única diferença é a dimensionalidade do espaço de entrada. A entrada para uma camada convolucional tem a seguinte forma:
input_shape = (lote_size, input_dims, canais)
Formato de entrada para conv1D : (batch_size, W, canais)
Exemplo: sinal de voz estéreo de 1 segundo amostrado em 44100 Hz, formato: (batch_size, 44100,2)
Formato de entrada para conv2D : (batch_size, (H, W), canais)
Exemplo: imagem RGB de 32x32, formato: (batch_size, 32,32,3)
Formato de entrada para conv3D : (batch_size, (H, w, D), canais)
Exemplo (mais complicado): 1 segundo vídeo de imagens RGB de 32x32 a 24 qps, formato: (batch_size, 32,32,3,24)
O que é um canal?
O importante é pensar no que o canal significa para nossos dados de entrada. A camada convolucional aplica filtros diferentes para cada canal, portanto, os pesos da camada conv têm o seguinte formato:
(kernel_size,num_channels,num_filter_per_channels)
Exemplo:
Camada convolucional com 12 filtros e matriz quadrada de núcleo de tamanho 3. Esta camada aplicará 12 filtros diferentes para cada canal. Nos exemplos dados anteriormente:
1 segundo sinal de voz estéreo amostrado em 44100 Hz, kernel_size = 3
12 x 2 = 24 filtros unidimensionais, 12 filtros para cada canal
Weigths shape: (3, 2, 12)
Imagem 32x32 RGB, kernel_size = (3,3)
12 x 3 = 36 filtros bidimensionais, 12 filtros para cada canal
Weights shape: (3, 3, 3, 12)
1 segundo vídeo de imagens RGB 32x32 a 24 qps, kernel_size = (3,3,3)
24 x 12 = 288 filtros tridimensionais, 12 filtros para cada canal
Weights shape: (3, 3, 3, 24, 12)
Portanto, decidir o que significa um canal é muito importante, pois cada canal tem seu próprio conjunto de filtros. Para os primeiros exemplos, parece simples decidir que os sinais estéreo e as imagens RGB são canais diferentes ... eles são geralmente chamados assim (canais estéreo, canais RGB). No exemplo de vídeo, é mais ambíguo ... Definir um vídeo como uma entrada 3D com a dimensão temporal como canal pode não ser a melhor opção, pois, dessa forma, a ordem na qual os quadros temporais aparecem não importa (as saídas para os filtros de cada canal são somados), resultando na perda da dinâmica temporal intrínseca dos dados de entrada. Uma abordagem melhor (dependendo da aplicação) é processar as imagens RGB com convoluções 2D em uma rede neural recorrente. O mesmo acontece com o sinal de voz,
É importante observar que um sinal com uma dimensão de entrada D pode ser considerado como um sinal da dimensão D + 1 com um canal, mas o espaço de recurso resultante pode ser menos representativo / útil :
(44100,2) --> expand_dimension(axis=-1)--> ((44100,2),1)
Código Keras suportando os exemplos
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))