1. <form id='Nv6Fzy'></form>
        <bdo id='Nv6Fzy'><sup id='Nv6Fzy'><div id='Nv6Fzy'><bdo id='Nv6Fzy'></bdo></div></sup></bdo>

          • 当前位置:首页 >> 计算机软件及应用 >>

            caffe深度学习薛开宇笔记实例


            caffe 深度学习薛开宇笔记实例 基于卷积神经网络 CNN 的声音识别





            目前的音乐检索系统用流派、风格、情感等类别标签检索音乐。其中,如果人工标注 音乐这些类别标签,则存在主动性强、费时费力、速度慢的问题,而如果采用传统的自动 标注方式,则存在准确率低的问题。后者准确率低的原因是,其标注时使用的模型不能 很好识别音乐。随着 Hinton 提出深度学习模型后,因其在图像和语音识别领域均取得很 好的成果,在识别领域成为了研究热点。因此,本文旨在研究如何使用深度学习中的卷 积神经网络(Convolutional Neural Networks,CNN)模型,设计出一个准确度高、速度快 的自动音乐分类系统,用作标注音乐的类别标签。 本文的工作有三部分: (1)提出一种新的自动音乐分类系统。该系统先将音乐转化成声谱图,后使用卷积 神经网络进行音乐识别分类。本方法在 Caffe 和 Matlab 平台下搭建,在 ipython notebook 平台中作成果展示。 (2)在 Jamendo 网站上收集 10 类共 1000 首音乐,制作成音乐分类数据库。 (3)在 GTZAN 数据库上进行了七种实验,从而找出最适合该系统的参数并验证系 统的有效性。其中,声谱图实验、微调实验是比较重要的原创实验。 最终,通过在以上实验中得出来的较好参数,使用本文设计的基于 CNN 的音乐分类 系统进行测试,在 GTZAN10 类数据库上达到了 90±1%的识别率。 关键词:卷积神经网络 深度学习 音乐流派分类 声谱图 GTZAN 数据库

            本文的结构 第一章,主要是阐明卷积神经网络理论。先介绍神经网络的原理和概念,其很多知识 与 CNN 有关,再介绍深度学习原理和特点,可对属于深度学习的 CNN 有初步认识。最 后详细介绍 CNN 的结构、算法。 第二章,主要介绍声谱图。本文的创新之处主要是使用了声谱图作为音乐的输入。详 细介绍了音乐的声谱图理论,及其可得到的信息。 第三章, 主要介绍本篇论文如何实现基于卷积神经网络的声音数据的识别分类。 先介 绍所用框架 Caffe 平台及其搭建。然后从数据输入、数据训练、结果输出三个方面具体说 明如何用该平台实现声音数据的分类。 第四章,主要介绍本论文所做实验需要用到的两个数据库,GTZAN 和自己制作的 Jamendo 数据库。 先介绍 GTZAN 数据库及其所含音乐类别特色, 再详细介绍自己自做的 Jamendo 数据库,说明其数据来源,及数据分布。 第五章,主要是对基于 CNN 的音乐分类识系统进行多种测试和分析,从而得出较好 的参数和证明可行性。在数据输入层面进行声谱图测试、样本数测试;在训练层面进行 两种模型的对比测试、结构的节点测试、微调测试以及学习率测试;在输出层面进行结 果综合判断测试。 第六章,主要是总结和展望。总结了基于 CNN 的音乐分类识别系统的一般步骤及其 最终参数并展示了其最终的识别结果。然后介绍了本识别系统的优点和创新点,最后通 过一个例子展示本识别系统。

            1


            摘 1



            要 ............................................................................................................................... I 卷积神经网络的介绍 ............................................................................................................ 4 1.1 神经网络 ..................................................................................................................... 4 1.1.1 神经网络基本原理 .......................................................................................... 4 1.1.2 神经网络的基本概念介绍 .............................................................................. 4 1.2 深度学习 .................................................................................................................... 9 1.3 卷积神经网络 ........................................................................................................... 10 1.3.1 卷积神经网络的结构 .................................................................................... 11 1.3.2 卷积神经网络的训练算法 ............................................................................ 13 1.4 本章小结 ................................................................................................................... 15

            本文的结构 .................................................................................................................................. 1

            2

            声谱图 .................................................................................................................................. 16 2.1 声谱图的简介 ........................................................................................................... 16 2.2 声谱图中可得到的信息 ........................................................................................... 17 2.3 本章小结 ................................................................................................................... 18

            3

            实现基于卷积神经网络的音乐分类系统 .......................................................................... 19 3.1 Caffe 平台简介 ......................................................................................................... 19 3.2 Caffe 平台的搭建 ..................................................................................................... 20 3.3 数据输入 ................................................................................................................... 22 3.3.1 Caffe 平台的一般数据输入形式 .................................................................. 22 3.3.2 Caffe 平台的音乐数据输入形式 .................................................................. 22 3.3.3 Caffe 平台的音乐输入数据后续处理 .......................................................... 25 3.4 训练数据 ................................................................................................................... 27 3.4.1 Caffe 平台搭建网络的方法 .......................................................................... 27 3.4.2 本论文需要使用的两种卷积神经网络 ........................................................ 28 3.4.3 使用 Caffe 平台搭建本论文需要使用的两种卷积神经网络 ..................... 30 3.4.4 在 Caffe 平台训练两种卷积神经网络 ......................................................... 32 3.5 结果输出 ................................................................................................................... 33 3.6 本章小结 ................................................................................................................... 34

            4

            实验用的数据库 GTZAN 及自己制作的 Jamendo 数据库 .............................................. 35 4.1 GTZAN 数据库 ........................................................................................................ 35 4.2 GTZAN 的流派简介 ................................................................................................ 35 4.3 自己制作的 Jamendo 数据库................................................................................... 36 4.3.1 Jamendo 数据库简介..................................................................................... 36 4.3.2 Jamendo 网站介绍......................................................................................... 37 4.3.3 Jamendo 数据库的数据及其结构................................................................. 37 4.4 本章小结 ................................................................................................................... 40

            5

            实验结果 .............................................................................................................................. 41 5.1 数据输入层面的测试与分析 ................................................................................... 41 5.1.1 声谱图实验 1 ................................................................................................. 41
            2

            5.1.2 声谱图实验 2 ................................................................................................. 42 5.1.3 声谱图实验 3 ................................................................................................. 42 5.1.4 声谱图实验 4 ................................................................................................. 43 5.1.5 声谱图实验 5 ................................................................................................. 43 5.1.6 声谱图实验 6 ................................................................................................. 43 5.1.7 声谱图实验 7 ................................................................................................. 44 5.1.8 声谱图实验 8 ................................................................................................. 45 5.1.9 声谱图实验结论 ............................................................................................ 46 5.1.10 样本数实验和结论 ...................................................................................... 47 5.2 训练层面的测试与分析 ........................................................................................... 48 5.2.1 结构实验 1 和结论 ........................................................................................ 48 5.2.2 结构实验 2 和结论 ........................................................................................ 49 5.2.3 微调实验和结论 ............................................................................................ 50 5.2.4 学习率实验和结论 ........................................................................................ 52 5.3 输出层面的测试与分析 ........................................................................................... 53 5.4 本章小结 ................................................................................................................... 53 6 总结与展望 .......................................................................................................................... 54 6.1 总结 ........................................................................................................................... 54 6.1.1 本文的音乐分类识别系统一般方法归纳 .................................................... 54 6.1.2 本文最终的音乐分类识别系统的参数与结果 ............................................ 54 6.1.3 本文提出的音乐分类识别系统的优点及创新性 ........................................ 55 6.2 展望 ........................................................................................................................... 56 6.3 例子展示 ................................................................................................................... 57 参 考 文 献 .............................................................................................................................. 59 附 录 ............................................................................................................................ 62 附录 1 歌曲剪切程序 ..................................................................................................... 62 附录 2 声谱图生成程序 ................................................................................................. 63 附录 3 声谱图切割程序程序 ......................................................................................... 65 附录 4 输出层面结果处理程序 ..................................................................................... 66 附录 5 输出层面结果处理程序 ..................................................................................... 68 附录 6 ipython 例子展示程序........................................................................................ 70

            3

            1 卷积神经网络的介绍
            1.1 神经网络 卷积神经网络是深度学习的一种模型, 其基本模型和神经网络很相似, 神经网络通常 只有三层,而卷积神经网络可以看成是多层的神经网络,其引用了一些神经网络基本概 念。主要包括神经元、激励函数单元、误差函数、梯度下降法、神经网络的连接、反向传 播(Back Propagation,BP)算法。在理解了这些神经网络的原理和概念后,我们对 CNN 的层次结构及训练算法更容易理解。 1.1.1 神经网络基本原理 神经网络(Artificial Neural Networks,ANN)是早期的机器学习模型,模拟人脑学习 过程。该模型由一系列的简单人工神经元相互密集连接形成,其每个神经元由 3 部分: 输入、神经细胞体和输出组成。 神经元由多个实值输入, 同时输出一个实值。 其神经细胞体对实值输入进行整合与阀 值处理。输入数据经过与输入连接的权值相乘,整合进入神经细胞体,其数值超过某一 阀值,则神经元被“激活”输出 1,否则为-1。如大脑可不停调节神经元之间的连接从而 不断学习新知识,ANN 也可以通过调整输入连接权值来让神经元激活或不激活。 在实际训练中,训练样本向量是 ANN 的输入端,训练样本的目标输出(如分类问题 中为类别信息)则为网络的输出端。初始情况下,网络权值为随机值,当某个训练样本输 入网络后,由此产生的实际输出与训练样本的目标输出的差异为训练误差。之后,ANN 不断根据训练误差调整权值 w, 使训练误差减少, 最终实际输出与目标输出越来越相似。 1.1.2 神经网络的基本概念介绍 (1)神经元 神经元是神经网络的基本单位。以实值向量组 ?(1, 2, 3, … )为输入,然后每个 输入分量对应一个权值 ???(1, 2, 3, … , ),再加上偏置 w0,将之作为阀值。然后将 这些输入进行线性组合,若其值大于 0 就输出 1,否则为-1,其可以用式 2.1 表示。若 该神经元位于输出层,则将来与训练样本的目标输出对比产生误差值,若不是,则与其 他神经元作为下一层的神经元的输入。其单元结构如图 2 所示。 = ( ?) = ( ??? ? ?) 其中, () = { 1 > 0 ?1 ? (2.1)

            4

            图2

            神经元模型

            图3

            激励函数单元

            (2)激励函数单元 为了使神经网络非线性,如图 3,需要在单个神经元之后,加一个函数单元使神经元 的最终输出是其输入的非线性输出,其称为激励函数单元。 同时, 为了在训练过程中使用后面介绍的随机梯度下降算法, 这个激励函数单元须是 个可微函数。常以 Sigmoid 函数作为激励函数,如图 4,其可用式 2.2 表示。 () = + 1+exp(??)


            (2.2)

            图4

            Sigmoid 函数

            图5

            误差曲面

            (3)误差函数 为了能在训练的过程中获得最优的权值向量 ??? ,需要规定一个度量( ???)来衡量当前 权值向量 ??? 下神经网络的输出相对于训练样本的训练误差。常用的度量标准是平方误差 函数,其数学表达式为式 2.3。 ( ???) = 2 ∑∈( ? )2
            1

            (2.3)

            其中, 为训练样本 d 在神经系统的实际输出, 为 d 的目标输出,在整个训练样本的 集合 D 中, 由于 固定, 由 ??? 决定, 所以 是关于 ??? 的函数, 其表示在空间为误差曲面, 如图 5 所示,( ???)的全局最小值所对应的 ??? 则为我们所求的目标值。
            5

            (4)梯度下降法(Gradient Descent) 在上面的误差曲面中, 为了能快速达到其谷底, 应该选择沿着最陡峭的方向下降数值。 为了找到这个最陡峭的下降方向,可采用计算梯度的方法。即求出( ???)相对于 ??? 的每个 分量的偏导数,其导数最大则为其方向。偏导公式为 ?( ???) = [ , , ? , ]
            0 1







            (2.4)

            于是权值更新的梯度下降法为: ??? ← ??? + ? ??? 其中, ? ??? = ??( ???) (2.5)

            是常数,称为学习率,规定了梯度下降时权值变化的步长。 (5)神经网络的连接 就像大脑中神经细胞是相互连接的,单个神经元也按照这样的方式组织在一起形成 神经网络。如图 6 是其一种广泛的连接方式。每一层神经元的输出都反馈到他们的下一 层,最终获得整个网络的输出。 神经网络至少有三层,输入和输出层至少各一层,隐藏层至少一层以上。相邻层之 间全连接,上一层的每个神经元均连接到下一层的某一个神经元中。

            图6

            三层 BP 神经网络拓扑图

            (6)反向传播(Back Propagation,BP)算法 BP 算法是神经网络最主要的算法,其所用的主要原理方法是前面所提到的梯度下降 法,分为前向传递和反向传递两个阶段。前向传递时,为输入层-隐藏层-输出层,后一层 节点只受前一层节点的影响。若输出层得到结果与期望值有差别则进行反向传递,根据 其误差更改权重及阀值, 重复若干次, 直到误差函数到达全局最小值 (刘鲭洁, 等, 2010) 。
            6

            前向传递阶段:我们假设共有 N 个训练样本,对于单个样本 n, ?(1, 2, 3, … )为 ?(1, 2, 3, … , )为其对应目标输出。以图 6 的图说明。 输入, 步骤 1:网络初始化。依据输入与目标输出向量个数,设定网络输入层节点数 M 与输 出层节点数 C, 并根据具体需要设置隐藏层节点数 , 输入层为 ,隐藏层为, 输出层为,
            对于单个样本 n,初始化输入层、隐藏层和输出层神经元之间的连接权重 , ,初始 化隐藏层和输出层的阀值, 即偏置 , ,设置学习速率及选择神经元激励函数 (刘鲭洁,

            等,2010)。证明,连接权重的初始化应该用数值小的随机值。 步骤 2:隐藏层输出计算。对于单个训练样本 n,根据输入向量 ? ,输入层与隐藏层层
            间连接权重 及隐藏层阀值 ,得出隐含层输出? 。公式为: ? = (∑ =1 ? ) = 1,2, ? ,

            (2.6)

            式中, 为隐含层激励函数, 2.1.2(3)中说明本网络采用 Sigmoid 函数, 公式为式 2.2。
            步骤 3:输出层输出计算。对于单个训练样本 n,根据隐藏层输出? ,隐藏层与输出 层层间连接网络权重 及输出层阀值 。得出输出层实际输出 。公式为: = ∑ =1 ? ?

            = 1,2, ? ,

            (2.7)

            反向传递阶段: 步骤 4:误差计算。我们使用本论文 2.1.2(3)中的平方误差代价函数来计算误差。
            ?(1, 2, 3, … , ),用 对于单个样本 n,其目标输出为 表示。根据前向传递阶段单个样 本 n 得出的实际输出 ,对于全部样本 N,总公式为: 2 = 2 ∑ =1 ∑=1( ? ) 1

            (2.8)

            由于对于全部样本 N,其误差只是将每个训练样本的误差叠加,因此我们仍继续用 单个训练样本 n 进行计算,即公式为:
            2 2 = 2 ∑ =1( ? ) = 2 ‖ ? ‖2 1 1

            (2.9)

            步骤 5: 偏置更新。根据梯度下降法,我们需要求出 E 相对于每个权重分量的偏导 数,以找出下降方向使误差 E 尽快到达最小值。由于隐藏层和输出层有一定的区别,我 们将步骤 2、 步骤 3 的输出公式换一种更普遍的表达式。 用 表示当前层, 则 -1 为上一层, 例如,对应于隐藏层, -1 就是其输入层,其输入为输入向量 ? 。普遍的公式如下:
            7

            = ( ) 其中 = ?1 +

            (2.10)

            其中, 函数为激活函数, 表示该层权重矩阵, 由于单层偏置项往往是同一个常量, 因此用常数 b 表示该层偏置项。 和 ?1 分别表示本层输出和输入。 这里加入一个概念,偏置项的灵敏度,用它表示反向传播回来的误差,它是误差对偏 置项 b 的变化率,公式如下:


            = =



            (2.11)

            由于 = 1,所以 = = ,因此,可得出对于单个偏置项 b 灵敏度,其等于误 差 E 对它所有输入的的导数。经过对的推导,具体推导方式参考 Stanford 大学的 Andrew Ng 教授的 UFLDL 中关于 deep learning 的教程。隐藏层的灵敏度,关系式为: = ( +1 ) +1 ° ′ ( ) (2.12) 其中,“°”这个运算符号代表每个元素相层, 代表第 层隐藏层。 对于输出层的灵敏度,可用以下公式描述: = ′ ( )°( ? ) (2.13) 其中 L 代表输出层。 式 2.12 和式 2.13 可以分别计算出隐藏层和输出层的灵敏度 , ,而再结合本文 2.1.2(4)中梯度下降法的更新公式原理,用如下公式,在单个样本 n 中,则可更新隐
            藏层和输出层的偏置 , ,其中μ为学习率。

            = ? μ = ? μ = 1,2, ? ,
            = ? μ = ? μ = 1,2, ? ,



            (2.14) (2.15)

            步骤 6:权值更新。根据梯度下降法,以及 UFLDL 中的推论,可以用 δ 的规则对权 值进行缩放更新,其公式为:


            = ?1 ( )


            (2.16) (2.17)

            = ? μ

            步骤 7:判断网络预测误差 是否小于一定值,若小于则误差函数到达全局最小 值,这时的权重和阀值都是最优的,这时的神经网络模型就已经具有优秀的学习特征能 力了。若不小于则需要重新从步骤 2 循环,直到误差小于一定值。

            8

            1.2

            深度学习 卷积神经网络是深度学习的一种模型, 这里介绍深度学习的原理及其特点, 为卷积神

            经网络这种深度学习模型的一种打下理论基础。 自多伦多大学的 Hinton 教授在 2006 年提出该模型, 学术界和工业界很多学者都展开 相关研究。深度学习本质是一种采用多层非线形变换的提取信息方法,经过有监督或无 监督训练,得出一组可提取数据丰富内在的网络参数,最终用于特征提取以及模式分类 的任务。这种多层特征表示结构,因高层特征是由低层特征总结输入,可挖掘出更深层 的信息,因此可对复杂数据的关系进行拟合,从而构成一个具有层次的特征提取体系。 其原理主要模拟人脑视觉机理。如图 7 的示意图,以红气球为例,从原始信号摄入开 始(模拟瞳孔看见的是一个红气球的像素) ,然后,经过初步处理(模拟大脑皮层某些细 胞发现边缘与方向) ,接着抽象(模拟大脑更高级的细胞综合前面的边缘信息,判定物体 的形状为椭圆) ,最后进一步抽象( (大脑得出结论是一只气球,而且为红色) 。其中,像 素信息,是低层特征,然后边缘信息是高级一些的特征,形状特征是高级特征,深度学习 便是这样的特征提取系统。

            图7

            人脑视觉机理

            深度学习属于神经网络这种初期的机器学习的一种发展。其特点主要是:1、对比人 工设置特征模版, 可从大量样本训练中自行学习统计规律, 可完成对未知特征进行预测。 2、对比早期机器学习,其强调模型结构深度,一般是 5、6 层,目前,10 个隐藏层以上 的模型已经实际运用。多层的网络可以表示复杂的特征。3、对比早期机器学习,其强调 大数据的重要性, 当训练数据足够多样和复杂时, 其能展现对海量数据的强大建模能力。

            9

            1.3 卷积神经网络 卷积神经网络是在神经网络的理论基础上形成的深度学习网络。上述提到的神经网 络由本文 2.1.2(5)可知,是一个全连接的网络,即上一层的每个神经元均连接到下一 层的某一个神经元中。这样的做法有以下缺点:1、声音和图像的输入均是很多维,包 含数百个以上的变量,例如,输入图像的像素是 100*100,隐含层要学习 100 维的特征 (即隐含层有 100 个神经元),则全连接网络需要学习 100*100*100,即 10 万个权重参 数,这样使用 BP 算法不但使训练速度变慢,参数越多,意味着需要的训练样本越多, 如果训练样本不足,还容易产生过拟合现象,学习出来的特征没有普遍性。2、神经网 络的结构不考虑输入数据的特点,例如,在图像识别中,同一幅图像只是做了一个小的 位移,神经网络就会因为其输入像素的不同当成是不同的图像,无法根据训练过程对这 种数据特征进行优化处理。3、神经网络由于其全连接,因此需要考虑全部的输入数 据,无法识别训练数据中的局部区域特征,可是卷积神经网络可以单独学习识别该局部 区域特征。 针对以上问题,卷积神经网络通过局部连接,经过局部感受野、权值共享和下采样 过程,来对神经网络进行改造,从而更好学习特征。其与神经网络的主要不同主要有: (1)局部感受野。相对于神经网络的输入是一维的,卷积神经网络的输入是二维。 而且,输入也不是全部连接到一个神经元,而是局部连接,其区别主要如图 8 所示。

            图 8 卷积神经网络输入连接的不同点

            图9

            权值共享

            局部连接,即输入的数据只有一部分连接到一个神经元,称为局部感受野。其可以使 神经网络从输入图像中学习到初级的视觉特征,如端点、边缘、拐角等,后续的各层通过 对这些特征的组合,从而能得到更高级的特征。

            10

            (2)权值共享。传统神经网络隐藏层中每层每个神经元对应一个特征,一层中往往 有多个特征。在一个局部感受野中,我们将其连接的权值组成一个矩阵,则该矩阵称为 滤波器,我们用同一个滤波器去卷积整个图像,不停更新滤波器中的权值,称为权值共 享。这样,所有局部感受野的权值是相同的。好处在于,即使输入的图像出现平移变化, 特征也会以同样的方向和距离在输出中出现, 却不引起其他变化, 即平移不变性。 同时, 因为权值相同,因此大幅度减低了需要训练的权值数目。如图 9 左所示。 同一种滤波器因其连接权重都是相同的, 因此只能学习一种特征, 我们定义用同一种 滤波器卷积学习到的特征向量组合称为特征图(Feature Map),即该滤波器所学习到的 特征。 若需要提取多种特征, 则需如图 9 右所示用多种滤波器分别去卷积得多个特征图。 (3)下采样。在滤波器卷积后得到的 Feature Map 后,不像传统多层神经网络经激 活函数后进入相同的一层,而是进入下采样层,根据规则只取 Feature Map 部分特征参 数,从而降低其分辨率,这样可过滤掉噪声,避免过拟合,使网络识别特征的能力增强。 因此,在模式识别方面,其有如下优点,使我本次使用该模型。(1)可把二维图像 直接作为输入,而我本次使用音频图,是二维数据,可避免针对数据进行复杂处理,方便 提取图像特征。(2)CNN 的特征提取功能是自动学习的,这比人工设定特征提取来得可 靠。(3)权值共享使训练参数减少,同时使其可以并行训练,降低神经网络训练速度。 1.3.1 卷积神经网络的结构 上面介绍了卷积神经网络的主要不同点,现在介绍这些不同点是如何在其结构展示 的。CNN 的基本结构如图 10 所示,是多层神经网络,其处理步骤如下。

            图 10

            卷积神经网络结构

            步骤 1:输入层(Input)。把经过统一处理(如大小统一)的二维图像放进输入层。 步骤 2:卷积层(C1)。对输入层的数据进行卷积处理,其结果组成卷积层。其卷积的
            11

            方法如图 11 所示。另外,设输入图片大小为 × ,滤波器大小为 × ,步长为 ,则输 出矩阵大小 × 为式 2.18,如图 11 中某个输入图像数据矩阵大小为5 × 5,滤波器的大 小为3 × 3,卷积步长为 1,则得出如下的3 × 3矩阵。 =
            ?+

            且 =

            ?+

            (2.18)

            图 11

            卷积的方法

            图 10 中, 输入层分别与三个能训练的滤波器进行卷积运算, 然后分别加上一个偏置, 则在其卷积层 C1 得到 3 个特征图。于是卷积层的总运算公式如下:
            = (∑∈ ?1 ? + )

            (2.19)

            k 为卷积核(滤波器), 为层数, 为第 j 个特征图,为对应偏置,为激活函数。 步骤 3:下采样层(S1)。对 C1 层输出的每个特征图进行下采样。即分别对每个特征 图中 × 大小的邻域进行加权求和运算或取最大值等运算,最后乘以一个乘子偏差,加 上一个附加偏差,经过一个激励函数,最终在下采样层得到 3 个特征图。其特征图大小 为 C1 层特征图的 1/n。于是下采样层的总计算公式如下:
            = ( (?1 ) + ) (2.20)

            其中,()表示下采样函数, 称为下采样的乘子偏差,称为对应的附加偏差。 步骤 4:重复步骤 2 和步骤 3,为一个 C-S 过程。S1 层的特征图再经过卷积滤波得到 C2 层,C2 层经过下采样生成 S2,特征图的大小不停变小,直到最后一次卷积滤波后光栅 化成一维数据。对于卷积神经网络来说,输入数据的维度越大,则其步骤 4 就要重复多 次从而形成一个有一定深度的网络。 其每一次的卷积和下采样 (C-S) 过程可总结为图 12。

            12

            图 12

            卷积神经网络的 C-S 过程

            步骤 5:当步骤 4 输出一维数组后,这时候数据的维度与原来相比已经下降了许多, 这时候,只需接入用于识别的分类器则可。该分类器应该关于权值可微从而使用 BP 算法 对整个网络训练。常用的分类器便是前面所说的传统的全连接的神经网络,用前面提到 的神经网络进行识别分类。 1.3.2 卷积神经网络的训练算法 卷积神经网络的算法主要还是 2.1.2(6)中的 BP 神经算法,即前向传递时,一层一 层输出,若输出层得到的结果与期望值有差别则进行反向传递,根据其误差运用梯度下 降法来更新其权重及阀值,重复若干次,直到误差函数到达全局最小值。但前面提到的 BP 算法的权重与偏置值的更新只是在全连接网络时的算法,对于局部连接的卷积神经网 络,则需要在于卷积层和下采样层的权重和偏置值更新有一定的改变。 卷积神经网络和传统神经网络的算法最终目的均是对权值和偏置值更新,因此这里 直接讨论卷积层和下采样层的权重偏置更新公式。 (1)卷积层的权重与偏置更新: 卷积层的运算过程为, 输入的特征图与一个可训练的滤波器 (卷积核) 进行卷积运算, 加上一个偏置项,最后通过激活函数获得输出特征图,其中输入特征图可以有不同组合 方式,由本文 2.3.2 中介绍可知,其运算公式为式 2.19。 这里需要注意的是,每个输出特征图所对应的卷积核都是不同的,即使输出特征图 与输出特征图 都是由输入特征图 进行卷积得到,它们都是不同的卷积核。 这里假设每个卷积层 下面都存在着一个下采样层 + 1。根据前面 BP 算法的式 2.16, 式 2.17 中可知,要得到卷积层 上每个神经元的权值的更新,则需求得卷积层 上每个神 经元的偏置项的灵敏度 ,而据前面的式 2.12 可知,为求 则需 + 1层的 +1 与相对应 的权值 相乘,再乘上其对应的当前神经元的激活函数对输入 的偏导′( )。
            13

            然而, 因下采样层的存在, 卷积层的输出特征图和下一层的下采样层的输出特征图的 大小是不一样的。根据下采样的算法,卷积层输出特征图中的一块像素只是映射到下采 样层中的一个像素。也就是说,输出特征图一块像素的灵敏度 只对应于下采样层中的 一个像素的灵敏度 +1 ,这样无法正常更新,因此,我们的做法是,将下采样层的特征图 进行升采样,使其特征图的大小与卷积层 的特征图大小一致,则其灵敏度能互相对应。 因此,将下采样层上采样,根据式 2.12 再乘上下采样时的参数 ,就可以得到卷积层 的 灵敏度 。其公式为:
            +1 = ( ′ ( )°(+1 )) (2.21)

            其中,up()表示上采样的计算。假设在做下采样时采样因子是 n,那么上采样即将 每个像素分别在垂直与水平方向上复制 n 倍,即可恢复原来大小。则用 Kronecker 乘积 可实现上采样: () = ?× (2.22)

            那么,对于卷积层 上一个输出特征图,我们就能得到其灵敏度了。这时,我们可以 计算偏置项 b 的梯度,根据式 2.11 的算法,在这里就是将下采样层中特征图的所有单元 的灵敏度求和,其公式为:


            = ∑,( )

            (2.23)

            与前面的式 2.14、式 2.15 相似,则可更新卷积核的偏置 b。 对于卷积核的权值更新,由于已经求得灵敏度,则其梯度计算公式由式 2.16 可得 出。然而,因为权值共享,所以要求所有与该权值有联系的连接对该点计算梯度。得到 梯度后求和。其公式为:



            = ∑,( ) (?1 ) (2.24)


            其中,(?1 ) 表示式 2.19 中 ?1 中与 进行卷积的像素块,也就是卷积层 中特

            征图矩阵的一个单元的输入。这看起来需要记录哪个区块对应输出图,但 Matlab 中的 函数可通过区域覆盖实现,其采用公式:。



            = 180(2(?1 , 180( ),′ ′ ))

            (2.25)

            其中180( )表示对其进行旋转。 同理,利用式 2.25 再按照前面的式 2.16 与式 2.17 的法则,则可更新权重。

            14

            (2)下采样层的权重与偏置更新: 下采样层的计算公式为式 2.20,其对每个输入图中每一个不同的 × 区域求和使 输出图与输入图相比在水平和垂直维度上都小 n 倍。其可更新的参数为,其每个输出图 自身的乘子偏差 以及附加偏差。 这里假设当前的下采样层和后面的卷积层的连接是全连接的形式而不是部分相连, 则可采用 BP 算法计算出下采样层的每个神经元的灵敏度了,根据式 2.12,我们可以得 出如下的公式计算该采样层的灵敏度:
            = ′ ( )°2(+1 , 180(+1 ),′ ′ ) (2.26)

            其中+1 表示当前下采样层的下一层的卷积层反向传播的灵敏度,rot180(+1 ) 表示旋转了的卷积核。 现在计算乘子偏差 的梯度和附加偏差。对于的梯度计算只需把下采样层的特征 图中的所有灵敏度相加,即根据式 2.11 的算法,计算公式为:


            = ∑,( )

            (2.27)

            与前面的式 2.14,式 2.15 相似,则可更新卷积核的偏置 b。 乘子偏差 与前向传播中,当前层的原始下采样图(即没增加附加偏差和通过激活函 数构成的特征图)有关,因此,我们需在前向传播中保存这些图使其在后面计算。定义:
            = down(?1 ) (2.28)

            这样,根据式 2.16 可得,计算 的梯度公式如下:
            = ∑,( ° )

            (2.29)

            利用式 2.29 再按照前面的式 2.16 与式 2.17 的法则,则可更新权重。 1.4 本章小结 本章主要介绍 CNN 的理论。在介绍 CNN 之前,先从深度学习入手,说明深度学习模 型的普遍原理,然后介绍深度学习的基础模型,即神经网络模型,介绍神经网络的一些 概念,这些原理和概念都是和 CNN 有关的。然后,从神经网络的不足入手,简要介绍了 CNN 其实是对前面模型的改造,罗列了不同点后,通过利用前面的原理和概念分析 CNN 的结构及训练算法,来详细介绍 CNN 理论。最终提出了 CNN 理论在本项目研究中之所以 采用的优点。

            15

            2 声谱图
            2.1 声谱图的简介 本论文的创新之处是对音乐进行声谱图处理后进入卷积神经网络进行训练识别。而 声谱图参数对识别率有很大影响, 这些将在后面实验验证。 在这里, 先对声谱图作介绍。 在对音乐的描述中, 能全面描述且频繁使用的工具是声谱图。 其对于分析谐波的组成 和变化均有非常方便且直观的作用。音乐本身是一系列由简单波混合组成的复杂波,用 声谱图来分析音乐在组成谐波和强度方面的变化规律, 可分析获取得到音乐中本质信息。 声谱图为一张有颜色或者灰度变化的二维图像,尽管该图上每个点对应的其实是一 个三维值。声谱图的横轴对应着时间,纵轴对应着该时间的频率分量。与坐标(, )对 应的点表示在时刻和频谱上的声音强度,用不同的颜色或灰度来表示。在音乐文件的 声谱图中, 我们可以很直观的看到整个时间-频率范围内声音强度的分布和变化, 如图 13 所示,其为张雨生《后知后觉》的某段音乐的声谱图。

            图 13

            张雨生《后知后觉》声谱图

            图 13 中,上方为其某段时间的声谱图,下方则是该歌曲 6:20.5 时刻的频谱图,其 轴为频率, 轴为响度。图中的泛音则为与基频成一定倍数关系的其他谐频,
            16

            为得到上方的声谱图,先将原始音乐文件分割成很短的帧。这些帧一般为几百毫秒。 同时,为了确保信息的连续和准确,相邻的帧间还存在着重叠,以上对应的概念是帧长 和步长。帧长则为一帧的时长,步长为一帧的起点与下一帧起点的间隔时长。由于相邻 帧一般有一定的重叠,因此步长通常小于帧长。因为帧长一般值很小,因此可以假设在 这么短的时间域内,其基频和谐波及他们的强度均为定值。然后将每个帧做短时傅里叶 变换,获取对应的频谱信息,即图 13 中下方的频谱图,频谱信息包括每帧的频率及其强 度情况,将这些频谱信息旋转 90 度后连接在一起,并且用颜色或灰度表示其强度,即可 得到图 13 中上方完整的声谱图。

            2.2 声谱图中可得到的信息 在声谱图上,我们可以得到的直观信息是:(1)在特定时间里频域上响度峰值的状 况。(2)在特定频段里时域上响度峰值的状况。(3)主频率随时间的变化状况。(4) 在特定时刻上相邻频率的响度变化状况。(5)在特定频率上相邻时间的响度变化状况。 这些信息对于不同的流派音乐是不同的,可以看成是流派音乐不同的直观特征。 在声谱图中,我们还可以根据波纹特点发掘一些不很直观的特征。如图 14 所示,如 果音乐中有人声,则其波纹(谐频)的变化是相对较大的,而如果是没有人声,用钢琴弹 奏的节奏比较轻缓的音乐,则其波纹是比较平滑且集中在基频附近,而对于没有人声, 且节奏感比较强的音乐,如 disco,则其波纹是一段一段分开出现的。

            图 14

            各种风格音乐的声谱图

            17

            很明显,在音乐的分类过程中,西方古典音乐一般人声比较少,由钢琴等乐器演奏比 较和缓的曲调,那么我们观察到像图 14 中中间的声谱图,可以初步认为这是一首古典类 音乐, 而 disco 的节奏感强烈,则若我们观察到图 14 右边的声谱图,也可以初步判定 为 disco。虽然目前没有严格的推理证实以上的观点,可是本论文可以用实验证明。 同时,由于声谱图可以反映音乐的本质,而且其是二维的数据,对于卷积神经网络这 种主要应用在二维数据识别的网络中,这是一种很好的输入形式。

            2.3 本章小结 本章详细介绍了音乐的声谱图, 及其可得到的信息, 这是本论文使用的音乐数据输入 形式,本章的知识将在后面用到。

            18

            3 实现基于卷积神经网络的音乐分类系统
            3.1 Caffe 平台简介 Caffe(Convolutional Architecture for Fast Feature Embedding)平台是 2014 年由加州 大学伯克利分校的 Yangqing Jia 等人发明的一个计算 CNN 相关算法的框架, 其具有清晰, 可读性高,快速的特点(Jia Y.,et al,2014) 。其目的是给全球的多媒体科学家一个简明 的深度学习平台,供他们研究深度学习各种算法。 (1)Caffe 提供一个可修改的获 BSD 许可的 C++库,绑定在 Python 和 Matlab 上用 来训练数据和部署卷积神经网络和其他深度学习模型。其具有以下的优点: (2) 快速: 因为 Caffe 可以使用 CUDA GPU 进行并行运算, 速度非常的迅速, 例如, 在 K40 或 Titan GPU 上,可以只用 24h 训练 4 千万张照片(Jia Y.,et al,2014) ,相当于 2.5ms 一张照片。如此的速度允许其在工业和商业上应用。 (3) 跨平台: Caffe 允许在不同平台之间使用, 这样使在云环境中开发和部署更方便。 (4)技术支持:目前,Caffe 由 Berkeley Vision and Learning Center (BVLC)和一个 GitHub 的社区论坛共同维护和发展。 该论坛每天都有大量的人研究和开发 Caffe, 并且接 受任何人的提问。 Caffe 的初学者或资深人员均可在上面交流问题, 以及获取最新的 Caffe。 图 15 为该 Caffe 在 GitHub 上的论坛。

            图 15

            Caffe 在 GitHub 上的论坛
            19

            3.2 Caffe 平台的搭建 Caffe 平台需要在 linux 系统上运行,本论文使用的 linux 是 Ubuntu 12.04 版本,以此 为例说明其搭建过程。其过程比较复杂,如下: 步骤 1:安装 build-essentials。其目的是安装 Caffe 平台所需要的 linux 基本包。只需 在终端输入指令: 1: sudo apt-get install build-essential 步骤 2:安装 NVIDIA 驱动。这时,需要查看电脑的 GPU 是否为 NVIDIA 显卡,目 前 Caffe 只能用 NVIDIA 显卡运行,本论文使用的显卡是 NVIDIA 的 GT650M 显卡。输 入下列指令添加驱动源: 1: sudo add-apt-repository ppa:xorg-edgers/ppa 2: sudo apt-get update 然后安装 320 版本驱动,该版本取决于电脑显卡型号,NVIDIA 官网可查询。指令: 1: sudo apt-get install nvidia-320 2: sudo apt-get install nvidia-340-uvm 安装驱动后,终端输入 reboot 重启。 步骤 3: 安装 CUDA 6.5。 需要注意的是, 一些 NVIDIA 显卡并不支持, 可以查看 CUDA 官网。 CUDA 安装后, 电脑即可使用 GPU 进行运算。 先安装必要库, 终端输入下列指令: 1: sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1mesa-glx libglu1-mesa libglu1-mesa-dev 然后,输入以下指令获取安装 CUDA Toolkit: 1: $ sudo apt-get install cuda 步骤 4:环境配置。在 CUDA 安装完后,需对.bashrc 加入一些指令来配置环境 1: export CUDA_HOME=/usr/local/cuda-6.5 2: export LD_LIBRARY_PATH=${CUDA_HOME}/lib64 3: PATH=${CUDA_HOME}/bin:${PATH} 4: export PATH 步骤 5:安装 CUDA SAMPLE 并编译。复制 SDK samples 到主目录下,后完成编译 1: $ cuda-install-samples-6.5.sh ~ 2: $ cd ~/NVIDIA_CUDA-6.5_Samples 3: $ make
            20

            步骤 6: 安装 BLAS。 Caffe 的 BLAS 有三种选择, 分别为 atlas、 mkl 以及 openBLAS。 经过对比,比较方便的是 atlas,在 Caffe 官网上有其相关的介绍,在 Ubuntu 中,通过以 下命令可以下载 atlas: 1: sudo apt-get install libatlas-base-dev 步 骤 7 : 安 装 OpenCV 。 OpenCV 库 的 安 装 可 通 过 网 上 写 好 的 脚 本 进 行 下 载 (http://github.com/jayrambhia/Install-OpenCV) 。解压文档后,进入终端给该所有脚本加 上可执行权限后使用: 1: chmod +x *.sh 然后执行 opencv2_4_9.sh。 步骤 8:安装其他 dependencies。执行下列命令下载相关依赖库文件: 1: sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboostall-dev libhdf5-serial-dev 2: sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler 步骤 9:安装 python 及 Matlab。安装 pip 和 dev,以及 Caffe python wrapper 所需额外 包,指令如下: 1: sudo apt-get install python-dev python-pip 2: sudo pip install -r /path/to/Caffe/python/requirements.txt Matlab 需要独立安装,本文的版本为 Matlab R2013b,具体自行查找教程。 步骤 10:编译 Caffe。完成以上所有的环境配置后,在官网下载 Caffe 源码,进入根 目录 Caffe-master,首先复制一份 makefile,修改其内容。主要为: CPU_ONLY 是否采用 cpu 模式,

            BLAS:=atlas(也可为 open 或者 mkl) DEBUG 如果需要 debug 模式 MATLAB_DIR 如果需要采用 Matlab 接口 PYTHON_DIR 如果需要采用 python 完成配置后,即可进行编译及测试,若无问题则搭建完成: 1: make all -j4 2: make test 3: make runtest

            21

            3.3 数据输入 3.3.1 Caffe 平台的一般数据输入形式 Caffe 平台最初的设计是用作识别分类图片的,因此其数据输入是图片。 如本人从网上下载了猫和鸟的图片各 60 张,各 50 张用于训练,各 10 张用于测试, 图片的大小不一致,格式是 jpeg。建立 train 文件夹,进入该文件夹后建立 cat 和 brid 子 文件夹,把猫和鸟各 50 张训练图片放入其中。建立 val 文件夹,把猫和鸟各 10 张测试图 片共同放进去,如图 16 所示。这就构成了 Caffe 最直接的输入。

            图 16

            Caffe 平台的图片放置方式

            3.3.2 Caffe 平台的音乐数据输入形式 在最开始的时候,本人曾经试过直接将音乐矩阵用作输入,但效果并不理想。后来, 根据一系列的实验,这些实验在后面的章节具体讨论,发现,声谱图是一种很好的输入 方式。首先,声谱图可以直接反映音乐的本质,其次它是二维的数据,对于卷积神经网络 这种主要应用在二维数据识别的网络中,不必经过转换,使用方便,最后,一首音乐的声
            22

            谱图比其自身的容量小了很多,训练快速。关于声谱图的具体介绍已经在本论文第 3 章 具体介绍,现在介绍如何将音乐变成声谱图放进 Caffe 平台中。 在 GTZAN 的数据库中,其格式为*.au,一首音乐为 30S,在这里先把一段音乐切成 10 秒一首,则可以切出 3 首歌曲,其使用的 Matlab 程序框图如下图 17 所示:

            开始

            读取单个声音文件并 进行剪切

            搜索声音文件

            命名保存后循环上一步骤, 直到读取所有文件

            获取声音文件数目 结束

            图 17

            歌曲剪切程序流程图

            之后,把音乐转换成声谱图,其参数包括采样频率 fs、重叠的长度 overlap,傅里叶 变换时汉明窗的长度 length(window()),傅里叶变换的点数 N。这里主要使用下列函数: specgram(x(:,1),N,fs,window,overlap); 该函数绘制的声谱图矩阵,即对输入信号 x 短时傅里叶变换,其横轴为时间,纵轴为 频率。 横轴的大小以输入数据的维度、 窗函数长度?(())、 窗重叠的长度 计算,公式为: = ( ? )/(?(()) ? ) (4.1) 纵轴为频率,其大小傅里叶变换的点数 N 决定,其公式为: +1 2 = {+1
            2

            为偶数 为奇数

            (4.2)

            该声谱图函数返回的值是由实数和虚数共同组成, 为了后面方便处理, 可以使用下列 公式将其返回值做一个变换: s = 20 × log10 (|s| + eps)
            23

            (4.3)

            其使用的 Matlab 程序框图如下图 18 所示:
            开始

            读取单个声音文件并使用 specgram函数

            参数设置

            设置输出图片的参数

            对图片进行去边的剪切 搜索声音文件并获取文件数

            保存图片并返回直到所有文 件读取完毕

            结束

            图 18

            声谱图生成程序流程图

            调用该程序后,一首 10S 歌曲的声谱图则生成了,本论文即是用上面的两个程序生 成了 10 类的声谱图作为实验的输入数据,例如 classical 类歌曲 classical.00056.au 的声谱 图如图 19 所示:

            图 19

            classical.00056.au 的声谱图

            需要注意的是, 这里介绍的是音乐数据输入 Caffe 的基本形式, 声谱图的制作过程中, 选用的不同参数,均会对识别率有很大的影响,这里在后面章节详细讨论。

            24

            3.3.3 Caffe 平台的音乐输入数据后续处理 做了十类的音乐声谱图后, 还需对声谱图做处理才能在 Caffe 中训练测试, 步骤如下: 步骤 1:在 Caffe 中培训和测试的输入是用 train.txt 和 val.txt 描述的,这些文档列出 所有文件和他们的标签。注意,我们分类的名字是 ASCII 码的顺序,即 0-999,这里必须 从 0 开始,对应的分类名和数字的映射在 classname.txt(自己写)中。在进入 train 和 val 文件夹后,分别在终端运行下列的指令: 1:find -name *.jpg |cut -d '/' -f2-3 > train.txt 1:find -name *.jpg |cut -d '/' -f2-3 > val.txt 注意路径,然后在 txt 中根据音乐类别做标签,在 train.txt 和 val.txt 中的每个声谱图 用 0-999 分类。 为了简便, 本文在 Matlab 上写了批处理程序, 其程序在后面附录中展示。 对于样本数不多的,同样可以在终端中输入下列指令: 1:sort -n -k 4 -t / train.txt -otrain.txt sort 可以排列 txt 的顺序。然后排序好后添加 0-999 标签,如添加 0,可用以下指令: 1:sed "s/$/ 0/" train.txt > train1.txt 这时的 train.txt 如图 20 所示,同理,val.txt 如图 21 所示。

            图 20

            train.txt 的内容

            图 21

            val.txt 的内容

            步骤 2:Caffe 要求我们的输入数据的大小统一,由于后面需要用到一个叫 imagenet 的模型, 其输入大小要求是256 × 256, 我们还需把图片的大小变成256 × 256。 指令为: for name in /path/to/imagenet/val/*.JPEG; do convert -resize 256x256\! $name $name done
            25

            步骤 3 :然后在 Caffe-master 中创建 myself 文件夹,编写修改如图 22 ,命名为 create_imagenet.sh.的 sh 文件,该 sh 文件可从 Caffe 自带的 imagenet 例程中找到,注意训 练和测试文档的路径设置,运行该 sh.。

            图 22

            create_imagenet.sh 文件

            最后得到两个声谱图数据库, 一个为训练数据库, 一个为测试数据库, 如图 23 所示, 这两个声谱图数据库就是 Caffe 的最终输入数据形式。

            图 23

            输入 Caffe 平台的两个声谱图数据库

            步骤 4:计算图像均值。Caffe 程序需要我们从每张图片减去均值,所以我们必须获 得训练的均值 (Jia Y., et al, 2014) , 用 tools/compute_image_mean.cpp 实现, 可使用 Caffe 自带的./make_imagenet_mean.sh,加以修改应用就行,注意路径,如图 24 所示。

            图 24

            ./make_imagenet_mean.sh 文件

            26

            3.4 训练数据 3.4.1 Caffe 平台搭建网络的方法 Caffe 提供一个网络框架搭建方法,只需要如图 25 所示,用左边的描述语言进行描 述, 即可形成右边这样的网络模型。 描述性语言在 txt 中命名为 train.prototxt 和 val.prototxt 保存则可在 Caffe 中根据该网络进行训练和测试数据。

            图 25

            网络结构描述性语言

            其中灰色框图为对输入层的描述,命名为 mnist,该层调用的是处理数据(data)的函 数, 其来源为 5.2.3 所介绍的图片数据库 train-leveldb,然后是规定一些参数,如训练批次 (batchsize) 即为每次同时输入的图片数目, 此目的为提高速度。 之后, 它用 top: "data" 、 top: "label",这些词语表明这一层的输出数据名称分别为数据(data)和标签(label) 。 粉 红色框图 对线性 分 类 层进行描述,命 名 为 ip ,该层调用的是 处理 内部产 生 (innerproduct)数据的函数,然后是规定一些参数,如本层的输出是 10 维的数据,其权 重算法是 xavier。之后,它用 bottom: "data" 、top: "ip",表明这一层上接数据名称为数据 (data)的数据,然后输出的数据名称为 ip。 在这一层,我们如果作为卷积层或下采样层,只需写好连接关系,type 的名称为卷积 (convolution)或下采样(pooling)即可调用卷积或下采样函数,然后规定一些参数即可 完成。中间只要连接关系正确,则可以有很多层。 最后, 紫色框图为对输出层的描述, 命名为 prob, 它调用的是分类器 (softmax_loss) 的函数,bottom: "ip" 、bottom: "label",表明这一层上接名称为 ip 和 label 的数据,最后 通过对比 ip 和 label 用作分类。
            27

            3.4.2 本论文需要使用的两种卷积神经网络 上面介绍了如何用描述性语言生成一个网络, 对本论文而言, 需用到两种卷积神经网 络模型,不过需做些改动,其基础模型,分别是一种由 1989 年 yann Lecun 提出的典型的 用来识别数字的卷积神经网络 LeNet-5 (LeCun Y., et al, 1989) , 以及一种在 2012, Hinton 与其学生在 NIPS2012 上发表的论文的卷积神经网络模型(Krizhevsky A,et al,2012) 。 模型一:LeNet-5 卷积神经网络。其是应用很广泛的网络,连接方式如图 26 所示。

            图 26

            LeNet-5 网络结构示意图

            该输入的是32 × 32像素的矩阵。在第一个卷积层 C1 中,使用 6 种5 × 5的滤波器对 输入图像进行步长为 1 的卷积,得到 6 张特征图,根据式 2.18 可知,每张特征图的大小 为28 × 28。 然后是第一个下采样层 S2, 对 6 张特征图进行下采样处理, 根据本论文 2.3.2 可知,这时每张特征图大小变成14 × 14。然后进入第二个卷积层 C3,需要注意的是,C3 层是根据一定规律对 S2 层的特征图使用5 × 5的滤波器进行组合卷积的, 如 C3 层第一次 选择是 S2 层中第 0、1、2 张特征图,第二次选择是 S2 中 1、2、3 张特征图(LeCun Y., et al, 1989) 。 如此 16 张10 × 10特征图, 在 S4 中进行第二次下采样得 16 张5 × 5特征图。 然后在 C5 层,利用 120 个5 × 5滤波器对 S4 所有 16 张特征图进行全连接的卷积操作, 生成 120 张1 × 1的特征图,此时即为 120 维的数据,然后再进行两层的全连接网络,进 行普通神经网络的降维,最终输出1 × 10的向量。其采用‘one-of-c’的方法,输出结果 的向量中最大分量对应位置就是输出的分类结果,其对于训练集标签也是同样的方式编 码,以此来检验正确度。上面每层卷积层和下采样层后均经过激活函数。 模型二:Hinton 与其学生在 NIPS2012 上发表的论文的卷积神经网络模型 ImageNet。 该模型最初是 Hinton 等人为了回应别人对 deep learning 的质疑而将该模型用于 ImageNet (图像识别领域最大的数据库)上的,最终取得很惊人的成果。其 top-5 错误率相对比第
            28

            二名采用的方法 state of the art 的 25%,低至 17%(Krizhevsky A,et al,2012) 。 这里提一下,Hinton 他们使用的数据库 ImageNet 目前共包含大约 22000 类,15 兆左 右的标定图像。而他们在那次实验用的是最常用的 LSVRC-2010 contest,包含 1000 类, 1.2 兆图像。这样的识别率是很高的。 ImageNet 的连接方式如图 27 所示, 由一个输入层, 五个卷积层, 三个全连接层组成。 需要注意的是,该模型是两个 GPU 同时运行的,所以画成上下两部分,然后,没有画出 下采样层,同时,每次卷积和下采样后均需经过激活函数,后面不再注明。其过程如下:

            图 27

            ImageNet 网络结构示意图

            输入层:该输入是224 × 224 × 3的图像,其原因是彩色图像有 3 个通道。 卷积层 1+下采样:由 96 个11 × 11 × 3的滤波器,步长为 4 对输入层进行卷积,然后 根据式 2.18,得出 96 个55 × 55的特征图。然后进行 Maxpooling 的下采样,其下采样窗 为3 × 3,步长为 2,最终得出 96 个27 × 27的特征图(在图 27 中没有画出) 。 卷积层 2+下采样:由 256 个5 × 5 × 48的滤波器对卷积层 1 下采样后的数据进行卷 积, 这里需要注意的是, 这里会为图像两边各补充 2 个像素点, 所以公式为(27 ? 5 + 2 × 2 + 1)/1得出 256 个 27×27 的特征图。然后进行 Maxpooling 的下采样,其下采样窗为 3 × 3,步长为 2,最终得出 256 个13 × 13的特征图(在图 27 中没画出) 。 卷积层 3:用 384 个3 × 3 × 256的滤波器对卷积层 2 下采样后的数据进行卷积,这里 需要注意的是,会为图像两边各补充 1 个像素点,所以公式为(13 ? 3 + 2 × 1 + 1)/1得 出 384 个 13×13 的特征图,结果在两个 GPU 共同存储,这是两个 GPU 进行的唯一一次 交流,然后不进行下采样。

            29

            卷积层 4:除了其卷积对象是卷积层 3 的数据,GPU 不进行数据交流,其余步骤和卷 积层 3 一样,得 384 个 13×13 特征图。 卷积层 5:用 256 个 3×3× 192 的滤波器对卷积层 4 的数据进行卷积,这里会为图像 两边各补充 1 个像素点,得到 256 个 13×13 特征图, 。然后进行 Maxpooling 的下采样, 其下采样窗为3 × 3,步长为 2,最终得出 256 个6 × 6的特征图(在图 27 中没画出) 。 全连接层 1:将卷积层 5 的下采样后的256 个 6 × 6 特征图的像素排成一列,即共有 9216 个元素作为输入,然后调用神经网络将之全连接降维度到 4096 维。 全连接层 2:将全连接层 1 的数据经过全连接神经网络后,输出 4096 维数据。 全连接层 3:将全连接层 2 的数据经过全连接神经网络降维后,输出 1000 维数据。

            3.4.3 使用 Caffe 平台搭建本论文需要使用的两种卷积神经网络 对于 LeNet-5 卷积神经网络,由于开始是运用于灰度图上的,因此,需要改动一些参 数,使其更适合用于彩色图像。Caffe 有提供一种 cifar 的卷积神经网络模型,其主要是为 了识别 cifar-10 的 10 类彩色图像数据库,而由 LeNet-5 改动的模型。使用 LeNet-5 卷积 神经网络结果的目的是为了对照,因此,本论文在这里采用 Caffe 提供的 cifar 卷积神经 网络模型描述文件 cifar10_train.prototxt 和 cifar10_val.prototxt,如图 28 所示。

            图 28

            cifar 卷积神经网络模型描述文件

            对比 LeNet-5 卷积神经网络,其不同点在于第一、二、三次卷积分别用 32、32、64 个 滤波器,在卷积时需要对图像两边补充两个像素点,其采用的下采样为 3×3 的采样窗, 步长为 2,其余结构和参数均没太大差别。

            30

            对于 Imagenet 卷积神经网络,Caffe 也有提供该网络模型描述文件,其在论文 17 中 介绍了该模型在 Caffe 上的网络结构。对比 Hinton 的论文 19 中提到的模型,其主要是多 了图片的输入是 256×256,然后通过一个 227×227 的窗户来获取数据,该窗户扫描图 片,因此一张图片可以获得多个 227×227 的某部分图片,从而增加样本。其在 Caffe 上 的结构如图 29 所示。

            图 29

            Caffe 上 Imagenet 的结构

            其像如图 30 所示的两个文件 train.prototxt 和 val.prototxt 这样描述。

            图 30

            train.prototxt 和 val.prototxt 文件

            这是使用 Caffe 平台搭建两种本实验需要用到的卷积神经网络最简便的方法,目前阶 段实验先使用 Caffe 提供的例子模型结构作为对照,然后通过一些实验对该模型结构作 一些调整,从实验的结果证明哪些可以提高识别率。具体的实验和实验结果在后面章节 有描述。

            31

            3.4.4 在 Caffe 平台训练两种卷积神经网络 在 Caffe 上写好了网络描述文件后,准备好数据,当编好参数描述文件,即可进行训 练。 cifar 和 Imagenet 卷积神经网络, 训练网络参数文件描述语分别如下图 31 左右所示。

            图 31

            cifar 和 Imagenet 参数文件描述语句

            现在以 Imagenet 参数文件为例说明语句。 test_iter: 2 指测试批次,val.prototxt 文件每批次 batch 数和之相乘应等于测试样本数 test_interval: 40 是指每 40 次进行一次迭代测试 base_lr: 0.001 是基础学习率,即对应本论文 2.1 中的学习率μ,对识别率影响很大 lr_policy: "step"学习率变化,这里可以设置学习率变化策略 gamma: 0.1 学习率变化的比率,学习率慢慢变小,可以使结果收敛 stepsize: 10000 每 10000 次迭代减少学习率 display: 120 每迭代 120 次测试一次数据 max_iter: 50000 最大迭代次数 momentum: 0.9 初始化权值时的参数 weight_decay: 0.00005 初始化权值时的参数 snapshot: 2000 每迭代 2000 次进行一次模型的保存。 snapshot_prefix: "Caffe_15s_lr0.0005_imagenet_train" 保存的名字

            32

            当写完参数配置文件 solver.prototxt 后,调用./train_imagenet.sh 即可进行训练,注意 路径。这些参数的修改对识别率也有影响,具体在后面实验证明。 还 有 一 些 .sh 文 件 如 调 用 ./resume_imagenet.sh 可 以 读 取 保 存 的 模 型 训 练 , 调 用./finetune_GTZAN.sh 可以微调数据。该训练过程的运算可以参考本论文 2.3 中卷积神 经网络的算法。

            3.5 结果输出 在调用./train_imagenet.sh 后,如 GTZAN 的某次实验,其训练过程及结果将如图 32 在终端所示:

            图 32

            声音分类的训练过程与结果

            举例说明,如 Iteration 1840 代表模型的迭代次数为 1840 次,迭代次数的意思是,一 次迭代代表一个批次的训练样本完成一次网络的训练。Test score #0: 0.74 代表一个批次 测试数据代入模型中,经过与标签对比,得出的识别率,0.74 代表 74%的正确率。Test score #1: 0.814271 代表损失函数的值,该值越低则代表误差越小。 然而,终端显示的识别率只是某个批次的测试样本,而不是全部,为了方便统计,本 论文还在 python 上写了一段程序。调用该程序后,可以将所有测试样本放进去保存的模 型中进行测试,输出直观的结果,如图 33 所示,
            33

            图 33 左中, 上面为本次实验所用到的模型, 下面为 top-1 的识别率, 不采用 oversample 方法,然后纵坐标代表标签,横坐标代表网络输出的结果,如果标签和网络输出的结果 相符的样本数比例越多,则其颜色越靠近红色。图中的识别率为 79.73%,还可以看出, 标签为 1 和 7 的音乐其颜色比标签为 3 和 4 的音乐深,证明前者的识别率比后者高,这 些信息可以为日后的研究提供方便。

            图 33

            本论文使用的 python 程序对输出结果的处理

            图 33 右中,上面具体说明某一类中的识别率,下面具体表示了每个样本输出结果和 标签的情况,这些信息在后面的研究中需要使用。

            3.6 本章小结 本节主要介绍了本篇论文如何实现基于卷积神经网络的声音数据的识别分类。先介 绍所用到实现卷积神经网络的框架 Caffe 平台,然后说明该平台如何在 linux 上搭建。之 后是本篇论文的重点,从输入—训练—输出三个方面说明如何用该平台实现声音数据的 分类。在输入里,先介绍 Caffe 平台的一般数据输入形式,然后详细介绍将声音数据转化 成声谱图输入的原因及处理方法。在训练里,先介绍 Caffe 平台如何搭建训练模型,然后 介绍本论文实验所用到的两种卷积神经模型, 之后, 详细说明如何在 Caffe 平台搭建这两 种卷积神经模型并设置参数进行训练。在输出里,主要介绍了本论文实验的结果输出形 式,以及介绍了本论文编写的 python 程序对结果的一些处理。本节中提出的将声音数据 转化成声谱图输入卷积神经网络进行训练,是本文的一大创新点。
            34

            4 实验用的数据库 GTZAN 及自己制作的 Jamendo 数据库
            4.1 GTZAN 数据库 本论文做音乐的识别分类,使用的主要数据库是音乐流派分类研究中常用的 GTZAN 数据库, 该数据库由 George Tzanetakis 等人[7]收集。 其分为 10 类, 分别为 Blues、 Classical、 Country、Disco、Hiphop、Jazz、Metal、Pop、Reggae、Rock。采样频率为 22050HZ,单 声道,au 格式。 4.2 GTZAN 的流派简介 由于本论文是对音乐流派进行分类,这里对每个流派做一个简介。 蓝调(Blues) :是一种基于五声音阶的声乐与乐器音乐,它的另一个特点是其特殊的 和声。 其来源于美国黑人奴隶的日常歌曲, 对西方现代音乐有很大影响。 包括 Jazz、 Country、 Rock、Pop 等其他流派目前均含有或多或少的蓝调的元素。 古典音乐(Classical) :是一种具有规则性本质的音乐,其特点是平衡、明晰、注重形 式的美感。其被认为具有持久的价值。本数据库的古典音乐指的是西方古典音乐,其范 围由约公元 11 世纪至今。 乡村音乐(Country) :是一种美国当代的流行音乐。主要由弦乐伴奏(通常为吉他或 电吉他、夏威夷吉他和小提琴等)和歌手的声音两部分组成。乡村音乐不使用 Pop 中使 用广泛的效果器,歌手的嗓音通常带有强烈的美国南部口音,其风格为乡村风格或牛仔 风格,其内容直白通俗。 迪斯科(Disco) :其音乐一般以 4/4 拍为主,具有强烈的节拍感,每拍都很突出,速 度大约每分钟 120 拍左右。其音乐结构非常短小,而且歌曲简单,很多段落重复。来源 于美国黑人民间舞曲和 Jazz 舞曲,在舞厅很流行。 嘻哈(Hiphop) :主要有 rap 和口技两种方式,rap 指说话或叫喊押韵歌词,运用强烈 的节奏作为伴奏。其重点在于密切配合音乐的节拍吟诵歌词。口技主要是利用人的嘴巴 模拟打击乐器。在 GTZAN 中多为前者的方式。 爵士(Jazz): Jazz 在使用乐器和演奏方法上很有特色, 其主要特点是即兴演奏、 运 用布鲁斯音阶、节奏复杂、有独特的爵士和谐、运用独特音色。 重金属音乐(Metal):是一种运用强烈的旋律与失真吉他音效的摇滚乐分类音乐。其 由咆哮或高亢激昂的嗓音、大量失真的吉他音色、密集快速的鼓点和低沉的贝斯组成。 实际是一种高爆发力、 高速、 具有重量感和破坏性的改良 Rock, 其变化来源是 Hark Rock。

            35

            流行音乐(Pop):其特点是大众化,受众很广,包含内容很多。流行音乐中器乐作品 的特点是节奏鲜明,抒情优美或轻松活泼,演奏方法多样,层次简明,乐队规模不大,多 使用电声乐器。声乐作品的特点是生活气息浓郁,歌词内容浅显易懂,抒情音域不宽,口 法通俗,易于传唱,歌手自成一格,不受声乐学派约束。 雷鬼(Reggae):其特点是有反拍上的重音。曲风上不但融合了美国节奏蓝调的抒情 曲风,还加入了拉丁音乐的热情。强调 vocal 部分,主要通过吟唱表现,并且结合吉他、 打击乐器、电子琴等带出主要的旋律和节奏。 摇滚乐(Rock):摇滚乐属于 Pop 中的一种形式,经常由显著的人声伴以吉他、鼓和 贝斯进行演出。另外,很多形态的摇滚乐也使用风琴、电子琴等键盘乐器和一些如萨克 斯管、口琴、小提琴等乐器演出。 4.3 自己制作的 Jamendo 数据库 4.3.1 Jamendo 数据库简介 在本论文的实验过程中,发现如果能预先采用一个与真正的数据库相似的数据库进 行对卷积神经网络的预训练,可以进一步的提高识别率。因此,在 Jamendo 网站上按照 GTZAN 的音乐流派,找了 10 类的音乐,每类音乐的歌曲数为 100 首。此数据库用作后 面的预训练中。本 Jamendo 数据库严格根据[7]中对数据库 GTZAN 的描述设计,并且详 细的将信息用 excel 作了记录,如图 34。

            图 34

            Jamendo 数据库的信息记录
            36

            4.3.2 Jamendo 网站介绍 本自行制作的 Jamendo 数据库主要的来源是 Jamendo 网站。该网站是一个成立于卢 森堡的音乐平台与社群网站,其所有的音乐都是用 Creative Commons 授权或者自由艺术 授权,这使得所有的下载、复制、分享、科研或商业使用的行为均是合法的。该网站支 持根据音乐内容的搜索,可以按照音乐流派、乐器、情感为标签进行搜索,这为制作这 个以流派做分类的音乐数据库提供和很大的便利。其界面如图 35 所示。

            图 35

            Jamendo 网站界面

            4.3.3 Jamendo 数据库的数据及其结构 本自行制作的数据库,根据 GTZAN 的数据特点,其数据需要满足以下的规定: (1)代表性:选择的歌曲应该尽量的具有代表性,其基本旋律或基本演奏方式能代表该 类音乐的特点。本数据库主要来自于 Jamendo 网站,该网站的标签由上传的人员自行标 注后,由音乐的专家进行审核,因此均能比较权威的代表该类的音乐。 (2)子类型的比例:一种流派,在满足其基本的特色后,还可以更细分为以什么乐器为 主的该流派音乐,还可以细分为是否含有人声的该流派音乐,这些子类型的比例根据 GTZAN 是有一定的说明的,而因为每年都有大量音乐出现,我们应根据流派特点选择数 据库的音乐的年份,如 classical 音乐需要覆盖由古到今的多种年份。 现使用 excel,统计其数据组成,即统计乐器标签、是否含人声标签、年份标签。
            37

            Blues: 主要的乐器标签是鼓 (Drum) 、 吉他 (Guitar) 、 贝司 (Bass) 、 电子乐 (Electronic) 、 键盘乐(Clavier) 、萨克斯管(Saxophone) 、钢琴(Piano)等。该流派及 Classical、Country 主要乐器比、人声音乐比、年份比例如图 36 所示。

            Blues

            Classical

            Country

            图 36

            Blues、Classical、Country 数据分布

            Disco、Hiphop、Jazz、Metal 类主要乐器比、人声音乐比、年份比例如图 37 所示。

            38

            Disco

            Hiphop

            Jazz

            Metal

            图 37

            Disco、Hiphop、Jazz、Metal 数据分布
            39

            Pop、Reggae、Rock 类主要乐器比、人声音乐比、年份比例如图 38 所示。

            Pop

            Reggae

            Rock

            图 38

            Pop、Reggae、Rock 数据分布

            4.4

            本章小结 本节主要介绍本论文所做实验需要用到的两个数据库, GTZAN 和自己制作的

            Jamendo 数据库。先简要介绍 GTZAN 数据库,然后介绍其 10 个流派的音乐特色,最后 详细介绍自己自做的 Jamendo 数据库,说明其数据来源,及数据分布。
            40

            5 实验结果
            5.1 数据输入层面的测试与分析 输入的数据会对识别率有影响,这里用实验说明在数据输入层如何做可以获得比较 好的识别率。分别从声谱图、训练样本数两方面方面进行实验。 在数据输入层面的实验中,网络结构、训练参数等都按照,保持不变。同时,都采用 同一个数据库,即 GTZAN 数据库,在本文 5.1 中有介绍。该数据的音乐采样频率为 22050HZ, 单声道, au 格式。 在这里, 为了方便实验, 取 GTZAN 数据库的 Blues 和 Classical 两类音乐,共 200 首 30 秒的歌曲,剪切成 10S 一首,共得到 600 个音乐样本。其中 450 个为训练样本数,150 个为测试样本数。

            5.1.1 声谱图实验 1 本论文首先尝试采用最简单直接的声谱图生成方法生成声谱图。 方法是直接调用 specgram 函数,设置好参数后,该函数可以直接生成声谱彩图,然 后再调用 save as 函数进行存储即可,无论声谱图生成的矩阵如何,其存储的统一大小均 为1200 × 900,其生成的声谱图有白边,然后再调用 resize 进行像素压缩为 256×256, 输入卷积神经网络进行训练测试。输入的声谱图如图 39 所示,其结果如图 48 所示。

            图 39

            声谱图实验 1 所用声谱图

            此处采用生成声谱图的参数为,重叠的长度 overlap 为 512,傅里叶变换时汉明窗的 长度 length(window())为 1024,傅里叶变换的点数 N 为 1024。

            41

            5.1.2 声谱图实验 2 在声谱图实验 1 中,发现其生成的图像是有白边的,而实际上这应该是冗余的信息, 对训练没有帮助, 因此, 使用自己编写的程序将实验 1 中的图像进行裁剪为无白边图像。 大小为923 × 733, 然后再调用 resize 进行像素压缩为256 × 256, 输入卷积神经网络进行 训练测试,其余步骤和实验 1 一样。输入的声谱图如图 40 所示,其结果在图 48 所示。

            图 40

            声谱图实验 2 所用声谱图

            5.1.3 声谱图实验 3 在前两个实验中, 使用的是彩色声谱图, 因为不能确定彩色声谱图是否效果比灰度声 谱图好,因此进行了实验 3,使用 colormap gray 函数使其生成灰度声谱图,其余实验与 实验 2 一样。输入的声谱图如图 41 所示,其结果在图 48 所示。

            图 41

            声谱图实验 3 所用声谱图
            42

            5.1.4 声谱图实验 4 声谱图实验 1、2 优点是用快捷的方法直接获得了声谱图,但是生成的声谱图的大小 都较大,为了迎合 Imagenet 网络,其输入需要调用 resize 进行像素压缩为 256×256。我 们不清楚这种 resize 的压缩是否科学, 因此希望可以直接生成256 × 256的图像作为对比。 其具体方法是,调用函数 = specgram,对声音进行短时傅里叶变换,返回声谱图矩 阵。大小取决于输入数据的维度 Nx、length(window())、overlap、N,其公式为式 4.1 和 式 4.2。生成矩阵后,用 imwrite 函数即可将该矩阵变成大小彩色声谱图存储。除数处 理方式不一样, 其余步骤和实验 2 相同。 输入声谱图如图 42 所示, 其结果在图 48 所示。

            图 42

            声谱图实验 4 所用声谱图

            此处采用生成声谱图的参数为,对输入数据的维度进行每 3.2 个点采一个点的采样, 重叠的长度 overlap 为 255,傅里叶变换时汉明窗的长度 length(window())为 510,傅里叶 变换的点数 N 为 510。 5.1.5 声谱图实验 5 如果将实验 4 的图像保存为灰度声谱图,则其结果如图 48 所示 5.1.6 声谱图实验 6 声谱图实验 5 中,由 imwrite 函数进行的声谱图存储,实际上还是存在着一个变换过 程,是一个如图 43 的矩阵,存储后自动变成图 44 的矩阵,我们不清楚这种自动的变换 是否科学,因此希望自己将矩阵转化成声谱图保存。

            43

            图 43

            矩阵

            图 44

            声谱图的矩阵

            这时,先使用式 5.3 做一个变化,求虚部和实部的模。然后归一化。归一化有两种方 法, 一种是归一化成二值图, 另一种是归一化成 0-255。 这里先使用第一种归一化做实验, 这意味着,对声谱图的所有负数归 0,然后正数归 1。由于是一个256 × 256的矩阵,而 彩色声谱图是有 3 个通道的数据的,这里只作灰度声谱图的变换,与实验 5 进行对比即 可。除了对数据的处理方式,以及最终输出是灰度声谱图,其余 与实验 5 相同。输入的声谱图如图 45 所示,其结果在图 48 所示。

            图 45

            声谱图实验 6 所用声谱图

            5.1.7 声谱图实验 7 如果对于实验 6,使用归一化成 0-255 的方式,则矩阵与声谱图矩阵的参数完全相 同,这意味着人工将矩阵变成了声谱图。通过与实验 5 进行对比,即可发现自动转换是 否合理。输入的声谱图如图 46 所示,其结果在图 48 所示。
            44

            图 46

            声谱图实验 7 所用声谱图

            5.1.8 声谱图实验 8 在实验 4 中, 我们通过 specgram 的参数设置使生成256 × 256的声谱图, 免去了 resize。 在本实验里,我们尝试通过 specgram 的参数设置使生成像素更高的照片,然后再进行 resize,对比一下前面的实验结果。输入的声谱图如图 47 所示,其结果在图 48 所示。 声 谱 图 的 参 数 为 , 重 叠 的 长 度 overlap 为 256 , 傅 里 叶 变 换 时 汉 明 窗 的 长 度 length(window())为 512,傅里叶变换的点数 2048。

            图 47

            声谱图实验 8 所用声谱图

            45

            5.1.9 声谱图实验结论 上面的 8 个声谱图实验的实验结果如图 48 所示。

            图 48

            声谱图实验结果

            其可以得出以下结论: (1)对比实验 1 和实验 2 的结果,发现无白边比有白边的识别率高 2-3 个百分点。 这是因为 Imagenet 的输入限制在 256×256,而白边这些无效的像素信息明显占用了该输 入数据的一定空间。因此,为获取更高的识别率,我们的声谱图输入之前需要去白边。 (2)对比实验 2 和实验 3,实验 4 和实验 5 的结果,发现彩色声谱图比灰度声谱图 的识别率平均低 1-2 个百分点。这是因为 Imagenet 本来是对彩色图像进行识别的网络,

            46

            因此更适合采用彩色图像。同时,彩色声谱图也比灰度声谱图的色彩更丰富,丰富的色 彩可以表示更多音频信息。因此,我们的声谱图应该是彩色的。 (3)对比实验 4 和实验 2 的结果,实验 5 和实验 3 的结果,发现通过修改声谱图参 数获得 256×256 图像比采用正常的声谱图参数再降维度获得的图像识别率低。 这是因为 尽管后者使用函数 resize 降维了,其参数仍然能够对应一张像素比较高的声谱图。而前 者虽然不使用函数降维,可是其产生的是一张像素比较低的声谱图。而一般而言,像素 越高的图片信息越多,其用来训练的识别率越好。 而再对比实验 8 的结果发现, 虽然修改声谱图参数获得一张像素更高的声谱图, 可是 使用 resize 函数降维的维度太多,其参数不能完全对应该像素比较高的声谱图,反而识 别率降低了。因此,我们的声谱图应使用声谱图参数获得一张像素适中的图后使用 resize 降维度获得。 (4) 对比实验 6 和实验 7 的结果, 声谱图矩阵归一化成-256-256 更好, 识别率更高。 而对比实验 5 和实验 6 和实验 7 的结果,识别率接近,证明声谱图函数自动生成声谱图 可很好对应其矩阵。 因此, 没必要研究声谱图矩阵转成声谱图问题, 只需自动生成即可。 综上所述,我们的声谱图应该是一张彩色无白边,使用适当声谱图参数后用 resize 降 维获得的自动生成的声谱图。其实验证明这样有较好的识别率。

            5.1.10 样本数实验和结论 在前面的声谱图实验中,取的是 GTZAN 数据库的 Blues 和 Classical 两类音乐,共 200 首 30 秒的歌曲,剪切成 10S 一首,共得 600 个音乐样本。在这里研究训练样本数对 识别率的影响,使后面做声音识别系统时更加方便。这里除了训练样本数,其余同声谱 图实验 2。样本数的实验 1、2、3、4、5 的样本数如表 1 所示。其实验结果如图 49 所示。

            表1 名称 样本数实验 1 样本数实验 2 样本数实验 3 样本数实验 4 样本数实验 5

            样本数实验的样本数比例 样本数 450 225 112 56 24
            47

            样本数:测试数 3:1 1.5:1 0.75:1 0.37:1 0.16:1

            图 49

            样本数实验的实验结果

            其可以得出如下结论,从实验 1-5 可知,识别率随样本数的增加而增加。然而,从实 验 1、 2 中可知, 当识别率到达一定的值后, 样本数的增加将不会对识别率有很大的影响, 其识别率渐趋稳定,不再随样本数的增加而变化。而实验 3、4 还是和实验 1、2 比较大 差距。另外从实验 5 可知,尽管只是用极少的样本数训练,系统仍然可以达到一定的识 别率,证明系统是比较灵敏的。 因此,我们的音乐识别系统的样本数必须足够且多,然而,当样本数到达一定量后, 不必强求更多的训练样本,在另外的方面提高识别率更有意义。

            5.2 训练层面的测试与分析 5.2.1 结构实验 1 和结论 目前比较流行的有两种卷积神经网络模型,即 LeNet-5 卷积神经网络和 ImageNet 卷 积神经网络,其具体的介绍见本文 4.4.2。其中 LeNet-5 是一种用于小数据库的比较浅层 的传统网络,其卷积层有 3 层,ImageNet 是用于大数据库的比较新的深层网络,其卷积 层有 5 层。各网络训练用的参数同本文 4.4.4。 使用数据库为 GTZAN 数据库, 在本文 5.1 中有介绍。 该数据音乐采样频率为 22050HZ, 单声道,au 格式,30 秒一首,100 首音乐一类,共 10 类,切成 10S 一首,共 3000 个样 本, 其中, 2250 个用作训练,750 个用作测试。声谱图处理同实验 2。 结果如图 50 所示。
            48

            图 50

            结构实验 1 结果

            其可以得出以下结论, ImageNet 比 LeNet-5 的平均识别率高 12%-14%, 证明 ImageNet 这种深层的输入的像素多的,运用于大数据的网络比较适合音乐识别。如果我们需要自 己设计专门用于音乐识别的卷积神经网络,我们应该考虑要有足够的深度,能输入大量 的数据进行处理的网络。

            5.2.2 结构实验 2 和结论 对于 ImageNet,由于其本身是用于识别 1000 类图片的,其输出层有 1000 个节点, 而我们的实验只是 10 类音乐,所以在最后一层需要改成输出 10 个节点。从本文 4.4.2 可 知,ImageNet 的倒数第 2 层是有 2048 个节点的,节点数对于原输出层的 1000 个节点是 合理的,可是改成 10 个节点后,则数据变化太大。这里尝试把该倒数第 2 层改为 1024 个节点。观察实验结果。其实验结果如图 51 所示:

            49

            图 51

            结构实验 2 结果

            其可以得出以下结论,在层数不变的情况下,即使把倒数第 2 层的节点数改变,也不 会对识别率有明显的影响。这里给我们的启发是,当我们设计自己的卷积神经网络时, 不必过于考虑全连接层的节点数,只需有一定的比例即可。

            5.2.3 微调实验和结论 音乐是不停更新的,如果我们的模型保持不变,则不能适应更多新的音乐,而如果要 学习新的音乐,则可能需要重新训练。但重新训练是一种很不科学的行为,因此,在这里 尝试使用旧的音乐分类模型的参数初始化新的音乐分类模型,然后让新的音乐分类模型 通过学习新的音乐进一步对旧的音乐分类模型变得更丰富。 这样做的好处主要有, (1)模型可以不断更新,变得越来越丰富。 (2)如果设计一些 特定的音乐分类系统,可以用已经存在的权威的音乐分类模型的参数进行初始化,则可 能节省时间和更加准确。 本实验是一个比较重要的实验,也是本文很主要的创新点之一。因此,本文专门设计 了一个 Jamendo 数据库(见本文 5.3) ,该数据库共有 1000 首音乐,10 类,音乐长度在 0.5-6 分钟,每首音乐切去开头与结束的 10S,wav 格式,采样频率 22050Hz,共 30645 个 训练样本,2897 个测试样本。其每类的样本比例见图 52 所示。

            50

            图 52

            Jamendo 数据库每类音乐样本数

            然后跑出来一个识别率较好的音乐分类模型,用该模型参数进行初始化,用来训练 GTZAN 数据库并观察结果。 所用的实验数据库和结构同结构实验 1,所用的声谱图同声谱图实验 2。其进行微调 后的 GTZAN 数据库实验结果如图 53 所示。

            图 53

            微调实验结果

            51

            其可以得出的结论是, 微调后的 GTZAN 数据库的识别率比微调前的识别率高 6-8%, 证明微调对音乐分类系统的识别率提高很有帮助。给我们的启发是,我们使用微调来对 音乐识别系统进行初始化,可以让音乐识别系统与时俱进,同时也可以让音乐识别系统 获取旧的一些信息作为参考,从而进一步提高识别率。因此,我们需要使用微调这个方 法来制作音乐分类识别系统。

            5.2.4 学习率实验和结论 从本文 2.1.2 的介绍中可以知道,学习率是影响训练精度的很重要因素。如果学习率 太小,算法容易收敛,但收敛速度太慢,学习率太大,则学习速度快,但可能导致振荡或发 散。因此,学习率的初始化值得我们研究。本次使用 4 种学习率,分别为 0.01、0.001、 0.005、0.0008 其结果图 54 所示: 所用的实验数据库和结构同结构实验 1,所用的声谱图同声谱图实验 2,微调。

            图 54

            学习率实验结论

            其可以得出的结论为,学习率对音乐分类识别系统的影响比较大,而根据实验结果, 学习率选择 0.001 有较好的识别率。

            52

            5.3 输出层面的测试与分析 在 Caffe 的输出样本中,其识别率是对每个样本的。而对于一首音乐而言,只要它大 部分被认为是某一类,则可归于该类。因此,对于本论文的 GTZAN 数据库,其歌曲是每 首 30S,被切成 3 段的,只要 3 段里面有 2 段认为是某一类,则那首歌应该被归于某一 类。使用 Matlab 对程序结果进行处理,其程序见附录。 所用网络、 数据库、 声谱图处理、 同学习率实验, 学习率取 0.005, 结果如图 55 所示:

            图 55

            输出层面实验结果

            其可以得出的结论为,使用该方法处理实验结果,可以提高识别率,这是因为目前硬 件的制约,卷积神经网络不能同时输入太多数据进去识别分类,而将音乐分开一段段的 进去识别分类再组合,则可以避免该问题。因此,在音乐识别分类系统中,应该将一首音 乐分成若干段,然后只要若干段中按照一定的比例属于某段,则将该首音乐归于某段。

            5.4 本章小结 本章主要是对基于 CNN 的音乐分类识系统进行多种测试和分析,从而得出较好的参 数及证明可行性。数据输入层面,给出 8 种不同的声谱图测试和 5 种样本数不同的测试 并分析其结果。训练层面,进行 2 种模型的对比测试、结构的节点测试、微调测试及 4 种 学习率测试并分析其结果。输出层面进行结果综合判断测试并分析其结果。经实验,不 但通过各种改进实验获得本系统参数设置理论, 同时还可展示本系统的准确性和有效性。
            53

            6 总结与展望
            6.1 总结 6.1.1 本文的音乐分类识别系统一般方法归纳 本文的主要工作是提出一种使用卷积神经网络模型识别分类音乐的方法。 综合本文 4、 5 章,可归纳为一般制造方法: (1)将音乐样本平均剪切成若干段,按照一定参数变成声谱图样本。 (2)根据需求,选择合适的模型结构、学习率在 Caffe 平台上搭建卷积神经网络。 (3)将声谱图样本按照一定的训练、测试比例在 Caffe 平台上转成特定的数据库。 (4)自行在网上搜集其他的音乐样本,将该些样本变成声谱图样本后,在(2)上搭 建的卷积神经网络上训练获得预训练模型。 (5)将(3)所得数据库放进预训练模型中微调训练,得出音乐分类识别系统模型。 (6)将(5)所得的模型,使用测试样本对其进行测试,只要同一首歌的一定比率样 本属于某类,则该歌属于该类。 6.1.2 本文最终的音乐分类识别系统的参数与结果 综合本文第 6 章的实验,可以得出本文音乐分类识别系统最终选用参数如表 2 所示:

            表2 层面 参数类型

            本文经过实验得出来的最佳音乐分类识别系统参数 选用参数 短时傅里叶变换参数:傅里叶变换的点数 N:1024 overlap:

            输入层

            声谱图

            512;length(window()):1024; 方法:直接调用 Matlab 函数绘制声谱彩图后剪切白边再用 resize 降维获得

            输入层 训练层 训练层 训练层 训练层 输出层

            数据库 网络结构 是否微调 数据库 学习率 数据结合

            GTZAN 数据库 10 类音乐,每首切成 10S,采样频率 22050Hz,共 2250 个训练样本和 750 个测试样本。 改进的 Imagenet 是 Jamendo 数据库 0.001 是

            54

            除了数据结合实验结果如图 56 所示。经输出处理后,其最终实验结果如图 57 所示。

            图 56

            除输出层处理的最终实验结果

            图 57

            最终实验结果

            该结果最终收敛在 90± 1%,比 2014 年,Siddharth Sigtia 和 Simon Dixon 据深度学习 算法的原理自行编制模型在该数据库上识别率 83%+1.1%高。 为了对比, 本文的数据库采 用的训练与测试样本比例和该论文的 3:1 比率相同, 而且如加上后期的输出处理, 则同样 是用 30S 的测试样本作测试,对音乐采样率均相同。虽在对 GTZAN 数据库的样本训练 测试比例等无详细提及难以比较, 2015 年, 复旦大学在五层 CNN 上识别率只是为 83.9%。 6.1.3 本文提出的音乐分类识别系统的优点及创新性 本文提出的基于卷积神经网络的音乐分类识别系统的优点为: (1)训练快速。本文提出使用声谱图作为训练样本,而一首歌变成一张声谱图,其大小 从平均 5000 多 K 压缩到 20K,压缩了 250 倍,而训练样本的大小对训练时间影响很大。
            55

            (2)识别准确。虽然本文的声谱图的容量不大,但却能很好的对应音乐信息。在采用了 改进的 Imagenet 卷积神经网络进行微调后,其识别率比其他方法高。 (3)可不断更新。通过微调,训练出来的音乐分类识别系统模型可以不断学习新音乐。 (4)容错能力强。采用卷积神经网络可以降低噪声对音乐的影响。同时,通过本文的设 计程序, 将歌曲切割成若干段测试再综合判断, 即使有部分片段错误, 仍然不影响识别。 本文提出的基于卷积神经网络的音乐分类识别系统的创新性为: (1)提出声谱图作为卷积神经网络的输入。过去使用深度模型识别音乐或声音时,采用 的都是原始数据,而本文根据卷积神经网络是针对二维图像这个特点,设计了采用声谱 图作为输入,取得了很好的识别效果。 (2)提出在音乐分类识别系统上使用微调。过去使用深度模型训练时,会有少部分学者 采用微调的方法对图片数据采用微调,可是没有人尝试在音乐或声音时使用微调的方法 训练。本文通过音乐分类识别系统上的微调实验,证实了其可行性。 (3)提出将歌曲切割成若干段测试再综合判断的方法。过去学者设计音乐识别时,主要 考虑的是将整首歌放进网络识别判断,而本文考虑实际运用,为了提高容错率想出该法。 (4)通过大量实验,设计出本文的音乐分类识别系统的一般方法和参数。

            6.2 展望 深度学习是目前很热门的课题,最近每年都在 ICASSP、 NIPS、ICML 等国际会议上 看到其身影。目前深度学习主要使用在图像和语音识别上,近年来也有研究在视频识别 上。而本论文正是在该背景下,提出了一种新的使用深度学习识别语音的方法,即使用 声谱图作为训练样本,然后使用卷积神经网络识别分类音乐。而且通过大量实践,设计 了具体的声谱图制作参数,模型结构等,提出了微调、综合判断等方法。 但需要注意的是,本文使用的模型结构主要还是基于 Hinton 他们设计的 Imagenet, 而如何设计一个专门属于音乐分类识别的卷积神经网络模型,是本课题将来讨论的主要 方向。同时,本论文的音乐分类识别系统,主要还是在实验阶段,没有设计一个完整的程 序把整个方法归于一个软件,这也是本课题将来需要设计的一个部分。而且,本音乐分 类识别系统的重点在于声谱图,而其实音乐还可以转换成波形图、MFCC、灰度共生矩阵 等二维结构,这些方法还没进行探讨。 此外, 如何改进卷积神经网络学习算法、 如何把音乐分类识别拓展到情感分类识别等, 也是本课题长期关注的部分。
            56

            6.3 例子展示 此处使用 Ipython Notebook,对某首音乐作一次分类识别,从而展示本论文的分类识 别过程及结果。所采用的模型为本文 7.1.2 的模型。首先,从 GTZAN 的 classical 类中取 第 86 首音乐。经过剪切成 10s,声谱图处理,其输入如图 58 所示。其训练过程如图 59 所示:

            图 58

            classical 类第 86 首音乐的三张声谱

            图 59

            第一张声谱图的训练流程 1

            57

            图 60

            第一张声谱图的训练流程 2

            最终根据输出层输出的最大值,划定类别,其余两张声谱图同样处理,若有两张以 上其值为 1,则属于 classical 类。

            58

            参 考 文 献

            59

            60

            61


            附录 1 歌曲剪切程序



            function aucut(t,overlap) % t 为切割秒数,overlap 为样本重叠秒数 foldername=num2str(t); %记录秒数并创建以秒数命名的文件夹 foldername=strcat(foldername,'s'); mkdir(foldername);

            a=dir('*.au'); %在文件夹中搜索以.au 为后缀的文件并记录,如.wav 文件则搜*.wav for i=1:length(a)%读取.au 后缀文件的数目 [y1,fs,n]=auread(a(i).name);%读取.au 文件的数值与参数,如.wav 文件则 wavread str1 = a(i).name;%记录其中一个.au 文件的名称 j=fix((length(y1)/fs-overlap)/(t-overlap));%切割后音乐的份数 for k=1:j%对每首音乐进行切割并命名 y2=y1(((k-1)*t*fs-(k-1)*overlap*fs +1):(k*t*fs-(k-1)*overlap*fs+1)); filename=strcat(str1,'_'); filename=strcat(filename,num2str(k-1)); filename=strcat(filename,'.au'); cd(foldername) %if (j<=2)|| (k~=1 && k~=j)%若是 Jamendo 数据库,则调用切去首尾 auwrite(y2,fs,n,'linear',filename);%若.wav 文件则为 wavwrite. %end cd .. end

            end End

            62

            附录 2 声谱图生成程序 mkdir('shengputu');%创建文件夹 files=dir('*.au');%搜索.au 后缀的文件 k=length(files);%统计文件的数目 R=1024;%设置窗函数长度 window=hamming(R);%使用汉明窗 N=1024;%短时傅立叶函数点数 L=512;%步长 overlap=R-L;%窗重叠点数

            for i=1:k str1 = files(i).name;%记录.au 文件名字 [x,fs]=auread(files(i).name);%读取.au 文件 figure('visible','off') x= awgn(x,100,'measured','linear'); % x= x(1:3.2:end,1); %如需要对于音乐采样调用该函数

            s=specgram(x(:,1),N,fs,window,overlap);%生成声谱图 %y=20*log10(abs(s)+eps);%如需要在转换实数和虚数 %[y,PS] = mapminmax(y,0,1);%如需要归一化成[0,1]调用 %[y,PS] = mapminmax(y,-1,1);%如需要归一化成[-1,1]调用 %y = y*255;%归一化后需转化成声谱图调用 %y=uint8(y);%归一化后需转化成声谱图调用 axis off;%关闭坐标 % imagesc(y)%把矩阵绘制成图时调用 % colormap gray %如果需要声谱图为灰度声谱图调用 str2=strcat(str1,'_'); str2=strcat(str2,num2str(i-1)); str2=strcat(str2,'.bmp'); cd shengputu % imshow(y,'border','tight');%如需显示声谱图调用
            63

            %set(gcf,'position',[0,0,255,256]);%设定 figure 的位置和大小,此处大小为 256*256 %set(gca,'DataAspectRatio',[1,1,1]);%调整坐标轴比率时调用 %set(gca,'position',[0,0,1,1]);%调整坐标轴位置时调用 f=getframe(gcf); %直接保存为声谱彩图,大小由上面呢参数决定

            imwrite(f.cdata,str2,'jpg'); % % imwrite(y,str2,'jpg');%如需要对声谱图矩阵进行处理,需要使用该函数保存 saveas(gcf,str2,'jpg');%如需直接产生大小固定的声谱图, 需要使用该函数保存 close(gcf) cd .. end

            64

            附录 3 声谱图切割程序程序 files=dir('*.jpg'); k=length(files);% mkdir GT9.5s_cut; for i=1:k RGB=imread(files(i).name);%读取图片并记录 RGB1=imcrop(RGB,[157,71,931,732]);%选取一定空间剪切 figure('visible','off') axis off cd GT9.5s_cut; str1=files(i).name; imwrite(RGB1,str1,'jpg');%保存图片 close(gcf); cd .. end

            65

            附录 4 输出层面结果处理程序 fid = fopen('/media/BOOTMENU/shengputu/name.txt');%读取声谱图路径文件 data=importdata('/media/BOOTMENU/shengputu/name.txt'); fidtrain_save = fopen('/media/BOOTMENU/shengputu/train.txt','wt');%保存训练位置 fidval_save = fopen('/media/BOOTMENU/shengputu/val.txt','wt');%保存测试文件 k=length(data); b=1; s=225;%每类的训练样本数 t=75;%每类的测试样本数 a=1; for i=1:k-1 sen1= data(i,:); sen2= data(i+1,:); sen1= cell2mat(sen1); sen2= cell2mat(sen2); ind1=strfind(sen1,'/');%给文件中一些关键词定位 ind2=strfind(sen1,'.0'); str1=sen1(ind1+1:ind2(1:1)-1);%根据定位划定路径文件中一定的区间 str2=sen2(ind1+1:ind2(1:1)-1); if strcmp(str1,str2)%若前后文件音乐类别相同,则保存该类对应的数字 sen1=strcat(sen1,'*',num2str(b-1)); sen1=strrep(sen1,'*',' '); else %若前后文件音乐类别不同,则类别对应数字加 1,保存 sen1=strcat(sen1,'*',num2str(b-1)); sen1=strrep(sen1,'*',' '); b=b+1; a=a+1; end if (i<=s)%若路径文件该类行数小于样本数,保存在训练文件 fprintf(fidtrain_save,'%s\n',num2str(sen1));
            66

            elseif (a~=1)&&((s*(a-1)+t*(a-1)+1<=i)&&(i<=a*s+t*(a-1))) fprintf(fidtrain_save,'%s\n',num2str(sen1)); Else%若路径文件该类行数大于样本数,则保存再测试文件 fprintf(fidval_save,'%s\n',num2str(sen1)); end if i==k-1%保存最后的路径文件 sen1=strcat(sen2,'*',num2str(b-1)); sen1=strrep(sen1,'*',' '); fprintf(fidval_save,'%s\n',num2str(sen1)); end end fclose(fidtrain_save);%关闭文件 fclose(fidval_save);

            67

            附录 5 输出层面结果处理程序 fid =fopen('/home/xuekaiyu/Caffe-master/examples/GTZAN/gtzan_result.txt'); data=importdata('/home/xuekaiyu/Caffe-master/examples/GTZAN/gtzan_result.txt'); k=length(data); a1=0;a2=0;t1=0;t2=0;t3=0; for i=1:3:k-2 %同时读取三个文件 sen1= data(i,:); sen2= data(i+1,:); sen3= data(i+2,:); sen1= cell2mat(sen1); sen2= cell2mat(sen2); sen3= cell2mat(sen3); ind1=strfind(sen1,'True: ');%定位标签位置 ind2=strfind(sen1,'Predict: ');%定位预测位置 ind3=strfind(sen2,'True: '); ind4=strfind(sen2,'Predict: '); ind5=strfind(sen3,'True: '); ind6=strfind(sen3,'Predict: '); str1=sen1(ind1+6:ind2-3);%根据定位取出预测数据 str2=sen1(ind2+9:end);%根据定位取出标签数据 str3=sen2(ind3+6:ind4-3); str4=sen2(ind4+9:end); str5=sen3(ind5+6:ind6-3); str6=sen3(ind6+9:end);

            if strcmp(str1,str2)%在一个文件中,如果预测数据与标签相同,则 a1 和 t1 加 1 a1=a1+1 ;00 t1=1; end

            68

            if strcmp(str3,str4) a1=a1+1; t2=1; end if strcmp(str5,str6) a1=a1+1; t3=1; end if (t1+t2+t3)>=2%如果连续三个文件有两个的 t 是相同,则归于同一类 a2=a2+1;

            end t1=0;t2=0;t3=0;

            end accuracy1=a1/k accuracy2=a2*3/k

            69

            附录 6 ipython 例子展示程序 In [1]: import numpy as np#调入 numpy 和 matplotlib.pyplot 子程序,名字为 np 和 plt import matplotlib.pyplot as plt Caffe_root = '/home/xuekaiyu/Caffe-master/' # 这里设置 Caffe 目录 import sys sys.path.insert(0, Caffe_root + 'python')#设置 python 路径到 Caffe import Caffe #运行 Caffe plt.rcParams['figure.figsize'] = (10, 10)#定义 ipython 一些图片显示的参数,图表大小为 10,图形的插值是以最近为原则,图像颜色是灰色 plt.rcParams['image.interpolation'] = 'nearest' plt.rcParams['image.cmap'] = 'gray' In [2]:#将模型放入 Caffe 中 net=Caffe.Classifier(Caffe_root+'examples/GTZAN/Caffe_imagenet_train_iter_8000') In [3]:#设置 Caffe 的参数,使用 CPU,调用 test 模块 net.set_mode_cpu() net.set_phase_test() In [4]: net.set_mean('data',Caffe_root+'examples/GTZAN/GTZAN_mean.npy') # ImageNet 均 值 net.set_channel_swap('data', (2,1,0)) # 因为模型原频道是 BGR,所以要将 RGB 转换 net.set_input_scale('data', 255) #模型需要运行在【0,255】的灰度,而不是【0,1】 In [5]:#将测试图片放进 Caffe 的模型 scores = net.predict([Caffe.io.load_image(Caffe_root+'examples/GTZAN/classical.549.jpg')]) In [6]:#得出预测图并展示 print 'predicted class:', scores plt.plot(scores[0]) print 'prediction shape:', scores[0].shape plt.show()

            print 'predicted class:', scores[0].argmax()

            In [7]: def showimage(im):#网络需要的是 BGR 格式图片,所以转换颜色频道 if im.ndim == 3: m=im[:,:,::-1] plt.imshow(im)
            70

            In [8]:# 定义模型输出的 data 的形式, 方便在 ipython 中显示, 具体为格式是 (数量, 高,宽)或(数量,高,宽,频道)的阵列表示,每个可视化由一个个网格组成 data -= data.min() data /= data.max() n = int(np.ceil(np.sqrt(data.shape[0])))

            padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((0, 0),) * (data.ndim-3) data = np.pad(data, padding, mode='constant', constant_values=(padval, padval)) data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1))) # 对图像使用滤波器 data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:]) In [9]:# 输出测试的图像,data[4]指最中间 image = net.blobs['data'].data[4].copy() showimage(image.transpose(1, 2, 0)) In [10]:# 使用 ipt.show()观看图像,后面每行均可在后面添加该函数观察图像 plt.show() In [11]:#展示 C1 层的滤波器 # the parameters are a list of [weights, biases] filters = net.params['conv1'][0].data vis_square(filters.transpose(0, 2, 3, 1)) In [12]:#展示 C1 层输出的特征图 feat = net.blobs['conv1'].data[4, :96] vis_square(feat, padval=1) In [13]:#展示 P1 层输出的特征图 feat = net.blobs['pool1'].data[0] vis_square(feat, padval=1) In [14]:#展示 C2 层的滤波器 filters = net.params['conv2'][0].data vis_square(filters[:48].reshape(48*48, 5, 5)) In [15]:#展示 C2 层输出的特征图 feat = net.blobs['conv2'].data[0, :48] vis_square(feat, padval=1) In [16]:#展示 P2 层输出的特征图
            71

            image -= image.min() image /= image.max()

            feat = net.blobs['pool2'].data[0] vis_square(feat, padval=1) In [17]:#展示 C3 层输出的特征图 feat = net.blobs['conv3'].data[0] vis_square(feat, padval=0.5) In [18]:#展示 C4 层输出的特征图 feat = net.blobs['conv4'].data[0] vis_square(feat, padval=0.5) In [19]:#展示 C5 层输出的特征图 feat = net.blobs['conv5'].data[0] vis_square(feat, padval=0.5) In [20]:#展示 P5 层输出的特征图 feat = net.blobs['pool5'].data[0] vis_square(feat, padval=1) In [21]:#展示 C6 层输出的特征图 feat = net.blobs['fc6'].data[0] plt.subplot(2, 1, 1) plt.plot(feat.flat) plt.subplot(2, 1, 2) _ = plt.hist(feat.flat[feat.flat > 0], bins=100) In [22]:#展示 C7 层输出的特征图 feat = net.blobs['fc7'].data[0] plt.subplot(2, 1, 1) plt.plot(feat.flat) plt.subplot(2, 1, 2) _ = plt.hist(feat.flat[feat.flat > 0], bins=100) In [23]:#获得输出的结果 feat = net.blobs['prob'].data[0] plt.plot(feat.flat)

            72


            相关文章:
            更多相关标签: