Der einzige Unterschied ist die Dimensionalität des Eingaberaums. Die Eingabe für eine Faltungsschicht hat die folgende Form:
input_shape = (batch_size, input_dims, channel)
Eingabeform für conv1D : (batch_size, W, Kanäle)
Beispiel: 1 Sekunde Stereo-Sprachsignal mit 44100 Hz, Form: (batch_size, 44100,2)
Eingabeform für conv2D : (batch_size, (H, W), Kanäle)
Beispiel: 32x32 RGB-Bild, Form: (batch_size, 32,32,3)
Eingabeform für conv3D : (batch_size, (H, w, D), Kanäle)
Beispiel (kniffliger): 1 Sekunde Video von 32x32 RGB-Bildern mit 24 fps, Form: (batch_size, 32,32,3,24)
Was ist ein Kanal?
Der Schlüssel ist, darüber nachzudenken, was der Kanal für unsere Eingabedaten bedeutet. Die Faltungsschicht wendet für jeden Kanal unterschiedliche Filter an, daher haben die Gewichte der Faltungsschicht die folgende Form:
(kernel_size,num_channels,num_filter_per_channels)
Beispiel:
Faltungsschicht mit 12 Filtern und einer quadratischen Kernelmatrix der Größe 3. Diese Schicht wendet 12 verschiedene Filter für jeden Kanal an. In den zuvor angegebenen Beispielen:
1 Sekunde Stereo-Sprachsignal mit 44100 Hz abgetastet, kernel_size = 3
12 x 2 = 24 eindimensionale Filter, 12 Filter für jeden Kanal
Weigths shape: (3, 2, 12)
32x32 RGB-Bild, kernel_size = (3,3)
12 x 3 = 36 zweidimensionale Filter, 12 Filter für jeden Kanal
Weights shape: (3, 3, 3, 12)
1 Sekunde Video von 32x32 RGB-Bildern mit 24 fps, kernel_size = (3,3,3)
24 x 12 = 288 dreidimensionale Filter, 12 Filter für jeden Kanal
Weights shape: (3, 3, 3, 24, 12)
Daher ist es sehr wichtig zu entscheiden, was ein Kanal bedeutet, da jeder Kanal seine eigenen Filter hat. Für die ersten Beispiele scheint es einfach zu sein, zu entscheiden, dass die Stereosignale und die RGB-Bilder unterschiedliche Kanäle sind ... sie werden üblicherweise so genannt (Stereokanäle, RGB-Kanäle). Im Videobeispiel ist es mehrdeutig ... Das Festlegen eines Videos als 3D-Eingabe mit der zeitlichen Dimension als Kanal ist möglicherweise nicht die beste Option, da auf diese Weise die Reihenfolge der zeitlichen Frames keine Rolle spielt (die Ausgaben für Die Filter jedes Kanals werden zusammengefasst. Dies führt dazu, dass die intrinsische zeitliche Dynamik der Eingabedaten verloren geht. Ein besserer Ansatz (je nach Anwendung) besteht darin, die RGB-Bilder mit 2D-Faltungen in einem wiederkehrenden neuronalen Netzwerk zu verarbeiten. Das gleiche passiert mit dem Sprachsignal,
Es ist wichtig zu beachten, dass ein Signal mit einer Eingangsdimension D als ein Signal mit einer D + 1-Dimension mit einem Kanal betrachtet werden kann, der resultierende Merkmalsraum jedoch möglicherweise weniger repräsentativ / nützlich ist :
(44100,2) --> expand_dimension(axis=-1)--> ((44100,2),1)
Keras-Code, der die Beispiele unterstützt
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))