作者|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[c] 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/2015/05/21/rnn-effectiveness/

时间分布全连接层

为了处理每个时间戳的输出,我们创建了一个时间分布的全连接层。为了实现这一点,我们在每个时间戳生成的输出之上创建了一个时间分布全连接层。

状态

通过将参数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[c] for c in sampled))

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

  1. https://soundcloud.com/ramya-vidiyala-850882745/gen-music-1

  2. https://soundcloud.com/ramya-vidiyala-850882745/gen-music-2

  3. https://soundcloud.com/ramya-vidiyala-850882745/gen-music-3

  4. https://soundcloud.com/ramya-vidiyala-850882745/gen-music-4

  5. https://soundcloud.com/ramya-vidiyala-850882745/gen-music-5

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

  • 通过灵感提升艺术家的创造力

  • 作为开发新思想的生产力工具

  • 作为艺术家作品的附加曲调

  • 完成未完成的工作

  • 作为一首独立的音乐

但是,这个模型还有待改进。我们的训练资料只有一种乐器,钢琴。我们可以增强训练数据的一种方法是添加来自多种乐器的音乐。另一种方法是增加音乐的体裁、节奏和节奏特征。

目前,我们的模式产生了一些假音符,音乐也不例外。我们可以通过增加训练数据集来减少这些错误并提高音乐质量。


总结

在这篇文章中,我们研究了如何处理与神经网络一起使用的音乐,深度学习模型如RNN和LSTMs的工作原理,我们还探讨了如何调整模型可以产生音乐。我们可以将这些概念应用到任何其他系统中,在这些系统中,我们可以生成其他形式的艺术,包括生成风景画或人像。


谢谢你的阅读!如果你想亲自体验这个定制数据集,可以在这里下载带注释的数据,并在Github上查看我的代码:https://github.com/RamyaVidiyala/Generate-Music-Using-Neural-Networks

原文链接:https://towardsdatascience.com/music-generation-through-deep-neural-networks-21d7bd81496e

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

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

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

通过深层神经网络生成音乐相关推荐

  1. 用深层神经网络解释大脑的运作

    来源:混沌巡洋舰 Daniel Yamins,麻省理工学院博士后的一位计算神经科学,有时会为了他的机器视觉项目辛苦工作到午夜以后.他煞费苦心地设计了一个系统,可以识别图片中的物体,而不管其大小.位置和 ...

  2. 为什么深层神经网络难以训练_“用魔法击败魔法”?一群计算神经学家正借神经网络解释大脑...

    原文:Deep Neural Networks Help to Explain Living Brains [1] 作者:Anil Ananthaswamy(科普作家) 译者:Yang 2011 年冬 ...

  3. 神经网络 mse一直不变_用深层神经网络解释大脑的运作

    原标题:用深层神经网络解释大脑的运作 斯坦福计算神经学家Daniel Yamins 类似地,研究人员已经证明,最擅长分类言语.音乐和模拟气味的深层网络,其结构似乎与大脑的听觉和嗅觉系统平行.这些相似之 ...

  4. 使用LSTM神经网络进行音乐合成(数据格式,模型构建,完整源码)

    本文章将讲解如何借用机器学习框架Tensorflow和Keras,构建LSTM神经网络模型,通过学习音乐数据,来自动合成一段音乐. 训练的原始音乐数据为:下载试听 合成的音乐例子:下载试听 完整代码( ...

  5. 【TensorFlow】笔记2:深层神经网络

    一.深度学习 vs 深层神经网络 深度学习:一类通过多层非线性变换对高复杂性数据建模算法的集合. 1.激活函数 线性模型的最大特点:任意线性模型的组合仍是线性模型,能够解决的问题也是有限的,这就是线性 ...

  6. 深度学习笔记第二门课 改善深层神经网络 第一周:深度学习的实践层面

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

  7. TensorFlow:实战Google深度学习框架(三)深层神经网络

    第四章 深层神经网络 4.1 深度学习与深层神经网络 4.1.1 线性模型的局限性 4.1.2 激活函数实现非线性化 4.1.3 多层网络解决异或问题 4.2 损失函数 4.2.1 经典损失函数 1. ...

  8. 【翻译】Sklearn 与 TensorFlow 机器学习实用指南 —— 第11章 训练深层神经网络(中)...

    梯度裁剪 减少梯度爆炸问题的一种常用技术是在反向传播过程中简单地剪切梯度,使它们不超过某个阈值(这对于递归神经网络是非常有用的:参见第 14 章). 这就是所谓的梯度裁剪.一般来说,人们更喜欢批量标准 ...

  9. 吴恩达深度学习之二《改善深层神经网络:超参数调试、正则化以及优化》学习笔记

    一.深度学习的实用层面 1.1 训练/开发/测试集 机器学习时代,数据集很小,可能100.1000.10000条,这种级别.可以按 70%.30% 划分训练集和测试集,训练后直接用测试集评估.或者按 ...

最新文章

  1. OSI[七层]与TCP/IP[四层]模型简述简图
  2. 浙江科技学院计算机专业录取分数线,浙江科技学院2017年艺术类本科专业录取分数线...
  3. Linux系统的目录绑定配置
  4. java 内存溢出和内存泄漏_JAVA中的内存溢出和内存泄漏有很大的区别
  5. pythonturtle库使用心得_记录我的Python学习之旅(一)关于turtle库的基本用法
  6. 视频通信基础知识之采集
  7. Spring AOP切入点与通知XML类型
  8. 列表页的动态条件搜索
  9. openGauss北京Meetup成功举办,“产学研用”合力共建主流根社区(附:视频回放PPT)...
  10. 五一档票房超8.8亿元!张艺谋新片仅第二
  11. 【java】深入理解Java的动态编译
  12. WEB前端开发职业学习路线初级完整版
  13. win2k,XP下用setupapi.dll自动安装Driver
  14. 按钮按一下画个直线_直线导轨数控车床概念和作用
  15. Python 高级编程笔记之测试驱动开发
  16. 游戏引擎笔记(三)天空盒和水面
  17. [BJOI2019]排兵布阵
  18. 2020年9月指数定期审核与调整 | TokenInsight
  19. IP-Guard十六个模块功能详解
  20. java阿里面试官直接告诉你录取答案,你还在犹豫那就晚了

热门文章

  1. 基于Bert的智能对话机器人
  2. 斗兽棋java程序,Java 斗兽棋算法 帮优化一下解决办法
  3. dct基 matlab,DCT 变换的基函数与基图像
  4. 25-基于51单片机温湿度的检测及控制的设计
  5. Matlab一维数组及其应用
  6. Window10 JDK8安装与配置详细步骤
  7. Java设计模式-之代理模式(动态代理)
  8. 金弘同创教育:拼多多签到的规则是什么
  9. RTP协议封装音视频媒体数据详解
  10. AD学习之旅(1)— Altium Designer 20 软件下载与安装