Разница лишь в размерности входного пространства. Вход для сверточного слоя имеет следующую форму:
input_shape = (batch_size, input_dims, channel)
Форма ввода для conv1D : (batch_size, W, каналы)
Пример: 1-секундный стереофонический голосовой сигнал, дискретизированный с частотой 44100 Гц, форма: (batch_size, 44100,2)
Форма ввода для conv2D : (batch_size, (H, W), каналы)
Пример: изображение RGB 32x32, форма: (batch_size, 32,32,3)
Форма ввода для conv3D : (batch_size, (H, w, D), каналы)
Пример (более хитрый): 1-секундное видео с изображениями RGB 32x32 при 24 кадрах в секунду, форма: (batch_size, 32,32,3,24)
Что за канал?
Главное - подумать о том, что канал означает для наших входных данных. Сверточный слой применяет разные фильтры для каждого канала, таким образом, весовые значения сверточного слоя имеют следующую форму:
(kernel_size,num_channels,num_filter_per_channels)
Пример:
Сверточный слой с 12 фильтрами и квадратной матрицей размером 3. Этот слой будет применять 12 различных фильтров для каждого канала. В приведенных ранее примерах:
1 секунда стереофонического речевого сигнала с частотой дискретизации 44100 Гц, kernel_size = 3
12 х 2 = 24 одномерных фильтра, 12 фильтров для каждого канала
Weigths shape: (3, 2, 12)
32x32 RGB-изображение, kernel_size = (3,3)
12 х 3 = 36 двумерных фильтров, 12 фильтров для каждого канала
Weights shape: (3, 3, 3, 12)
1 секунда видеоизображений 32x32 RGB со скоростью 24 кадра в секунду, размер ядра = (3,3,3)
24 х 12 = 288 трехмерных фильтров, 12 фильтров для каждого канала
Weights shape: (3, 3, 3, 24, 12)
Таким образом, очень важно решить, что означает канал, так как каждый канал имеет свой собственный набор фильтров. Для первых примеров кажется простым принять решение о том, что стереофонические сигналы и изображения RGB - это разные каналы ... они обычно так и называются (стереоканалы, каналы RGB). В примере с видео это более неоднозначно ... Установка видео в качестве 3D-входа с временным измерением в качестве канала может быть не лучшим вариантом, поскольку в этом случае порядок появления временных кадров не имеет значения (выходные данные для фильтры каждого канала суммируются), что приводит к потере внутренней временной динамики входных данных. Одним из лучших подходов (в зависимости от приложения) является обработка изображений RGB с двумерными свертками в рекуррентной нейронной сети. То же самое происходит с голосовым сигналом,
Важно отметить, что сигнал с входным измерением D можно рассматривать как сигнал измерения D + 1 с одним каналом, но результирующее пространство признаков может быть менее представительным / полезным :
(44100,2) --> expand_dimension(axis=-1)--> ((44100,2),1)
Код Keras, поддерживающий примеры
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))