CNNtensorflowcausaldilated

1. 数学层面

1.1 连续信号卷积

数学意义上的卷积表达为:
卷积层笔记 - 图1
此时的卷积发生在两个无限长的信号上. 卷积算符号![](https://cdn.nlark.com/yuque/__latex/3389dae361af79b04c9c8e7057f60cc6.svg#card=math&code=%2A&id=pskus)的定义是卷积和傅立叶变换有特殊的关系, 时域的卷积对应了频域的乘法

1.2 离散信号卷积

连续域上的卷积推广到离散情况:
卷积层笔记 - 图2
上式描述的也是无限长信号的卷积, 同样的, 离散域的卷积和离散傅立叶变换也有类似的关系, 即离散时域的卷积对应了dft域上的哈达玛积(Hadamard product), 严格来说dft对应的是圆卷积.

1.3 有限长序列的卷积

对于有限长的序列套用上面的公式, 可以得到两个序列的一维线性卷积, 由于全0的部分没有意义, 只选择两个序列有交叠的部分, 因此m长的序列和n长的序列卷积的结果有(m+n-1)长.例如:
卷积层笔记 - 图3
注意到此时的卷积[1,2,3]左右是各补了两个0的, 这种行为被称之为padding, padding的行为可以发生在左边可以发生在右边可以左右都有, 它影响输出的序列长度.

2. 算法层面

算法层面需要开拓卷积更多的特性. 本质上都是卷积操作的一些简单的推广和特化.

2.1 高维度卷积

1.3中显示的是1维的卷积, 它可以被推广到高维场景, 和1d情况类似, 2d卷积的2维卷积核在一个矩阵上滑动, 得到一个矩阵输出. 比如下面两个矩阵卷积, b称为卷积核.
卷积层笔记 - 图4
卷积层笔记 - 图5
注意此时没有做padding, 卷积的结果变小了. 很容易就能得到一个mn的矩阵经过一个pq的卷积核,没有padding的情况下, 得到的输出大小为(m-p+1)*(n-q+1).
依照相同的思路卷积运算可以扩展到任意维.

2.2 步长(stride)

有时候卷积运算可以不必一格一格的滑动, 为了降低输出的规模, 可以对卷积输出进行降采样. 步长为2的卷积输出相当于卷积步长为1的结果进行隔1抽取. 当然2d的卷积可以在两个方向上各自定义步长.

2.3 padding

padding决定是否需要输出结果的最左边和最右边的结果. 卷积最完整的结果, 对于m长序列卷积n长的卷积核, 结果是m+n-1长的.有几种padding方案, 一种是对于该结果剪除左右各n-1个点,得到的是m-n+1长的结果; 一种是左右只剪除(n-1)的一半(此时有个奇偶的问题), 得到m长的结果; 当然还有完全不padding保留m+n-1长序列. 还有一种特殊的padding方案, 是只剪除右侧的n-1, 得到的也是m长的结果, 此时称之为因果卷积.

2.4 空洞卷积(dilated convolution)

空洞卷积又叫膨胀卷积或者扩张卷积, 空洞卷积是一种特殊的卷积, 它的卷积核是稀疏的, 比如一个膨胀率3的长度为3的空洞卷积, 卷积核是卷积层笔记 - 图6. 显然任意维的卷积都有空洞卷积, 每个维度上都有膨胀率.

2.5 高维度数据的低纬度卷积

最后一个问题是是否可以在矩阵上应用一维卷积呢, 答案是可以给卷积核扩展一个维度, 这个维度的长度与参与卷积的数据一致, 卷积操作不会应用在这个维度上. 比如一个23矩阵卷积一个长度为2的卷积核(注意此时的卷积核大小是22, 但是是1d卷积长度是2), 没有padding的情况下表现为:
卷积层笔记 - 图7
卷积层笔记 - 图8

注意1d卷积结束得到的是一个一维的序列, 而不是矩阵, 尽管参与卷积的数据和卷积核都是矩阵.
按照上述的方法可以推广到m维数据上的n d卷积(m>=n) 而且可以任意指定其中的m个维度参与卷积. 当然这种卷积也可以加入步长和膨胀卷积以及各种padding, 组合成一个看起来很复杂的卷积操作.

3. tensorflow层面

tnesorflow的卷积层基本上考虑了上述的全部情况, 它可以定义出来一个足够复杂的卷积操作.

3.1 Conv1d 层

Conv1d 层由keras.layers.Conv1D()函数返回

  1. 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)

可以灌入这个Conv1d layer的数据最少是三维的张量, 其中最后一个维度称为输特征维度(inputdim), 有时候也叫通道(channels), 这个维度决定了卷积核的厚度,卷积核在这个维度并不会滑动, 这个维度就是2.5中说到的卷积核扩展的维度; 倒数第二个维度称为steps, 这个维度是卷积核滑动的维度, Conv1d运算只有一个滑动的维度; 倒数第三个维度和其他前面的全部维度都不参与卷积, 对于一般的网络来说, 这个维度是batchsize.
参数说明:
filters: 滤波器个数, 也就是说卷积核个数, Conv1d层可以指定多个卷积核, 由于多个卷积核作用额外产生的维度在输出的时候会被填补在最后一个维度的位置(原来的通道维度因为卷积核的扩展被消除了);
kernel_size: 卷积核尺寸, 由于是1d卷积, kernel_size只需要指定一个数, 实际的卷积核的大小是1kernel_sizeinput_dim的;
strides: 默认是步长1, 可以指定为单个整数或者单个整数的list和tuple;
padding: 指定padding方式, “valid”, “causal” 或 “same” 之一 , 倒数第二个输出维度的大小受到padding的影响, 令倒数第二个输出维度叫new_steps. “valid”表示不填充, 此时的new_steps=steps-kernel_size+1, “causal”表示因果卷积, 此时的new_steps=steps, “same”表示左右均衡的padding, 此时kernel_size最好是个奇数, 如果是偶数,左边会比右边多padding一个0, 此时的new_steps=steps;
data_format: 它默认是’channels_last’, 还可以是“channels_first”,如果是后者, 前面提到的step维和channel维会调换位置;
dilation_rate: 一个正整数, 表示膨胀卷积的膨胀率, 如果不实用膨胀卷积,这个值是默认的1, keras额外提到膨胀卷积和stride不兼容, 也就是说不支持膨胀卷积的同时带有stride不等于1的情况, 原因是这样的话有部分值无法参与卷积,网络感受野是异常的;
activation: 卷积层输出的激活函数, 默认是线性激活
use_bias: 激活之前是否添加偏置向量, 默认是添加;
kernel_initializer: 权值矩阵的初始化器;(tip: keras的初始化器可以是任意的输入为(shape和dtype)输出为shape大小张量的函数)
bias_initializer: 偏置向量的初始化器;
kernel_regularizer: 权值矩阵上的正则化器;(tip:keras的正则化器可以是任意的输入一个矩阵返回一个损失贡献张量(大小为1)的函数, 正则化器会在训练时为每一个层计算出一个额外的损失,加入到总损失中, 共同作用梯度下降; 正则化器也可以继承keras.regularizers.Regularizer进行子类化)
bias_regularizer: 偏置向量的正则化器;
activity_regularizer: 激活输出的正则化器;
kernel_constraint: 主权重矩阵的约束器;(tip: 自定义的约束器可以继承constraint类, 它的__call
方法输入一个张量, 输出等大的张量)
bias_constraint: 偏置向量的约束器;

3.2 Conv2d 层

Conv2d 层对象由keras.layers.Conv2D()函数返回, 它的用法基本和Conv1d 层雷同, 只是它的step维被替换成了行列,即是说rows*cols.
输入参数中和1d不同的地方在于dilation_rate是一对数,分别指定rows和cols上的膨胀率, stride是一对数指定rows和cols维度上的步长.
Conv3d以类似的方法推广

4. 因果卷积

因果卷积作为一种特殊的padding方式, 在算法上来说具有一些和其他padding不同的意义, 那就是它适应时序数据, 当前时刻参与卷积的只有当前的数据和之前的数据, 没有之后的数据, 也就是说这个卷积运算是因果的.
aec中的fir模型其实就是因果卷积, 加在参考信号上的fir滤波器(滤波器有时候也叫做卷积核)就是以因果卷积的方式作用的.
因果卷积的感受野是当前和之前若干帧的数据, 如果叠加了多个因果卷积层, 那么感受野会线性的增长. 多层的膨胀因果卷积可以大幅度的提高感受野.

5. 卷积和循环层的联系

卷积层和rnn层都可以处理时序数据, 但是卷积层的感受野总是有限的, 它类似于fir滤波器, 而rnn层(各种rnn层)感受野是之前所有的数据, 它类似于iir滤波器, 时序信号一开始的值也能影响很久以后的网络输出.