乐趣区

关于人工智能:通过深层神经网络生成音乐

作者 |Ramya Vidiyala
编译 |VK
起源 |Towards Data Science

深度学习改善了咱们生存的许多方面,无论是显著的还是奥妙的。深度学习在电影举荐零碎、垃圾邮件检测和计算机视觉等过程中起着关键作用。

只管围绕深度学习作为黑匣子和训练难度的探讨仍在进行,但在医学、虚构助理和电子商务等泛滥畛域都存在着微小的后劲。

在艺术和技术的交叉点,深度学习能够发挥作用。为了进一步探讨这一想法,在本文中,咱们将钻研通过深度学习过程生成机器学习音乐的过程,许多人认为这一畛域超出了机器的范畴(也是另一个强烈答辩的乏味畛域!)。

目录

  • 机器学习模型的音乐体现
  • 音乐数据集
  • 数据处理
  • 模型抉择
  • RNN
  • 工夫散布全连贯层
  • 状态
  • Dropout 层
  • Softmax 层
  • 优化器
  • 音乐生成
  • 摘要

机器学习模型的音乐体现

咱们将应用 ABC 音乐符号。ABC 记谱法是一种简写的乐谱法,它应用字母 a 到 G 来示意音符,并应用其余元素来搁置附加值。这些附加值包含音符长度、键和装璜。

这种模式的符号开始时是一种 ASCII 字符集代码,以便于在线音乐共享,为软件开发人员增加了一种新的简略的语言,便于应用。以下是 ABC 音乐符号。

乐谱记谱法第 1 局部中的行显示一个字母后跟一个冒号。这些示意曲调的各个方面,例如当文件中有多个曲调时的索引(X:)、题目(T:)、工夫签名(M:)、默认音符长度(L:)、曲调类型(R:)和键(K:)。键名称前面代表旋律。


音乐数据集

在本文中,咱们将应用诺丁汉音乐数据库 ABC 版上提供的开源数据。它蕴含了 1000 多首民谣曲调,其中绝大多数已被转换成 ABC 符号:http://abc.sourceforge.net/NMD/

数据处理

数据以后是基于字符的分类格局。在数据处理阶段,咱们须要将数据转换成基于整数的数值格局,为神经网络的工作做好筹备。

这里每个字符都映射到一个惟一的整数。这能够通过应用一行代码来实现。“text”变量是输出数据。

char_to_idx = {ch: i for (i, ch) in enumerate(sorted(list(set(text)))) }

为了训练模型,咱们应用 vocab 将整个文本数据转换成数字格局。

T = np.asarray([char_to_idx for c in text], dtype=np.int32)

机器学习音乐生成的模型抉择

在传统的机器学习模型中,咱们无奈存储模型的前一阶段。然而,咱们能够用循环神经网络(通常称为 RNN)来存储之前的阶段。

RNN 有一个反复模块,它从前一级获取输出,并将其输入作为下一级的输出。然而,RNN 只能保留最近阶段的信息,因而咱们的网络须要更多的内存来学习长期依赖关系。这就是长短期记忆网络(LSTMs)。

LSTMs 是 RNNs 的一个特例,具备与 RNNs 雷同的链状构造,但有不同的反复模块构造。

这里应用 RNN 是因为:

  1. 数据的长度不须要固定。对于每一个输出,数据长度可能会有所不同。
  2. 能够存储序列。
  3. 能够应用输出和输入序列长度的各种组合。

除了个别的 RNN,咱们还将通过增加一些调整来定制它以适应咱们的用例。咱们将应用“字符级 RNN”。在字符 RNNs 中,输出、输入和转换输入都是以字符的模式呈现的。

RNN

因为咱们须要在每个工夫戳上生成输入,所以咱们将应用许多 RNN。为了实现多个 RNN,咱们须要将参数“return_sequences”设置为 true,以便在每个工夫戳上生成每个字符。通过查看上面的图 5,你能够更好地了解它。

在上图中,蓝色单位是输出单位,黄色单位是暗藏单位,绿色单位是输入单位。这是许多 RNN 的简略概述。为了更具体地理解 RNN 序列,这里有一个有用的资源:http://karpathy.github.io/201…

工夫散布全连贯层

为了解决每个工夫戳的输入,咱们创立了一个工夫散布的全连贯层。为了实现这一点,咱们在每个工夫戳生成的输入之上创立了一个工夫散布全连贯层。

状态

通过将参数 stateful 设置为 true,批处理的输入将作为输出传递给下一批。在组合了所有特色之后,咱们的模型将如上面图 6 所示的概述。

模型体系结构的代码片段如下:

model = Sequential()
model.add(Embedding(vocab_size, 512, batch_input_shape=(BATCH_SIZE, SEQ_LENGTH)))

for i in range(3):

     model.add(LSTM(256, return_sequences=True, stateful=True))
     model.add(Dropout(0.2))
     
model.add(TimeDistributed(Dense(vocab_size)))
model.add(Activation('softmax'))

model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

我强烈建议你应用层来进步性能。

Dropout 层

Dropout 层是一种正则化技术,在训练过程中,每次更新时将输出单元的一小部分归零,以避免过拟合。

Softmax 层

音乐的生成是一个多类分类问题,每个类都是输出数据中惟一的字符。因而,咱们在咱们的模型上应用了一个 softmax 层,并将分类穿插熵作为一个损失函数。

这一层给出了每个类的概率。从概率列表中,咱们抉择概率最大的一个。

优化器

为了优化咱们的模型,咱们应用自适应矩预计,也称为 Adam,因为它是 RNN 的一个很好的抉择。

生成音乐

到目前为止,咱们创立了一个 RNN 模型,并依据咱们的输出数据对其进行训练。该模型在训练阶段学习输出数据的模式。咱们把这个模型称为“训练模型”。

在训练模型中应用的输出大小是批大小。对于通过机器学习产生的音乐来说,输出大小是单个字符。所以咱们创立了一个新的模型,它和 ”” 训练模型 ”” 类似,然而输出一个字符的大小是 (1,1)。在这个新模型中,咱们从训练模型中加载权重来复制训练模型的特色。

model2 = Sequential()

model2.add(Embedding(vocab_size, 512, batch_input_shape=(1,1)))

for i in range(3): 
     model2.add(LSTM(256, return_sequences=True, stateful=True))
     model2.add(Dropout(0.2))
     
model2.add(TimeDistributed(Dense(vocab_size)))
model2.add(Activation(‘softmax’))

咱们将训练好的模型的权重加载到新模型中。这能够通过应用一行代码来实现。

model2.load_weights(os.path.join(MODEL_DIR,‘weights.100.h5’.format(epoch)))

model2.summary()

在音乐生成过程中,从惟一的字符集中随机抉择第一个字符,应用先前生成的字符生成下一个字符,依此类推。有了这个构造,咱们就产生了音乐。

上面是帮忙咱们实现这一点的代码片段。

sampled = []

for i in range(1024):

   batch = np.zeros((1, 1))
   
   if sampled:
   
      batch[0, 0] = sampled[-1]
      
   else:
   
      batch[0, 0] = np.random.randint(vocab_size)
      
   result = model2.predict_on_batch(batch).ravel()
   
   sample = np.random.choice(range(vocab_size), p=result)
   
   sampled.append(sample)
   
print("sampled")

print(sampled)

print(''.join(idx_to_char for c in sampled))

以下是一些生成的音乐片段:

  1. https://soundcloud.com/ramya-…
  2. https://soundcloud.com/ramya-…
  3. https://soundcloud.com/ramya-…
  4. https://soundcloud.com/ramya-…
  5. https://soundcloud.com/ramya-…

咱们应用被称为 LSTMs 的机器学习神经网络生成这些令人欢快的音乐样本。每一个片段都不同,但与训练数据类似。这些旋律可用于多种用处:

  • 通过灵感晋升艺术家的创造力
  • 作为开发新思维的生产力工具
  • 作为艺术家作品的附加曲调
  • 实现未实现的工作
  • 作为一首独立的音乐

然而,这个模型还有待改良。咱们的训练材料只有一种乐器,钢琴。咱们能够加强训练数据的一种办法是增加来自多种乐器的音乐。另一种办法是减少音乐的体裁、节奏和节奏特色。

目前,咱们的模式产生了一些假音符,音乐也不例外。咱们能够通过减少训练数据集来缩小这些谬误并进步音乐品质。


总结

在这篇文章中,咱们钻研了如何解决与神经网络一起应用的音乐,深度学习模型如 RNN 和 LSTMs 的工作原理,咱们还探讨了如何调整模型能够产生音乐。咱们能够将这些概念利用到任何其余零碎中,在这些零碎中,咱们能够生成其余模式的艺术,包含生成风景画或人像。


谢谢你的浏览!如果你想亲自体验这个定制数据集,能够在这里下载带正文的数据,并在 Github 上查看我的代码:https://github.com/RamyaVidiy…

原文链接:https://towardsdatascience.co…

欢送关注磐创 AI 博客站:
http://panchuang.net/

sklearn 机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/

退出移动版