CNN快速卷积神经网络络来训练语音情感识别模型,测试集准确率高,用麦克风输入语音准确率低

定义dataloaders它将分批返回数据。在使鼡PyTorch和HDF5文件时我尝试过设置多个“num_workers”,但发现存在一个bug

我为我的模型设置了必要的辅助函数以便以后进行训练:

定义多个函数,以后可以使用这些函数训练继承这个类的PyTorch模型

这个函数在上述类的val_step函数中被用来确定验证dataloader上模型的%准确性。

并定义用于拟合/训练模型和在验证数據集上测试模型的主要功能

最后这是我们等待已久的简单CNN模型:

我使用了多个卷积层,正如我们之前的理论推断所建议的那样我们的模型使用了一些最大池化层,然后使用一个非常简单的全连接网络来进行实际的分类令人惊讶的是,这个架构后来表现得相当好甚至超過了我自己的预期。

几乎每个人都需要GPU来训练比一般的前馈神经网络更复杂的东西幸运的是,PyTorch让我们可以很容易地利用现有GPU的能力首先,我们将我们的cuda设备定义为关键词设备以便更容易访问:

我们还确保如果没有GPU, CPU会被使用。

这可以帮助提高你的训练速度(如果你的输入在夶小/形状上没有变化)

显然你可以“告诉”PyTorch在一次又一次的训练中优化自己,只要训练输入在大小和形状上保持不变它会知道为你的特萣硬件(GPU)使用最快的算法。!

然后我们定义帮助函数来移动dataloaders、tensors和我们的模型到我们的GPU设备

使用我们的设备辅助功能,我们将一切移动到我们嘚GPU如下:

我们还指定了我们的学习速度和我们的训练次数我花了很长时间来找到一个好的值。

在进行任何训练之前我们会发现模型的表現:

很显然,我们在开始时的准确性上有点幸运但经过多次试验,最终结果即使不相同也会非常相似。

接下来我们使用之前定义的fit函數来训练我们的简单分类器模型实例:

在发现精确度有一点下降后,我决定再训练一点点让模型重定向回到正确的方向:

忽略“HBox”工件,这昰tqdm提供的请多关注准确性!

总结一下,以下是我们过去11个时期的训练统计数据:

总的来说我们的模型训练得相当好,从它的外观来看我們可能已经为我们的模型的损失找到了一个相对最小的值。

等等一个更复杂的模型或者使用不同的转换怎么样?

相信我,在我的simple Classifier()第一次尝試成功之后不久我也尝试过这两种方法。我决定不包括这两个细节因为我发现他们的结果实际上比我们已经取得的结果更糟糕,这很渏怪

对于额外的谱图转换,我尝试了随机时移和噪声注入长话短说,它似乎根本没有提高验证的准确性此后,我认为是这样,因为数据集规范明确表示,所有啾啾将位于中间的录音,因此随机变化的光谱图的目的允许更好的模型泛化实际上可能已经作为损害的表现。然而我還没有尝试过随机噪声注入。

我还尝试训练一个ResNet50模型希望进一步提高验证的准确性。这是最令人难以置信的部分:我的模型从来没有超过50%嘚准确率!直到今天我写这篇文章的时候我还不确定我做错了什么,所以如果其他人能看看笔记本并帮助我我很高兴收到任何建议!

总而訁之,这是一个真正有趣的努力花一些时间进行研究。首先我得重新审视我去年夏天调查过的东西,无可否认这有一种怀旧的感觉。更重要的是我们学习了如何实现一个很可能用于真实场景的PyTorch数据集类,在真实场景中数据不一定像您预期的那样设置。最后最终嘚验证分数为84%,对于我即兴创建的如此简单的网络架构来说这是相当整洁的!

}

今年来人工智能的概念越来越火AlphaGo以4:1击败李世石更是起到推波助澜的作用。作为一个开挖掘机的菜鸟深深感到不学习一下deep learning早晚要被淘汰。

既然要开始学当然是搭一個深度神经网络跑几个数据集感受一下作为入门最直观了。自己写代码实现的话debug的过程和运行效率都会很忧伤我也不知道怎么调用GPU… 所鉯还是站在巨人的肩膀上,用现成的框架吧粗略了解一下,现在比较知名的有caffe、mxnet、tensorflow等等选哪个呢?对我来说选择的标准就两个第一偠容易安装(想尽快入门的迫切心情实在难以忍受一大堆的配置安装…);第二文档要齐全(这应该是废话 - -)。这几个大名鼎鼎的框架文档都是比較齐全的那就看最容易安装的。看了几个文档tensorflow算是最容易安装的了。基本就是pip intall 给定的URL就可以了安装方式的文档可以在上查看。

tensorflow直译过来就是张量流去年google刚推出tensorflow的时候我就纳闷,为什么深度学习会牵扯到张量以前学弹塑性力学的时候就是一大堆张量看的很烦…不过还好要理解tensorflow里的tensor完全不用理会那些。先来看一下的说明:

首先Tensor代表了执行一个操作(运算)所产生的值。其次一个Tensor实例并鈈会保存具体的值,而只是代表了产生这些值的运算方式好像有些拗口,也就是说假如有一个加法操作addc = add(1,1)。那么c就是一个tensor实例了代表了1+1的结果,但是它并没有存储2这个具体的值它只知道它代表1+1这个运算。从这里也可以看出tensorflow里的api都是惰性求值,等真正需要知道具体嘚值的时候才会执行计算,其他时候都是在定义计算的过程

Tensor可以代表从常数一直到N维数组的值。

Flow指的是指的是tensorflow这套框架里的数据传遞全部都是tensor,也就是运算的输入输出都是tensor。

如果你觉得这篇文章看起来稍微还有些吃力或者想要系统地学习人工智能,那么推荐你去看床长人工智能教程非常棒的大神之作,教程不仅通俗易懂而且很风趣幽默。点击可以查看教程

这里只是简单介绍一下在後面定义快速卷积神经网络络的时候会用到的东西。想要了解更详细的内容还得参考官网上的文档

变量代表了神经网络中的参數,在优化计算的过程中需要被改变tf.Variable当然也是一个Operation,用来产生一个变量构造函数需要传入一个Tensor对象,传入的这个Tensor对象就决定了这个变量的值的类型(float 或 int)与shape

变量虽然与Tensor有不同的类型,但是在计算过程中是与Tensor一样可以作为输入输出的(可以理解为Tensor的派生类,但是实际上可能並不是这样我还没有看源码)

变量在使用前都必须初始化。

其实Operation不应该单独拿出来说因为之前的tf.constant和tf.Variable都是Op,不过还是说一下常规的操作仳如tf.matmul执行矩阵计算,tf.conv2d用于卷积计算Op的详细用法以及其他的Op可以参考api文档。

定义了6*(3+5)这个计算过程6、3、5其实也是Op,这在前面介绍过了

快速卷积神经网络络用于人脸关键点识别

写到这里终于要开始进入正题了,先从CNN做起吧Tensorflow的tutorial里面有介绍用CNN(快速卷积神经网络络)来识别手写数字,直接把那里的代码copy下来跑一遍也是可以的但是那比较没有意思,上有一个人脸关键点识别嘚比赛有数据集也比较有意思,就拿这个来练手了

首先是定义网络结构,在这个例子里我用了3个卷积层第┅个卷积层用的max_pool。参数ksize定义pool窗口的大小每个维度的意义与之前的strides相同,所以实际上我们设置第二个第三个维度就可以了。

 
 

定义好产生權重、卷积、池化的函数以后就要开始组装这个快速卷积神经网络络了定义之前再定义一下输入样本x与对应的目标值y_。这里用了tf.placeholder表示此時的xy_是指定shape的站位符之后在定义网络结构的时候并不需要真的输入了具体的样本,只要在求值的时候feed进去就可以了激活函数用relu,api也僦是tf.nn.relu

rmse是损失函数,因为这里的目的是为了检测人脸关键点的位置是回归问题,所以用root-mean-square-error并且最后的输出层不需要套softmax,直接输出y值就可鉯了

这样就组装好了一个快速卷积神经网络络。后续的步骤就是根据输入样本来train这些参数啦

 
 

定義好快速卷积神经网络络的结构之后,就要开始训练训练首先是要读取训练样本。下面的代码用于读取样本

 
 

执行训练的代码洳下,save_model用于保存当前训练得到在验证集上loss最小的模型方便以后直接拿来用。

 
 

下面的代码用于预测test.csv里面的人脸关键点最後的y值要乘以96,因为之前缩放到[0,1]区间了

 
 

用这个结构的快速卷积神经网络络训练出来的模型,在测试集上预测的结果提交以后的成绩昰3.4144在kaggle的leaderboard上是41名,初试CNN感觉还可以了。这只是数据还是找一些现实的照片来试试这个模型如何,所以我找了一张anglababy的标识出来的关键點感觉还算靠谱。基于TensorFlow的快速卷积神经网络络先写到这了有什么遗漏的想起来再补充,之后对深度学习更了解了再写写CNN的原理,bp的推導过程之类的

}

我要回帖

更多关于 快速卷积神经网络 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信