【Magenta 项目初探】手把手教你用Tensorflow神经网络创造音乐

原文链接:http://www.cnblogs.com/learn-to-rock/p/5677458.html

偶然在网上看到了一个让我很感兴趣的项目 Magenta,用Tensorflow让神经网络自动创造音乐。

白话就是:可以用一些音乐的风格来制作模型,然后用训练出的模型对新的音乐进行加工从而创造出新的音乐。

花了半天时间捣鼓终于有了成果,挺开心的,同时也把这半天的经验拿来分享,能让大家节约一些时间也算是我对社会做出的一点贡献吧。

再次感受 Google 的黑科技

希望大家能喜欢我的Chinglish

--第一步,安装,工具准备!--

操作系统:请放弃 windows 吧,选择linux 或者 Unix

想在windows上直接运行现在真的是毫无办法,刚开始想尝试新技术,应用容器——docker,不过没有windows 专业版的 hyperV,无法成功安装docker。

在linux上安装

1. 基本编程环境

  python 2.7 / 3.* 都可以使用 TensorFlow 的 API

  Java 环境:JDK

  可以用 apt-get 安装

  顺便把java添加到环境中吧,linux 中修改 bashrc. 路径PATH="$PATH:$HOME/bin"

  这部分我就不赘述,反正你要这都不会百度基本上就告别编程了。

2. Project Magenta

https://github.com/tensorflow/magenta.git

3. TensorFlow 的安装

https://www.tensorflow.org/versions/r0.9/get_started/os_setup.html

本团员是这样做的:

    $ sudo apt-get install python-pip python-dev

    $ sudo pip install --upgrade  https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl

  你可能会在这个过程遇到版本依赖问题,可以尝试参考下面做法:

    sudo aptitude install python-dev

4. 安装bazel

https://github.com/bazelbuild/bazel/releases/tag/0.3.0

选择合适版本

http://www.bazel.io/docs/install.html

面对新鲜事物,请听亲生父母的,请一定看官方文档:http://www.bazel.io/docs/install.html

  注:linux download 的时候可以使用 wget

--第二步:开始创作!--

命令可以保存为 bash 格式方便以后使用,我是分四个步骤,编了4个批处理文件,

请一定注意修改路径

// 中途需要从github下载一些东西,不造是什么,所以请保持网络畅通

1. 第一个bash:创建旋律数据库

#!/bin/bash

##创建旋律数据库

MIDI_DIRECTORY=/home/liukun/TensorFlow/magenta/music/train #这里换成你的文件路径就行了

SEQUENCES_TFRECORD=/home/liukun/TensorFlow/magenta/music/train/notesequences.tfrecord

bazel run //magenta/scripts:convert_midi_dir_to_note_sequences -- \

--midi_dir=$MIDI_DIRECTORY \

--output_file=$SEQUENCES_TFRECORD \

--recursive

2. 第二个bash:提取出训练样本

# TFRecord file containing NoteSequence protocol buffers from convert_midi_dir_to_note_sequences.py.

SEQUENCES_TFRECORD=/home/liukun/TensorFlow/magenta/music/train/notesequences.tfrecord

# TFRecord file that TensorFlow‘s SequenceExample protos will be written to. This is the training dataset.

TRAIN_DATA=/home/liukun/TensorFlow/magenta/music/train/training_melodies.tfrecord

# Optional evaluation dataset. Also, a TFRecord file containing SequenceExample protos.

EVAL_DATA=/home/liukun/TensorFlow/magenta/music/eval_melodies.tfrecord

# Fraction of input data that will be written to the eval dataset (if eval_output flag is set).

EVAL_RATIO=0.10

bazel run //magenta/models/basic_rnn:basic_rnn_create_dataset -- \

--input=$SEQUENCES_TFRECORD \

--train_output=$TRAIN_DATA \

--eval_output=$EVAL_DATA \

--eval_ratio=$EVAL_RATIO

遇到的问题:本地github保存的账号可能会因为与远程github账号不同而出现错误,我root账户绑定了github用户,哪曾想到今天.....所以不用sudo了

3. 第三个bash : 训练神经网络模型, 最耗费时间!!!

#首先compile basic_rnn工具

bazel build //magenta/models/basic_rnn:basic_rnn_train

TRAIN_DATA=/home/liukun/TensorFlow/magenta/music/train/training_melodies.tfrecord

#训练模型,其中“rnn_layer_size”是神经网络的层数,可以自定义

/home/liukun/TensorFlow/magenta/bazel-bin/magenta/models/basic_rnn/basic_rnn_train --experiment_run_dir=/home/liukun/TensorFlow/magenta/music --sequence_example_file=$TRAIN_DATA --eval=false --hparams=‘{"rnn_layer_sizes":[30]}‘ --num_training_steps=2000

我为了节省时间,只训练了2000遍,所以......

4. 第四个bash:生成新的的旋律!

##生成旋律

#指定测试旋律的文件地址

PRIMER_PATH=/home/liukun/TensorFlow/magenta/music/origional/Canon.mid

#注意这里是绝对地址,只能指定一首歌

# num_outputs 指定生成曲目数量

bazel run //magenta/models/basic_rnn:basic_rnn_generate -- \

--experiment_run_dir=/home/liukun/TensorFlow/magenta/magenta/models \

--hparams=‘{"rnn_layer_sizes":[30]}‘ \

--primer_midi=$PRIMER_PATH \

--output_dir=/home/liukun/TensorFlow/magenta/music/generate \

--num_steps=64 \

--num_outputs=3

  等待显得那么漫长。

  程序执行结束,我按耐不住一颗好奇之心,满怀期待地打开刚刚诞生于这个世界的新艺术,泪目,这融合了21世纪最前沿技术的新作

 旋律奏响,真TM......不好听。

老司机留话:

  主要需要修改的就是文件的路径了。

  我的思路使用一些风格突出的歌曲作为训练集,然后对简单的旋律进行加工,这样应该更能体现效果。

  提醒:文件路径要使用绝对路径,虽然不知道问什么,但不这样就会出错,提示权限问题。

关于这个项目的Google讨论小组:

https://groups.google.com/a/tensorflow.org/forum/#!forum/magenta-discuss

最后祝大家假期愉快!

5555半天没刷题了~~~~

作者博客:http://www.cnblogs.com/learn-to-rock/

转载请注意排版,别搞得难看的一比!!!

项目文件目录树供参考:

.
├── bazel installer
│   ├── bazel
│   └── bazel-0.3.0-installer-linux-x86_64.sh
├── magenta
│   ├── 1.sh
│   ├── 1.sh~
│   ├── 2.sh
│   ├── 2.sh~
│   ├── 3.sh
│   ├── 3.sh~
│   ├── 4.sh
│   ├── 4.sh~
│   ├── bazel-bin -> /home/liukun/.cache/bazel/_bazel_liukun/ebbbbefb206fd0a3aa08c53b60fb3fee/execroot/magenta/bazel-out/local-opt/bin
│   ├── bazel-genfiles -> /home/liukun/.cache/bazel/_bazel_liukun/ebbbbefb206fd0a3aa08c53b60fb3fee/execroot/magenta/bazel-out/local-opt/genfiles
│   ├── bazel-magenta -> /home/liukun/.cache/bazel/_bazel_liukun/ebbbbefb206fd0a3aa08c53b60fb3fee/execroot/magenta
│   ├── bazel-out -> /home/liukun/.cache/bazel/_bazel_liukun/ebbbbefb206fd0a3aa08c53b60fb3fee/execroot/magenta/bazel-out
│   ├── bazel-testlogs -> /home/liukun/.cache/bazel/_bazel_liukun/ebbbbefb206fd0a3aa08c53b60fb3fee/execroot/magenta/bazel-out/local-opt/testlogs
│   ├── __init__.py
│   ├── LICENSE
│   ├── magenta
│   │   ├── 1.sh
│   │   ├── 2.sh~
│   │   ├── BUILD
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── lib
│   │   │   ├── BUILD
│   │   │   ├── __init__.py
│   │   │   ├── __init__.pyc
│   │   │   ├── melodies_lib.py
│   │   │   ├── melodies_lib_test.py
│   │   │   ├── midi_io.py
│   │   │   ├── midi_io.pyc
│   │   │   ├── midi_io_test.py
│   │   │   ├── note_sequence_io.py
│   │   │   ├── note_sequence_io_test.py
│   │   │   ├── sequence_example_lib.py
│   │   │   ├── sequence_to_melodies.py
│   │   │   ├── sequence_to_melodies_test.py
│   │   │   └── tf_lib.py
│   │   ├── models
│   │   │   ├── attention_rnn
│   │   │   │   ├── attention_rnn_create_dataset.py
│   │   │   │   ├── attention_rnn_encoder_decoder.py
│   │   │   │   ├── attention_rnn_generate.py
│   │   │   │   ├── attention_rnn_graph.py
│   │   │   │   ├── attention_rnn_train.py
│   │   │   │   ├── BUILD
│   │   │   │   └── README.md
│   │   │   ├── basic_rnn
│   │   │   │   ├── basic_rnn_create_dataset.py
│   │   │   │   ├── basic_rnn_encoder_decoder.py
│   │   │   │   ├── basic_rnn_encoder_decoder.pyc
│   │   │   │   ├── basic_rnn_generate.py
│   │   │   │   ├── basic_rnn_graph.py
│   │   │   │   ├── basic_rnn_graph.pyc
│   │   │   │   ├── basic_rnn_train.py
│   │   │   │   ├── BUILD
│   │   │   │   ├── README.md
│   │   │   │   └── run_basic_rnn_train.sh
│   │   │   ├── lookback_rnn
│   │   │   │   ├── BUILD
│   │   │   │   ├── lookback_rnn_create_dataset.py
│   │   │   │   ├── lookback_rnn_encoder_decoder.py
│   │   │   │   ├── lookback_rnn_generate.py
│   │   │   │   ├── lookback_rnn_graph.py
│   │   │   │   ├── lookback_rnn_train.py
│   │   │   │   └── README.md
│   │   │   └── shared
│   │   │       ├── BUILD
│   │   │       ├── melody_rnn_create_dataset.py
│   │   │       ├── melody_rnn_generate.py
│   │   │       ├── melody_rnn_train.py
│   │   │       ├── primer.mid
│   │   │       └── README.md
│   │   ├── protobuf
│   │   │   ├── BUILD
│   │   │   └── music.proto
│   │   ├── reviews
│   │   │   ├── assets
│   │   │   │   ├── attention_interpolation.png
│   │   │   │   ├── attention_parameterization.png
│   │   │   │   ├── color-preserving-ny.jpg
│   │   │   │   ├── diagram.png
│   │   │   │   ├── generation.gif
│   │   │   │   ├── mnist_generation.png
│   │   │   │   ├── pixelrnn_figure6.png
│   │   │   │   ├── pixelrnn_full_context.png
│   │   │   │   ├── pixelrnn_masks_A.png
│   │   │   │   ├── pixelrnn_masks_B.png
│   │   │   │   ├── pixelrnn_masks_highlevel.png
│   │   │   │   ├── svhn_generation.png
│   │   │   │   └── tubingen-starry-night.jpg
│   │   │   ├── draw.md
│   │   │   ├── pixelrnn.md
│   │   │   ├── README.md
│   │   │   ├── styletransfer.md
│   │   │   └── summary_generation_sequences.md
│   │   ├── Rossini_barbe(2).mid
│   │   ├── Rossini_barbe(3).mid
│   │   ├── Rossini_barbe.mid
│   │   ├── scripts
│   │   │   ├── BUILD
│   │   │   ├── convert_midi_dir_to_note_sequences.py
│   │   │   └── convert_midi_dir_to_note_sequences_test.py
│   │   └── testdata
│   │       ├── BUILD
│   │       ├── example_complex.mid
│   │       ├── example.mid
│   │       └── notesequences.tfrecord
│   ├── music
│   │   ├── eval_melodies.tfrecord
│   │   ├── generate
│   │   │   ├── 2016-07-16_224233_1.mid
│   │   │   ├── 2016-07-16_224233_2.mid
│   │   │   └── 2016-07-16_224233_3.mid
│   │   ├── origional
│   │   │   └── Canon.mid
│   │   └── train
│   │       ├── basket.mid
│   │       ├── detective.mid
│   │       ├── notesequences.tfrecord
│   │       └── training_melodies.tfrecord
│   ├── pretty_midi.BUILD
│   ├── python_midi.BUILD
│   ├── README.md
│   ├── six.BUILD
│   ├── tools
│   │   └── bazel.rc
│   ├── util
│   │   └── python
│   │       └── BUILD
│   ├── WORKSPACE
│   └── WORKSPACE~

  

时间: 2024-10-18 23:28:43

【Magenta 项目初探】手把手教你用Tensorflow神经网络创造音乐的相关文章

[ionic开源项目教程] - 手把手教你使用移动跨平台开发框架Ionic开发一个新闻阅读APP

前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. 项目介绍 本项目基于移动跨平台开发框架 Ionic 开发,主要包含健康.医疗.生活.农业.和用户五大模块,以下是功能架构图. 目录 第1讲 前言,技术储备,环境搭建,常用命令 第2讲 新建项目,架构页面,配置app.js和controllers.js 第3讲 使用Tabs和SlideBox实现左右滑动菜单 第4讲 第4讲 通过Service层获取新

手把手教你做JavaWeb项目:登录模块

现如今,无论是客户端还是移动端,无论是游戏登陆还是社交平台登陆,无处不在的“登陆”.那么你知道怎么制作吗?今天就为你娓娓道来: 用户登录 在各大信息管理系统中,登录功能是必不可少的,他的作用就是验证用户的身份,判断用户是否是本站的会员,只有会员才能访问当前系统 登录的实现步骤: 1.用户填写账号和密码,提交到后台2.后台获取到账号和密码后,将其发送到数据库中进行查询3.查询结果如果为null,说明用户填写的账号或者密码有误,应该回到登录页面并提示用户重新输入4.查询结果如果不为null,说明用户

TensorFlow 神经网络教程

TensorFlow 是一个用于机器学习应用程序的开源库.它是谷歌大脑的第二代系统,在取代了近源的 DistBelief 之后,被谷歌用于研究和生产应用.TensorFlow 提供了很多种语言接口,包括 Python.C++.Go.Java 和 C 等等.考虑到普遍性和易学性,本文将采用 Python 版本,并且会简单介绍下 TensorFlow 的安装和它的一些低阶 API,以及从头开始构建基于真实数据集的前馈神经网络. 在更为复杂的应用场景下,神经网络的训练时长往往是一种特别需要克服的因素.

手把手教你构建gradle项目

我先来阐述一下我认为的gradle项目的优势吧 1:语法简单,集成了ant和maven的很多优点,简单的语法和完善的文档造就了其不可估计的前途 2:构建容易,一个build.gradle文件,一行指令,即可构建你的项目 3:方便导入依赖库 我这个人就喜欢瞎捉摸,虽然不是计算机专业的,但是读研这段时间确喜欢上了计算机,第一次接触gradle是在学libgdx引擎的时候,那时候还不知道gradle的作用,后面越学越深的时候发现了很多问题,构建项目的时候往往导入一个包不能解决问题,现在的工程越来越大,

手把手教你做关键词匹配项目(搜索引擎)---- 第三天

第三天 小王(运营总监)看到小丁丁整天都在淘宝.百度.魔方.拍拍上面淘关键词,每天花费的时间好长,工作效率又低,拿着这个借口来找到我. 说到:小帅帅,你看小丁丁每天都在淘宝.百度.魔方.拍拍上面淘关键词花费的时间好长,你能不能帮帮忙,看看能不能让系统自己做啦,这样可以节省好多人力,带来的效益多高.(0 其实就是为了掩饰他们懒惰 0) 小帅帅一听到可以带来的效益好高,王总还求着我呢 ,马上 两眼冒着星光,是该好好体现, 解决这个问题就可以体现出我的价值. 小帅帅拍着胸膛保证到:王总,这个小KS啦,

手把手教你做关键词匹配项目(搜索引擎)---- 第六天

第六天 小帅帅周五休息后,精神估计太旺盛了,周末两天就狂欢去了,酒喝高了,把一件重要的事儿给忘记了. 周一重新整装 刺骨上战场. 一来公司,小帅帅终于记得他要做的事情,就迫不及待的整理会议报告(工作总结). 1.上周工作任务: 1) 页面提交关键词到关键词词库 2) 文件导入到关键词词库 3) 自动抓取关键此到关键词词库 2.能力的提升 1) 学会了如何读csv文件 2)  学会了curl 3)  学会了Html Dom parse 3.下周工作任务: 1) 了解下关键词词库的应用 刚写到这儿,

手把手教Android商业项目-即时通讯-i美聊

[课程概况] 手把手教你从无到有的完整实现一个Android商业项目,是目前整个市场上所没有的课程,废话不多说,请往下看. [项目概况] 项目名称:i美聊 所属领域:移动社交 即时通讯   代码行数:10万+ 开发周期:5个月 [讲师简介]         Jason,一个闷骚的老男人 [能收获的知识] 1. XMPP协议及aSmack框架 2. 错误信息的收集与发送 3.  兼容性测试 4. 短信验证码 5. 录音的转码及发送 6. 各种第三方使用 7. 接入支付功能 8. 代码混淆 9. 上

手把手教你做关键词匹配项目(搜索引擎)---- 第七天

第七天 小帅帅拿回去仔细研究了一个晚上. 发现代码其实都是自己写的,就多了一些类,于老大还不是抄的我的代码,心里又鄙视了于老大一番. 其实每个人都有通病,写过程的总是会鄙视写面向对象的,因为他们没体会到面向对象是啥玩意,要让他们写好可得花上好几年的工夫. 小帅帅学编程的时候,明明知道有函数这一概念,知道函数的写法,但是实际上就算一个函数里面几百行代码,也不知道去提前多个函数出来,美其名约:你看我多厉害,几百行代码耶. 小帅帅心里虽然鄙视于老大,但是看到于老大的代码怎么感觉很清爽,一切都那么自然.

手把手教你做关键词匹配项目(搜索引擎)---- 第一天

第一天 收到需求,需求如下: 1. 收集关键词,构建关键词词库. 收到这个任务,第一想法,这还不简单吗? 马上动手创建一个关键词录入界面,保存到数据库. 第一步完成了,哈哈大笑了一天,没想到事情原来如此的简单. $keywords = $_POST["keywords"]; foreach($keywords as $keyword) { #save $keyword to database .............. } 手把手教你做关键词匹配项目(搜索引擎)---- 第一天