CNN
CNN的基本原理是把图像转化为一个具有多个维度的数值矩阵,一般是三维(RGB),然后再设定若干个过滤器(卷积核),它们一般是比原图像要小的数值矩阵。把这些过滤器逐一在数值矩阵中进行局部“扫描”,算出一个结果,计算过程是将对应位置的数值做相乘,再相加。这就能得出另外一个比原数值矩阵更小的矩阵,是一个提取特征的过程,也就是卷积层。
接下来是激励层,对卷积后的数值进行非线性的变换,目的在于是其具有非线性的属性,使得多层的计算并不保持在同一个线性维度上。也就是激活函数,通常使用relu。
而图像两个像素之间的数值的差不多的,导致卷积后的数值也有相似,这说明卷积后的大部分信息是冗余的,因此才有池化层的存在。它主要是对卷积后的矩阵进行局部的冗余去除,一般分为平均池化(求平均值)和最大池化(求最大值)。
之后便是重复卷积层池化层的过程,使得数值矩阵越来越小,但是维度越来越多(感觉有点像在反向套娃~)。
Flatten操作:将二维的向量,拉直为一维的向量,从而可以放入下一层的神经网络中。
最后是全连接层,通常在CNN的尾部进行重新拟合,减少特征信息的损失。
用Keras搭建模型
Keras 的核心数据结构是 model,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠,它可以直接通过如下方式搭建:
from keras.models import Sequential
model = Sequential()
对于上面提到的CNN网络,在Keras操作中,可以简单地使用 .add() ,将需要搭建的神经网络的layer堆砌起来,像搭积木一样:
model.add(Conv2D(64, (3, 3), padding = "same", activation = "tanh", input_shape = input_dim))# 卷积层
model.add(MaxPool2D(pool_size=(2, 2)))# 最大池化
model.add(Conv2D(128, (3, 3), padding = "same", activation = "tanh")) #卷积层
model.add(MaxPool2D(pool_size=(2, 2))) # 最大池化层
model.add(Dropout(0.1))
model.add(Flatten()) # 展开
model.add(Dense(1024, activation = "tanh"))
model.add(Dense(20, activation = "softmax")) # 输出层:20个units输出20个类的概率
model.add(Conv2D(64, (3, 3), padding = "same", activation = "tanh", input_shape = input_dim))# 卷积层
model.add(MaxPool2D(pool_size=(2, 2)))# 最大池化
model.add(Conv2D(128, (3, 3), padding = "same", activation = "tanh")) #卷积层
model.add(MaxPool2D(pool_size=(2, 2))) # 最大池化层
model.add(Dropout(0.1))
model.add(Flatten()) # 展开
model.add(Dense(1024, activation = "tanh"))
model.add(Dense(20, activation = "softmax")) # 输出层:20个units输出20个类的概率
Dropout()函数的作用是减少过拟合,在深度学习训练过程中,对于神经网络训练单元,按照一定的概率将其从网络中暂时移除,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
训练出结果后,用model.predict()预测语音对应的标签。