Jedyną różnicą jest wymiarowość przestrzeni wejściowej. Dane wejściowe dla warstwy splotowej mają następujący kształt:
input_shape = (rozmiar_wsadu, wymiary_wejściowe, kanały)
Kształt wejściowy dla conv1D : (batch_size, W, kanały)
Przykład: 1 sekundowy stereofoniczny sygnał głosowy próbkowany przy częstotliwości 44100 Hz, kształt: (batch_size, 44100,2)
Kształt wejściowy dla conv2D : (batch_size, (H, W), kanały)
Przykład: obraz RGB 32x32, kształt: (rozmiar partii, 32,32,3)
Kształt wejściowy dla conv3D : (batch_size, (H, w, D), kanały)
Przykład (trudniejsze): 1 sekundowe wideo 32x32 obrazów RGB przy 24 fps, kształt: (batch_size, 32,32,3,24)
Co to jest kanał?
Kluczową sprawą jest zastanowienie się, co kanał oznacza dla naszych danych wejściowych. Warstwa splotowa stosuje różne filtry dla każdego kanału, dlatego ciężary warstwy konwekcyjnej mają następujący kształt:
(kernel_size,num_channels,num_filter_per_channels)
Przykład:
Warstwa splotowa z 12 filtrami i kwadratową matrycą jądra o rozmiarze 3. Ta warstwa zastosuje 12 różnych filtrów dla każdego kanału. W podanych wcześniej przykładach:
1 sekundowy stereofoniczny sygnał głosowy próbkowany przy częstotliwości 44100 Hz, rozmiar jądra = 3
12 x 2 = 24 filtry jednowymiarowe, 12 filtrów dla każdego kanału
Weigths shape: (3, 2, 12)
Obraz RGB 32x32, rozmiar jądra = (3,3)
12 x 3 = 36 filtrów dwuwymiarowych, 12 filtrów dla każdego kanału
Weights shape: (3, 3, 3, 12)
1 sekundowe wideo 32x32 obrazów RGB przy 24 fps, kernel_size = (3,3,3)
24 x 12 = 288 trójwymiarowych filtrów, 12 filtrów dla każdego kanału
Weights shape: (3, 3, 3, 24, 12)
Dlatego decydowanie o tym, co oznacza kanał, jest bardzo ważne, ponieważ każdy kanał ma swój własny zestaw filtrów. W przypadku pierwszych przykładów wydaje się proste stwierdzenie, że sygnały stereo i obrazy RGB są różnymi kanałami ... tak naprawdę są one tak nazywane (kanały stereo, kanały RGB). W przykładzie wideo jest bardziej niejednoznaczny ... Ustawienie wideo jako wejścia 3D z wymiarem czasowym jako kanałem może nie być najlepszą opcją, ponieważ w ten sposób kolejność wyświetlania klatek czasowych nie ma znaczenia (wyniki dla filtry każdego kanału są sumowane), co powoduje utratę wewnętrznej dynamiki czasowej danych wejściowych. Jednym lepszym podejściem (w zależności od aplikacji) jest przetwarzanie obrazów RGB ze zwojami 2D w rekurencyjnej sieci neuronowej. To samo dzieje się z sygnałem głosowym
Należy zauważyć, że sygnał o wymiarze wejściowym D można traktować jako sygnał o wymiarze D + 1 z jednym kanałem, ale wynikowa przestrzeń cech może być mniej reprezentatywna / przydatna :
(44100,2) --> expand_dimension(axis=-1)--> ((44100,2),1)
Kod Keras obsługujący przykłady
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))