0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

手把手教你如何构建一个能够识别歌曲类型的神经网络

DPVg_AI_era 来源:未知 作者:李倩 2018-10-27 10:11 次阅读

本文手把手教你如何构建一个能够识别歌曲类型的神经网络

DataSet: 本文使用GTZAN Genre Collection音乐数据集,地址:[1]

这个数据集包含1000首不同的歌曲,分布在10种不同流派,每个流派100首,每首歌曲大约30秒。

使用的库:Python库librosa,用于从歌曲中提取特征,并使用梅尔频率倒谱系数( Mel-frequency cepstral coefficients ,MFCC)。

MFCC数值模仿人类的听觉,在语音识别和音乐类型检测中有广泛的应用。MFCC值将被直接输入神经网络。

了解MFCC

让我们用两个例子来说明MFCC。请通过Stereo Surgeon下载Kick Loop 5[2]和Whistling[3]。其中一个是低音鼓声,另一个是高音口哨声。它们明显不同,你可以看到它们的MFCC数值是不同的。

让我们转到代码(本文的所有代码文件都可以在Github链接中找到)。

以下是你需要导入的内容列表:

librosalibrary

glob,你需要列出不同类型目录中的文件

numpy

matplotlib,绘制MFCC graphs

Keras的序列模型,一种典型的前馈神经网络

密集的神经网络层,即有很多神经元的层。

例如,与卷积不同的是,它具有2D表示。你必须使用import activation,它允许你为每个神经元层提供一个激活函数,以及to_categorical,它允许你把类的名称转换成诸如摇滚(rock),迪斯科(disco)等等,称为one-hot 编码, 如下所示:

这样,你已经正式开发了一个辅助函数来显示MFCC的值

首先,加载歌曲,然后从中提取MFCC值。然后,使用specshow,这是librosa库里的频谱图。

这是踏板鼓:

Low frequency: Kick loop5

可以看到,在低频率下,低音是非常明显的。没有多少其他频率被表示。但是,口哨声的频谱图明显有更高的频率表示:

High frequency: Whistling

颜色越深或越接近红色,在那个频率范围内的能量越大。

限定歌曲流派

你甚至可以看到口哨声的频率的变化。下面是是disco曲的频率:

Song type/genre: Disco

下面是频率输出:

Disco Songs

你可以在前面的输出中看到节拍,但由于它们只有30秒长,因此很难看到单个的节拍。将它与古典乐相比较,会发现古典音乐没有那么多的节拍,而是有连续的低音线,比如下面是来自大提琴的低音线:

Song genre: Classical

下面是嘻哈音乐(hip-hop)的频率:

Song genre:HipHop

HipHop songs

它看起来有点像disco,分辨它们之间的细微区别是神经网络的问题。

这里还有另一个辅助函数,它只加载MFCC值,但这次你是正在为神经网络做准备:

同时加载的是歌曲的MFCC值,但由于这些值可能在-250到+150之间,它们对神经网络没有什么好处。你需要输入接近-1到+1或0到1的值。

因此,需要计算出每首歌曲的最大值和绝对值。然后将所有值除以最大值。此外,歌曲的长度略有不同,因此只需要选择25000个MFCC值。你必须非常确定你输入神经网络的东西的大小总是相同,因为只有那么多的输入神经元,一旦搭建好网络就无法改变了。

限定歌曲以获得MFCC值和流派名称

接下来,有一个名为generate _features_and_labels的函数,它将遍历所有不同的流派,并遍历数据集中的所有歌曲,然后生成MFCC值和流派名:

如上面的截图所示,准备一个所有特征和标签的列表。遍历全部10种流派。对于每种流派,请查看该文件夹中的文件。'generes /'+ genre +'/ *。au'文件夹显示数据集的组织方式。

处理这个文件夹时,每个文件会有100首歌曲; 你可以提取特征并将这些特征放在all_features.append(features)列表中。那首歌曲的流派名称也需要列在一个列表中。因此,最终,所有features将包含1000个条目,所有标签也将包含1000个条目。在所有feature的情况下,这1000个条目中的每一个都将有25000个条目。这是一个1000 x 25000矩阵。

对于目前的所有标签,有一个1000 entry的列表,里面是蓝调、古典、乡村、迪斯科、嘻哈、爵士、金属、流行、雷鬼和摇滚等等词汇。这就成问题了,因为神经网络不会预测单词或预测字母。你需要给它一个one-hot编码,这意味着这里的每个单词都将被表示为十个二进制数。

蓝调(blues)的情况下,它是1后面跟着9个0。

古典(classical)的情况是,是0后面跟着1,再跟着9个0。以此类推。首先,通过np.unique(all_labels, return_inverse=True) 命令将它们作为整数返回来计算所有唯一的名称。然后,使用to_categorical,将这些整数转换为one-hot编码。

那么,返回的是1000x10维。因为有1000首歌曲,每个歌曲都有10个二进制数字来表示单热编码。然后,通过命令return np.stack(all_features)返回堆叠在一起的所有特征,onehot_labels到单个矩阵,以及one-hot矩阵。因此,调用上层函数并保存特征和标签:

为了确保正确,请打印如下面的截图所示的特性和标签的形状。特性是1000×25000,标签是1000×10。现在,将数据集拆分为一个列并测试拆分。将80%的标记定义为training_split= 0.8,以执行拆分:

接下来,构建神经网络:

你会得到一个序列神经网络。第一层是100个神经元的dense layer。在第一层,你需要给出输入尺寸或输入形状,在这个例子里,就是25000。

这表示每个示例有多少输入值。25000将连接到第一层中的100。

第一层将对其输入,权重和偏差项进行加权求和,然后运行relu激活函数。relu表示任何小于0的都会变成0,任何高于0的都是值本身。

然后,这100个将连接到另外10个,就是输出层。之所以是10,是因为你已经完成了one-hot编码并且在编码中有10个二进制数。

代码中使用的激活softmax告诉你取10的输出并对它们进行规范化,使它们加起来为1。这样,它们最终成为了概率。现在考虑10个中的得分最高或概率最高的作为预测。这将直接对应于最高数字位置。例如,如果它在位置4,那么它就是disco。

接下来,编译模型,选择Adam等优化器,并定义损失函数。由于你有多个输出,你可能希望进行分类交叉熵和度量准确性,以便除了始终显示的损失之外,还可以在评估期间看到准确度。但是,准确度更有意义。接下来,打印model.summary,它会告诉你有关层的详细信息。它看起来是这样的:

第一个100神经元的层的输出形状肯定是100个值,因为有100个神经元,而密集的第二层的输出是10,因为有10个神经元。那么,为什么第一层有250万个参数或权重?这是因为你有25000个输入。

你有25000个输入,每个输入都会进入100个密集神经元中的一个。因此,也就是250万个,然后加上100,因为100个个神经元中每个都有自己的bias term,它自身的偏差权重也需要学习。

你有大约250万个参数或权重。接下来,运行拟合。这需要训练输入和训练标签,并获取你想要的epochs数量。你想要10,所以在经过训练的输入上重复10次。它需要一个batch size来告诉你这个数字,在这种情况下,歌曲在更新权重之前要遍历;并且validation_split是0.2,表示要接受20%的训练输入,将其拆分出来,实际上并没有对其进行训练,并用它来评估每个epoch之后它的表现如何。实际上从来没有训练验证拆分,但验证拆分可让你随时查看进度。

最后,因为你提前将训练和测试分开了,所以对测试、测试数据进行评估,并打印出测试数据的损失和准确度。以下是训练结果:

它边运行边打印,并始终打印损失和准确性。这是在训练集本身,而不是验证集上,所以这应该非常接近1.0。你可能不希望它接近1.0,因为这可能代表过拟合,但是如果你让它持续足够长时间,通常会在训练集上达到1.0的精度,因为它会记住训练集。

你真正关心的是验证的准确度,这就需要使用测试集。测试集是以前从未见过的数据,至少不是用于训练的数据。最终的准确性取决于你提前分离的测试数据。现在你的准确度大约为53%。这看起来比较低,但要知道有10种不同的流派。随机猜测的准确率是10%,所以这比随机猜测要好很多。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4539

    浏览量

    98439
  • 语音识别
    +关注

    关注

    37

    文章

    1633

    浏览量

    111796

原文标题:【干货】用神经网络识别歌曲流派(附代码)

文章出处:【微信号:AI_era,微信公众号:新智元】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于labview的BP人工神经网络曲线拟合小程序

    `点击学习>>《龙哥手把手教你学LabVIEW视觉设计》视频教程用LabVIEW实现的BP人工神经网络曲线拟合,感谢LabVIEW的矩阵运算函数,程序流程较之文本型语言清晰很多。[hide] [/hide]`
    发表于 12-13 16:41

    手把手教你使用QUARTUS

    手把手教你使用QUARTUS
    发表于 12-29 20:35

    手把手教你构建一个完整的工程

    手把手教你构建一个完整的工程
    发表于 08-03 09:54 33次下载
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b><b class='flag-5'>构建</b>一个完整的工程

    美女手把手教你如何装机(中)

    美女手把手教你如何装机(中) 再来是硬碟的部份,这款机壳还不错,可以旋转支架~
    发表于 01-27 11:14 1344次阅读

    美女手把手教你如何装机(下)

    美女手把手教你如何装机(下) 接著下来就是今天的重头戏,开核萝!~
    发表于 01-27 11:16 2862次阅读

    手把手教你学DSP28335_张卿杰

    手把手教你学DSP28335张卿杰百度云分享手把手教你学DSP28335张卿杰百度云分享
    发表于 01-11 11:45 173次下载

    手把手教你学习FPGA—LED篇

    电子专业单片机相关知识学习教材资料——手把手教你学习FPGA—LED篇
    发表于 08-08 17:19 0次下载

    手把手教你做彩铃电子时钟---第1章

    手把手教你做彩铃电子时钟全部资料
    发表于 11-14 17:15 7次下载

    手把手教你做彩铃电子时钟--第7章

    手把手教你做彩铃电子时钟
    发表于 11-14 17:05 6次下载

    手把手教你做彩铃电子时钟---第12章

    手把手教你做彩铃电子时钟
    发表于 11-14 16:59 9次下载

    手把手教你如何开始DSP编程

    手把手教你如何开始DSP编程。
    发表于 04-09 11:54 12次下载
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>如何开始DSP编程

    手把手教你学LabVIEW视觉设计

    手把手教你学LabVIEW视觉设计手把手教你学LabVIEW视觉设计手把手教你学LabVIEW视
    发表于 03-06 01:41 2732次阅读

    手把手教你开关电源PCB排板

    手把手教你开关电源PCB排板(新型电源技术)-分享一下开关电源PCB排板的基本要点及分析,以及例子讲解。绝对的手把手
    发表于 09-18 12:27 48次下载
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>开关电源PCB排板

    手把手教你学DSP-基于TMS320X281x

    顾卫刚手把手教你学DSP
    发表于 05-24 16:06 26次下载

    手把手教你学FPGA仿真

    电子发烧友网站提供《手把手教你学FPGA仿真.pdf》资料免费下载
    发表于 10-19 09:17 1次下载
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>学FPGA仿真