卷积神经网络(CNN)是深度学习中常用的网络架构,在智能语音中也不例外,比如语音识别。语音中是按帧来处理的,每一帧处理完就得到了相对应的特征向量,常用的特征向量有MFCC等,通常处理完一帧得到的是一个39维的MFCC特征向量。假设一段语音有N帧,处理完这段语音后得到的是一个39行N列(行表示特征维度,列表示帧数)的矩阵,这个矩阵是一个平面,是CNN的输入。应用在图像问题上的CNN通常是二维卷积(因为图像有RGB三个通道),而语音问题上的CNN输入是一个矩阵平面,可以用一维卷积。本文就讲讲一维卷积是怎么处理的。
所谓一维卷积是指卷积核只在一个方向上移动。具体到语音上,假设一段语音提取特征后是一个M行N列(M表示特征维度,N表示帧数)的矩阵平面,卷积核要在帧的方向上从小到大移动,下图给出了示意。
卷积核也是一个矩阵(J行K列)。由于卷积核只在一个方向上移动,要把所有的特征值都覆盖到,必须卷积核的行数要等于特征值矩阵的行数,即J = M,所以描述卷积核时只需要知道kernel size(即多少列)和 kernel count(即多少个kernel)。
知道kernel size和kernel count后,再来看一维卷积的计算过程,看一个输入矩阵经过一维卷积后得到的是什么。设定padding模式为same(卷积处理后的输出矩阵与输入矩阵有相同的列数),stride为1(kernel一次只移动一格)。假定输入矩阵为3x5的矩阵,kernel个数为2,kernel size为3,所以kernel是一个3x3的矩阵。输入矩阵和两个kernel矩阵的具体值如下图,两个kernel的bias分别是2和3。
先看第一个卷积核与输入矩阵的计算。由于padding模式是same,输入矩阵左右都要pad。Kernel size是3,所以输入矩阵左右都要补充1列(用0填充),补充后输入矩阵变成了下图。
做卷积时先从左边的padding处开始,具体如下图,相对应的位置相乘再相加后,再加上bias就可以了,计算出值为10(0 x 1 + 1 x 0 + 4 x 0 + 0 x 0 + 2 x 1 + 5 x 0 + 0 x 0 + 3 x 0 + 6 x 1 + 2 = 10)。
把卷积核向帧增大方向(即向右)移动一格,如下图:
同样方法计算出值为17(1 x 1 + 4 x 0 + 7 x 0 + 2 x 0 + 5 x 1 + 8 x 0 + 3 x 0 + 6 x 0 + 9 x 1 + 2 = 17)。
经过4次移动后就到了右边的padding处,同样方法计算。最终得到的是一个1行5列的矩阵,如下图:
第二个kernel的卷积计算与第一个kernel计算一样,得到的也是一个1行5列的矩阵。如下图:
最终一个3x5的输入矩阵与kernel count为2、kernel size为3的卷积后得到的是一个2行5列的矩阵,如下图。
可以看出卷积后输入矩阵的列数不变,行数变为了kernel的个数(这是在padding模式为same、stride为1的case下,其他case行数依旧是kernel的个数,列数会变化,比如stride > 1 或者用上maxpooling后列数会减少,但卷积计算过程是一样的)。
以上就是一维卷积的处理过程,很简单的吧。