通过深层神经网络生成音乐(基于深度神经网络)
ztj100 2024-11-10 13:13 11 浏览 0 评论
深度学习改善了我们生活的许多方面,无论是明显的还是微妙的。深度学习在电影推荐系统、垃圾邮件检测和计算机视觉等过程中起着关键作用。
尽管围绕深度学习作为黑匣子和训练难度的讨论仍在进行,但在医学、虚拟助理和电子商务等众多领域都存在着巨大的潜力。
在艺术和技术的交叉点,深度学习可以发挥作用。为了进一步探讨这一想法,在本文中,我们将研究通过深度学习过程生成机器学习音乐的过程,许多人认为这一领域超出了机器的范围(也是另一个激烈辩论的有趣领域!)。
目录
- 机器学习模型的音乐表现
- 音乐数据集
- 数据处理
- 模型选择
- 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是因为:
- 数据的长度不需要固定。对于每一个输入,数据长度可能会有所不同。
- 可以存储序列。
- 可以使用输入和输出序列长度的各种组合。
除了一般的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))
以下是一些生成的音乐片段:
- https://soundcloud.com/ramya-vidiyala-850882745/gen-music-1
- https://soundcloud.com/ramya-vidiyala-850882745/gen-music-2
- https://soundcloud.com/ramya-vidiyala-850882745/gen-music-3
- https://soundcloud.com/ramya-vidiyala-850882745/gen-music-4
- https://soundcloud.com/ramya-vidiyala-850882745/gen-music-5
我们使用被称为LSTMs的机器学习神经网络生成这些令人愉快的音乐样本。每一个片段都不同,但与训练数据相似。这些旋律可用于多种用途:
- 通过灵感提升艺术家的创造力
- 作为开发新思想的生产力工具
- 作为艺术家作品的附加曲调
- 完成未完成的工作
- 作为一首独立的音乐
但是,这个模型还有待改进。我们的训练资料只有一种乐器,钢琴。我们可以增强训练数据的一种方法是添加来自多种乐器的音乐。另一种方法是增加音乐的体裁、节奏和节奏特征。
目前,我们的模式产生了一些假音符,音乐也不例外。我们可以通过增加训练数据集来减少这些错误并提高音乐质量。
总结
在这篇文章中,我们研究了如何处理与神经网络一起使用的音乐,深度学习模型如RNN和LSTMs的工作原理,我们还探讨了如何调整模型可以产生音乐。我们可以将这些概念应用到任何其他系统中,在这些系统中,我们可以生成其他形式的艺术,包括生成风景画或人像。
谢谢你的阅读!如果你想亲自体验这个定制数据集,可以在这里下载带注释的数据,并在Github上查看我的代码:https://github.com/RamyaVidiyala/Generate-Music-Using-Neural-Networks
相关推荐
- Vue 技术栈(全家桶)(vue technology)
-
Vue技术栈(全家桶)尚硅谷前端研究院第1章:Vue核心Vue简介官网英文官网:https://vuejs.org/中文官网:https://cn.vuejs.org/...
- vue 基础- nextTick 的使用场景(vue的nexttick这个方法有什么用)
-
前言《vue基础》系列是再次回炉vue记的笔记,除了官网那部分知识点外,还会加入自己的一些理解。(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读)在开发时,是不是遇到过这样的场景,响应...
- vue3 组件初始化流程(vue组件初始化顺序)
-
学习完成响应式系统后,咋们来看看vue3组件的初始化流程既然是看vue组件的初始化流程,咋们先来创建基本的代码,跑跑流程(在app.vue中写入以下内容,来跑流程)...
- vue3优雅的设置element-plus的table自动滚动到底部
-
场景我是需要在table最后添加一行数据,然后把滚动条滚动到最后。查网上的解决方案都是读取html结构,暴力的去获取,虽能解决问题,但是不喜欢这种打补丁的解决方案,我想着官方应该有相关的定义,于是就去...
- Vue3为什么推荐使用ref而不是reactive
-
为什么推荐使用ref而不是reactivereactive本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代optionapi的data的替...
- 9、echarts 在 vue 中怎么引用?(必会)
-
首先我们初始化一个vue项目,执行vueinitwebpackechart,接着我们进入初始化的项目下。安装echarts,npminstallecharts-S//或...
- 无所不能,将 Vue 渲染到嵌入式液晶屏
-
该文章转载自公众号@前端时刻,https://mp.weixin.qq.com/s/WDHW36zhfNFVFVv4jO2vrA前言...
- vue-element-admin 增删改查(五)(vue-element-admin怎么用)
-
此篇幅比较长,涉及到的小知识点也比较多,一定要耐心看完,记住学东西没有耐心可不行!!!一、添加和修改注:添加和编辑用到了同一个组件,也就是此篇文章你能学会如何封装组件及引用组件;第二能学会async和...
- 最全的 Vue 面试题+详解答案(vue面试题知识点大全)
-
前言本文整理了...
- 基于 vue3.0 桌面端朋友圈/登录验证+60s倒计时
-
今天给大家分享的是Vue3聊天实例中的朋友圈的实现及登录验证和倒计时操作。先上效果图这个是最新开发的vue3.x网页端聊天项目中的朋友圈模块。用到了ElementPlus...
- 不来看看这些 VUE 的生命周期钩子函数?| 原力计划
-
作者|huangfuyk责编|王晓曼出品|CSDN博客VUE的生命周期钩子函数:就是指在一个组件从创建到销毁的过程自动执行的函数,包含组件的变化。可以分为:创建、挂载、更新、销毁四个模块...
- Vue3.5正式上线,父传子props用法更丝滑简洁
-
前言Vue3.5在2024-09-03正式上线,目前在Vue官网显最新版本已经是Vue3.5,其中主要包含了几个小改动,我留意到日常最常用的改动就是props了,肯定是用Vue3的人必用的,所以针对性...
- Vue 3 生命周期完整指南(vue生命周期及使用)
-
Vue2和Vue3中的生命周期钩子的工作方式非常相似,我们仍然可以访问相同的钩子,也希望将它们能用于相同的场景。...
- 救命!这 10 个 Vue3 技巧藏太深了!性能翻倍 + 摸鱼神器全揭秘
-
前端打工人集合!是不是经常遇到这些崩溃瞬间:Vue3项目越写越卡,组件通信像走迷宫,复杂逻辑写得脑壳疼?别慌!作为在一线摸爬滚打多年的老前端,今天直接甩出10个超实用的Vue3实战技巧,手把...
- 怎么在 vue 中使用 form 清除校验状态?
-
在Vue中使用表单验证时,经常需要清除表单的校验状态。下面我将介绍一些方法来清除表单的校验状态。1.使用this.$refs...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Vue 技术栈(全家桶)(vue technology)
- vue 基础- nextTick 的使用场景(vue的nexttick这个方法有什么用)
- vue3 组件初始化流程(vue组件初始化顺序)
- vue3优雅的设置element-plus的table自动滚动到底部
- Vue3为什么推荐使用ref而不是reactive
- 9、echarts 在 vue 中怎么引用?(必会)
- 无所不能,将 Vue 渲染到嵌入式液晶屏
- vue-element-admin 增删改查(五)(vue-element-admin怎么用)
- 最全的 Vue 面试题+详解答案(vue面试题知识点大全)
- 基于 vue3.0 桌面端朋友圈/登录验证+60s倒计时
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)