温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python如何通过深层神经网络生成音乐

发布时间:2021-12-27 13:58:46 来源:亿速云 阅读:307 作者:iii 栏目:大数据

这篇文章主要介绍“python如何通过深层神经网络生成音乐”,在日常操作中,相信很多人在python如何通过深层神经网络生成音乐问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python如何通过深层神经网络生成音乐”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

机器学习模型的音乐表现

我们将使用ABC音乐符号。ABC记谱法是一种简写的乐谱法,它使用字母a到G来表示音符,并使用其他元素来放置附加值。这些附加值包括音符长度、键和装饰。

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

python如何通过深层神经网络生成音乐

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


音乐数据集

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

数据处理

数据当前是基于字符的分类格式。在数据处理阶段,我们需要将数据转换成基于整数的数值格式,为神经网络的工作做好准备。

python如何通过深层神经网络生成音乐

这里每个字符都映射到一个唯一的整数。这可以通过使用一行代码来实现。“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相同的链状结构,但有不同的重复模块结构。

python如何通过深层神经网络生成音乐

这里使用RNN是因为:

  1. 数据的长度不需要固定。对于每一个输入,数据长度可能会有所不同。

  2. 可以存储序列。

  3. 可以使用输入和输出序列长度的各种组合。

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

python如何通过深层神经网络生成音乐

RNN

由于我们需要在每个时间戳上生成输出,所以我们将使用许多RNN。为了实现多个RNN,我们需要将参数“return_sequences”设置为true,以便在每个时间戳上生成每个字符。通过查看下面的图5,你可以更好地理解它。

python如何通过深层神经网络生成音乐

在上图中,蓝色单位是输入单位,黄色单位是隐藏单位,绿色单位是输出单位。这是许多RNN的简单概述。

时间分布全连接层

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

状态

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

python如何通过深层神经网络生成音乐

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

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层,并将分类交叉熵作为一个损失函数。

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

python如何通过深层神经网络生成音乐

优化器

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

python如何通过深层神经网络生成音乐

生成音乐

到目前为止,我们创建了一个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.h6’.format(epoch)))

model2.summary()

python如何通过深层神经网络生成音乐

在音乐生成过程中,从唯一的字符集中随机选择第一个字符,使用先前生成的字符生成下一个字符,依此类推。有了这个结构,我们就产生了音乐。

python如何通过深层神经网络生成音乐

下面是帮助我们实现这一点的代码片段。

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))

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

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

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

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

  • 完成未完成的工作

  • 作为一首独立的音乐

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

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

到此,关于“python如何通过深层神经网络生成音乐”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI