抱歉,你查看的文章不存在

TensorFlow应用实战-9-生成音乐

生成音乐的python文件

# -*- coding: UTF-8 -*-

"""
用训练好的神经网络模型参数来作曲
"""

import pickle
import numpy as np
import tensorflow as tf

from utils import *
from network import *
def prepare_sequences(notes, pitch_names, num_pitch):
    """
    为神经网络准备好供训练的序列
    """
    sequence_length = 100

    # 创建一个字典,用于映射 音调 和 整数
    pitch_to_int = dict((pitch, num) for num, pitch in enumerate(pitch_names))

    # 创建神经网络的输入序列和输出序列
    network_input = []
    network_output = []

    for i in range(0, len(notes) - sequence_length, 1):
        sequence_in = notes[i: i + sequence_length]
        sequence_out = notes[i + sequence_length]

        network_input.append([pitch_to_int[char] for char in sequence_in])
        network_output.append(pitch_to_int[sequence_out])

    n_patterns = len(network_input)

    # 将输入的形状转换成神经网络模型可以接受的
    normalized_input = np.reshape(network_input, (n_patterns, sequence_length, 1))

    # 将 输入 标准化/归一化
    # 归一话可以让之后的优化器(optimizer)能够更快更好地找到误差最小值
    normalized_input = normalized_input / float(num_pitch)

    # normalized_input 经过归一化操作的输入
    return network_input, normalized_input

生成音符

def generate_notes(model, network_input, pitch_names, num_pitch):
    """
    基于一序列音符,用神经网络来生成新的音符
    """

    # 从输入里随机选择一个序列,作为"预测"/生成的音乐的起始点
    start = np.random.randint(0, len(network_input) - 1)

    # 创建一个字典,用于映射 整数 和 音调
    # 将整数还原为音符
    int_to_pitch = dict((num, pitch) for num, pitch in enumerate(pitch_names))

    # 输入序列随机选择起始点
    pattern = network_input[start]

    # 神经网络实际生成的音调
    prediction_output = []

    # 生成 700 个 音符/音调
    for note_index in range(700):
        prediction_input = np.reshape(pattern, (1, len(pattern), 1))
        # 输入 归一化
        prediction_input = prediction_input / float(num_pitch)

        # 用载入了训练所得最佳参数文件的神经网络来 预测/生成 新的音调
        prediction = model.predict(prediction_input, verbose=0)

        # argmax 取最大的那个维度(类似 One-Hot 独热码)
        index = np.argmax(prediction)

        # 将 整数 转成 音调
        result = int_to_pitch[index]

        prediction_output.append(result)

        # 往后移动
        pattern.append(index)
        pattern = pattern[1:len(pattern)]

    return prediction_output

训练时我们使用的是fit。我们现在是是有神经网络为我们生成新的输出预测值

以之训练所得最佳参数生成音乐

# 以之前训练所得的最佳参数来生成音乐
def generate():
    # 加载用于训练神经网络的音乐数据
    with open('data/notes', 'rb') as filepath:
        notes = pickle.load(filepath)

    # 得到所有音调的名字
    pitch_names = sorted(set(item for item in notes))

    # 得到所有不重复(因为用了set)的音调数目
    num_pitch = len(set(notes))

    network_input, normalized_input = prepare_sequences(notes, pitch_names, num_pitch)

    # 载入之前训练时最好的参数文件(最好用 loss 最小 的那一个参数文件,
    # 记得要把它的名字改成 best-weights.hdf5 ),来生成神经网络模型
    model = network_model(normalized_input, num_pitch, "best-weights.hdf5")

    # 用神经网络来生成音乐数据
    prediction = generate_notes(model, network_input, pitch_names, num_pitch)

    # 用预测的音乐数据生成 MIDI 文件,再转换成 MP3
    create_music(prediction)

将训练时候最好loss的那个改名字,用来生成。

  • 运行python train.py
  • 将生成的weights文件找到loss最小的。

纯TensorFlow版本的预告

目前代码主要用的keras

纯TensorFlow相比keras的优势

  • 更底层, 具有更多灵活性
  • 可以更随性地定制网络结构
  • 可以看到更多模型搭建细节

纯TensorFlow版本的样式

  • 提供源代码和详尽注释
  • 不会演示每一行代码的写成

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

有趣的Python

0 篇文章106 人订阅

相关文章

来自专栏Coding迪斯尼

RNN,具有记忆功能神经网络的理解与实现

我们当前掌握的网络类型,统称为feed forward网络。这种网络的特点是,当我们把很多条数据输入网络进行训练时,网络没有“记忆性”,也就是网络认为前一条输入...

1242
来自专栏IT派

用TensorFlow和TensorBoard从零开始构建ConvNet(CNN)

摘要: Tensorflow作为当下最流行的深度学习框架,实现ConvNet(CNN)自然是轻而易举,但是本文创造性的使用的TensorBoard来图形化展示...

6555
来自专栏CDA数据分析师

资源 | 一个Python特征选择工具,助力实现高效机器学习

项目地址:https://github.com/WillKoehrsen/feature-selector

1640
来自专栏机器之心

资源 | GitHub新项目:轻松使用多种预训练卷积网络抽取图像特征

选自GitHub 机器之心整理 参与:思源 最近 GitHub 有一个非常有意思的项目,它可以使用多种预训练 TensorFLow 模型计算图像特征。对于每一个...

3266
来自专栏机器之心

资源 | 一个Python特征选择工具,助力实现高效机器学习

项目地址:https://github.com/WillKoehrsen/feature-selector

1872
来自专栏PaddlePaddle

【文本分类】基于双层序列的文本分类模型

导语 PaddlePaddle提供了丰富的运算单元,帮助大家以模块化的方式构建起千变万化的深度学习模型来解决不同的应用问题。这里,我们针对常见的机器学习任务,提...

3153
来自专栏ATYUN订阅号

词序:神经网络能按正确的顺序排列单词吗?

当学习第二语言时,最困难的挑战之一可能是熟悉单词顺序。词序在机器翻译中也很重要,因为翻译大致上是一种处理目标语言词汇的过程,它与源语言是对等的。也许你已经做过一...

3504
来自专栏编程

关于反向传播在Python中应用的入门教程

我来这里的目的是为了测试我对于Karpathy的博客《骇客的神经网络指导》以及Python的理解,也是为了掌握最近精读的Derek Banas的文章《令人惊奇的...

2117
来自专栏码洞

人工不智能之sklearn聚类

线性回归是一种有监督算法,提供了输入数据x和参考目标值y,参考目标提供了一种纠错机制,是对预测结果y_的监督,如果y和y_相差过大,说明拟合的模型可能存在问题。...

661
来自专栏悦思悦读

数据挖掘_R_Python_ML(2): Linear Regression vs SVR

在上一篇“数据挖掘: R, Python,Machine Learning,一起学起来!”中,我们介绍了用R进行线性回归的例子。 这次我们来看看,同样一份简单的...

4319

扫码关注云+社区

领取腾讯云代金券