卷积层

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,常用于对立体空间的卷积,卷积步长接受一个由三个整数组成的元组。从这三个卷积层,还有几个相应的功能扩展层,如SeparableConv1DSeparableConv2D,用于优先执行深度方向空间卷积;DepthwiseConv2D用于执行深度可分离2D卷积;Conv2DTransposeConv3DTranspose用于执行反卷积。

卷积的根本目的在于从输入中提取特征。卷积在特征抽取的时候,会使用卷积核大小的矩阵在输入上移动,形成输入形状除以步长的大小的矩阵,例如输入大小为(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\)为卷积步长。
  • 计算结束后要向下取整。