卷积层
Conv1D
为1D卷积层,该层创建一个卷积核,以单个空间或时间维度上的层输入进行卷积,生成输出张量。构造方法为:
keras.layers.Conv1D(
filters,
kernel_size,
strides=1,
padding='valid',
data_format='channels_last',
dilation_rate=1,
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None)
其中各个参数的意义如下。
filters
,输出空间的维度,卷积中滤波器的输出数量。kernel_size
,1D卷积窗口的长度。strides
,卷积的步长。padding
,如何填充输入,可取same
(输入与输出有相同的长度)、valid
(不填充)、causal
(因果卷积)。dilation_rate
,膨胀卷积的膨胀率。
Conv1D
的输入形状为3D张量,具体为(batch_size, steps, input_dim)
。输出形状也为3D张量,具体为(batch_size, new_steps, filters)
。
相似的还有Conv2D
,常用于对图像的空间卷积,卷积步长接受一个由两个整数组成的元组;Conv3D
,常用于对立体空间的卷积,卷积步长接受一个由三个整数组成的元组。从这三个卷积层,还有几个相应的功能扩展层,如SeparableConv1D
和SeparableConv2D
,用于优先执行深度方向空间卷积;DepthwiseConv2D
用于执行深度可分离2D卷积;Conv2DTranspose
和Conv3DTranspose
用于执行反卷积。
卷积的根本目的在于从输入中提取特征。卷积在特征抽取的时候,会使用卷积核大小的矩阵在输入上移动,形成输入形状除以步长的大小的矩阵,例如输入大小为(128, 128, 3)
,步长为2,输出空间维度为32,那么输出的特征矩阵大小就为(64, 64, 32)
。卷积层层叠之后,可以将每一层提取的特征继续细化,形成更加详细的特征。在整个网络中,特征矩阵的深度会逐步增大,而特征矩阵每一层的尺寸则会逐步减小,这是所有卷积神经网络的模式。
卷积层输入张量和输出张量的尺寸可以按照以下公式计算。
$$height_{out}=\frac{(height_{in}-height_{kernel}+2 \times padding)}{stride}+1$$
$$width_{out}=\frac{(width_{in}-width_{kernel}+2 \times padding)}{stride}+1$$
综合起来就是:
$$Q=\left[\frac{n+2p-f}{s}+1\right]$$
其中:
- \(Q\)为卷积运算后张量的大小。
- \(n\)为输入张量的尺寸。
- \(f\)为卷积核的大小。
- \(p\)为所要填充的像素值。
- \(s\)为卷积步长。
- 计算结束后要向下取整。