作者 |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 是因为:
- 数据的长度不须要固定。对于每一个输出,数据长度可能会有所不同。
- 能够存储序列。
- 能够应用输出和输入序列长度的各种组合。
除了个别的 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))
以下是一些生成的音乐片段:
- https://soundcloud.com/ramya-…
- https://soundcloud.com/ramya-…
- https://soundcloud.com/ramya-…
- https://soundcloud.com/ramya-…
- 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/