我正在尝试使用人工神经网络(ANN)来检测音乐音符的音高。网络是一个简单的两层多层感知器(MLP),其输入基本上是一个离散傅里叶变换(DFT)(经过平均和对数分布),12个输出对应于特定八度音阶的12个音符。
网络使用某些乐器演奏的这12个音符的多个样本(每次一个音符)以及一些“静音”样本进行训练。
结果实际上很好。网络能够相当准确地检测由不同乐器演奏的这些音符,它对噪音相对免疫,即使在播放一首歌曲时也不会完全失去理智。
然而,目标是能够检测多声音乐。因此,当两个或更多音符同时演奏时,相应的两个神经元会激活。令人惊讶的是,网络实际上已经在某种程度上做到了这一点(仅在单声音乐样本上训练),但对于多声音符的检测不如单声音符一致和准确。我的问题是如何增强它识别多声音乐的能力?
问题是我并不真正理解它为什么已经有效。不同的音符(或它们的DFT)基本上是网络训练的空间中的不同点。所以我明白它为什么能识别相似的声音(附近的点),但不明白它是如何“推断”出多个音符组合的输出(这些组合形成了与每个训练样本相距甚远的点)。就像一个AND网络在(0,0)(0,1)(1,0)=(0)上训练后,不会“推断”出(1,1)=(1)一样。
解决这个问题的一种蛮力方法是用尽可能多的多声音乐样本来训练网络。然而,既然网络似乎从单声音乐样本中隐约把握了这个概念,这里可能存在一些更根本的东西。
有什么建议吗?(顺便说一句,抱歉这篇文章有点长 🙂 )。
回答:
它已经有效的原因可能很简单,你没有训练它只选择一个输出(至少我假设你没有)。在简单的案例中,当输出只是输入和权重的点积时,权重将成为对应音高的匹配滤波器。由于一切都是线性的,如果多个匹配滤波器同时看到好的匹配(如多声音符的情况),多个输出将同时被激活。由于你的网络可能包括非线性,情况会稍微复杂一些,但基本思想可能是相同的。
关于改进的方法,确实可以用多声音乐样本进行训练。另一种可能性是切换到线性滤波器。多声音乐的DFT基本上是每个单个声音的DFT之和。你希望输入的线性组合成为输出的相应线性组合,因此线性滤波器是合适的。
顺便问一下,你为什么首先使用神经网络来做这个?似乎只需查看DFT,并说,取最大频率就能更容易地得到更好的结果。