Answers:
唯一的区别是输入空间的维度。卷积层的输入具有以下形状:
input_shape =(批处理大小,input_dims,通道)
conv1D的输入形状:(batch_size,W,channels)
示例:1秒以44100 Hz采样的立体声信号,形状:(batch_size,44100,2)
conv2D的输入形状:(batch_size,(H,W),channels)
示例:32x32 RGB图像,形状:(batch_size,32,32,3)
conv3D的输入形状:(batch_size,(H,w,D),channels)
示例(比较棘手):1秒视频,以24 fps播放32x32 RGB图像,形状:(batch_size,32,32,3,24)
什么是频道?
关键是要考虑通道对我们的输入数据意味着什么。卷积层对每个通道应用不同的滤镜,因此,卷积层的权重具有以下形状:
(kernel_size,num_channels,num_filter_per_channels)
例:
卷积层具有12个过滤器和大小为3的平方核矩阵。该层将为每个通道应用12个不同的过滤器。在前面给出的示例中:
1秒立体声语音信号以44100 Hz采样,kernel_size = 3
12 x 2 = 24个一维滤波器,每个通道12个滤波器
Weigths shape: (3, 2, 12)
32x32 RGB图像,kernel_size =(3,3)
12 x 3 = 36个二维滤波器,每个通道12个滤波器
Weights shape: (3, 3, 3, 12)
1秒以24 fps播放32x32 RGB图像的视频,kernel_size =(3,3,3)
24 x 12 = 288个三维滤镜,每个通道12个滤镜
Weights shape: (3, 3, 3, 24, 12)
因此,确定通道的含义非常重要,因为每个通道都有自己的一组过滤器。对于第一个示例,似乎很容易确定立体声信号和RGB图像是不同的通道...它们的确通常这样命名(立体声通道,RGB通道)。在视频示例中,它更加模棱两可...将视频设置为以时间维度为通道的3D输入可能不是最佳选择,因为那样,时间帧的顺序无关紧要(对每个通道的滤波器进行求和),从而导致输入数据的固有时间动态丢失。一种更好的方法(取决于应用程序)是在循环神经网络中以2D卷积处理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))