来源:新智元 、psychologytoday作者:Navdeep Singh
本文手把手教你如何构建一个能够识别歌曲类型的神经网络。
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 loop 5
可以看到,在低频率下,低音是非常明显的。没有多少其他频率被表示。但是,口哨声的频谱图明显有更高的频率表示:
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的值。
限定歌曲以获得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%,所以这比随机猜测要好很多。
[1]marsyasweb.appspot.com/download/data_sets/.GTZAN Genre Collection
[2]https://freesound.org/people/Stereo Surgeon/sounds/266093/
[3]https://freesound.org/people/grrlrighter/sounds/98195/
原文:
https://medium.com/@navdeepsingh_2336/identifying-the-genre-of-a-song-with-neural-networks-851db89c42f0
Jeff Hawkins首提“千脑智力理论”或颠覆AI:理解人类新大脑皮层
计算机科学家、神经生物学家Jeff Hawkins提出新型框架来理解人类新大脑皮层如何运作,即“千脑智力理论”。
深度学习是人工智能最新的进展,它借鉴了人类“大脑”的大概。大多数深度学习模型的架构是基于处理层的,是一种受生物大脑神经元启发的人工神经网络。
然而,神经科学家们对于智力(Intelligence)究竟是什么,以及智力是如何在人脑中形成等问题并没有达成一致,至今任然无法解释。
2018年10月,在荷兰马斯特里赫特举行的人类大脑项目峰会上,Numenta公司的技术专家、科学家和联合创始人Jeff Hawkins提出了一个新型框架来理解人类新大脑皮层是如何运作的,被称为“千脑智力理论”。
Numenta 公司创建于2005年,致力于开发出一台和人类大脑工作原理相似的智能机器。其创始人 Jeffrey Hawkins 大名鼎鼎,既是计算机科学家,也是神经生物学家,同时还是Palm公司、Handspring公司、Redwood Neuroscience Institute 研究所的创办者。
新大脑皮层是人类大脑的一部分,它参与较为高级的功能,如意识思维、空间推理、语言、运动指令的生成和感官知觉。
Numenta的研究人员假设人类新大脑皮层的每个部分都能学习完整的对象和概念模型。该团队假设网格细胞样神经元(grid cell-like neurons)存在于人类新皮层的每一列中,并且提出了一种叫做置换细胞(displacement cell)的新型神经元,它作为网格细胞的补充,也位于整个新皮层。
网格细胞是位置调节(place-modulated)的神经元,能够对位置做出理解。研究人员认为,每个皮层列通过将输入与网格细胞来源位置相结合,然后在运动过程中进行整合,从而学习完整物体的模型。
为了说明这个概念,研究人员以咖啡杯为例做出了一定解释。
当我们看到并触摸一个咖啡杯时,视觉层次和躯体感觉层次中的许多列同时观察杯子的不同部分。 每个区域中的每一列都基于感官输入(在该示例中是视觉和触摸)学习杯子的完整模型,然后整合传感器的运动。杯子的模型是不相同的,因为杯子的每个模型都是从不同的感官阵列子集中学习的。
与通常的观点不同的是,感官输入是在皮层区域的层次结构中处理的,该理论认为连接本质上不是分层的。 相反,非分层连接可以连接大脑半球,跨越模态和层次级别。 由于非分层连接,随着传感器的移动可能会发生推断。
根据研究人员的说法,新皮层对真实世界中的每个对象都拥有成百上千个模型,并且观察到的特征集成发生在层次结构所有层中的每一列,而不仅仅是层次结构的顶层。
因此得名“千脑智力理论”。该框架重新定义了人类新大脑的功能。 根据研究人员的说法,新皮层包含数以千计的模型,不仅在层次结构中起作用,而且在并行中也起作用。
这是一种挑战传统观点的创新理论,并可能在未来影响人工智能和神经科学。
工业智能化
领取专属 10元无门槛券
私享最新 技术干货