用Tensorflow让神经网络自动创造音乐
#————————————————————————本文禁止转载,禁止用于各类讲座及ppt中,违者必究————————————————————————#
前几天看到一个有意思的分享,大意是讲如何用Tensorflow教神经网络自动创造音乐。听起来好好玩有木有!作为一个Coldplay死忠粉,第一想法就是自动生成一个类似Coldplay曲风的音乐,于是,开始跟着Github上的教程(项目的名称:Project Magenta)一步一步做,弄了三天,最后的生成的音乐在这里(如果有人能告诉我怎么在博客里插入音乐请赶快联系我!谢谢!)
https://pan.baidu.com/s/1k827vpJkI6ZSKkJAz9v0oQ
https://pan.baidu.com/s/1zxripqVM18gw8wxnqgZOrw
这两段音乐是我生成的十几个音乐中听起来还不错的,虽然还是有点怪,但是至少有节奏,嘿嘿。下面来说一下是怎么做的:
1.首先下载Project Magenta
git clone https://github.com/tensorflow/magenta.git
2.安装需要的工具:
在这里(https://www.tensorflow.org/versions/r0.9/get_started/os_setup.html)安装python、bazel和Tensorflow
注:我在安装bazel的时候一直出现“Segmentation fault:11”的错误,google了很多解决方法后发现是gcc的安装版本问题,如果你是mac用户,下载了xcode,并不代表你安装了gcc,还必须安装command line tools,如果安装成功,在linux里输入“gcc --version”会出现相应的版本信息,如果没有,就说明安装失败。如果安装失败了,用下载好的bazel再输入“bazel install gcc”,下载完检测一下gcc -v,如果依然是"Segmentation fault:11"错误,恭喜你,遇到和我一样的错误了,google了半天后发现发现了这个:
so,Apple现在已经不用gcc了,改为LLVM。以后要用"clang、clang++"来代替gcc。如果你输入gcc -v,显示"Segmentation fault:11",不妨输入一下"clang -v",看一下有没有对应的版本信息。如果有就代表你下载成功了。但是没有完,还有最后一步,把指向gcc的链接改到clang。输入"which gcc"和"which clang",可以看到你的gcc和clang的位置,然后改一下软链接:
cd /usr/local/bin
sudo mv gcc gcc_OLD
sudo ln -s /usr/bin/clang /usr/local/bin/gcc
gcc -v
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.5.0
Thread model: posix
这样就大功告成了!哈哈!不要问我为什么花这么大篇幅写这个看似无关紧要的东西,因为我被这玩意儿折磨了两天!!弄完这个才花了三天结果搞个这个居然就花了两天!!哦,对了,如果你看到这儿不知道bazel是干啥的,简单的说就是一个编译工具,相当于pip的intsall。
现在用bazel来测试一下能不能顺利运行:
bazel test //magenta:all
注:如果全部测试成功,很好。如果出现这个错误:
INFO: Found 5 targets and 6 test targets...
INFO: Elapsed time: 0.427s, Critical Path: 0.00s
//magenta:basic_one_hot_encoder_test (cached) PASSED in 3.7s
//magenta:convert_midi_dir_to_note_sequences_test (cached) PASSED in 2.3s
//magenta:melodies_lib_test (cached) PASSED in 3.5s
//magenta:midi_io_test (cached) PASSED in 5.5s
//magenta:note_sequence_io_test (cached) PASSED in 3.5s
//magenta:sequence_to_melodies_test (cached) PASSED in 40.2s Executed 0 out of 6 tests: 6 tests pass.
There were tests whose specified size is too big. Use the --test_verbose_timeout_warnings command line option to see which ones these are.
恭喜你,又犯了和我同样的错误:)这个错误是说测试文件太大了,不能一下子全部测试(我16g的内存还不够吗 = =),所以你可以跟我一样手动测试,以其中一个举例:
>>>bazel-bin/magenta/basic_one_hot_encoder_test
>>>----------------------------------------------------------------------
Ran 5 tests in 0.074s OK
把上述六个文件依次测试一下,成功请看下一步。
3.创建你的旋律数据集
和机器学习一样,我们得先输入一定的数据让它去训练,这里的训练数据可以自己下载喜欢的音乐,不过Magenta不能直接读取mp3文件,只能读取MIDI文件(mp3太大了,一个10M左右的mp3格式音乐可以转换成100k左右的midi文件)。当然,转换成midi格式的方法很多,我搜集了一个超好用的网址可以在线转:Convert Tool
读取MIDI文件后,Magenta要把MIDI文件转化成Sequence文件才能进行训练
##创建旋律数据库
MIDI_DIRECTORY=/Users/shelter/magenta/magenta/music/train #这里换成你的文件路径就行了
SEQUENCES_TFRECORD=/tmp/notesequences.tfrecord bazel run //magenta:convert_midi_dir_to_note_sequences -- \
--midi_dir=$MIDI_DIRECTORY \
--output_file=$SEQUENCES_TFRECORD \
--recursive
然后再从这些Sequence序列里提取出旋律:
##从Sequences中提取旋律
SEQUENCES_TFRECORD=/tmp/notesequences.tfrecord
TRAIN_DATA=/tmp/training_melodies.tfrecord #生成的训练文件地址
EVAL_DATA=/tmp/evaluation_melodies.tfrecord
EVAL_RATIO=0.10 ENCODER=basic_one_hot_encoder
bazel run //magenta/models:basic_rnn_create_dataset -- \
--input=$SEQUENCES_TFRECORD \
--train_output=$TRAIN_DATA \
--eval_output=$EVAL_DATA \
--eval_ratio=$EVAL_RATIO \
--encoder=$ENCODER
ok,这里我们的数据处理就完成了,生成的训练文件在"/tmp/training_melodies.tfrecord"里
4.训练神经网络模型
训练数据生成后就可以训练模型了,这里使用的是RNN模型:
##训练神经网络模型
#首先compile basic_rnn工具
bazel build //magenta/models:basic_rnn_train #训练模型,其中“rnn_layer_size”是神经网络的层数,可以自定义
./bazel-bin/magenta/models/basic_rnn_train --experiment_run_dir=/tmp/basic_rnn/run1 --sequence_example_file=$TRAIN_DATA --eval=false --hparams='{"rnn_layer_sizes":[50]}' --num_training_steps=1000
5.生成测试的旋律
模型那一步非常非常耗时间,Github里设置的是20000次迭代,差点把我的电脑跑烧起来 = =,你可以根据实际硬件情况设置迭代次数。测试旋律和训练的旋律一样,都是midi文件,我这里选取的是Katy Perry的Peacock(小黄歌 = =,想看一下用Coldplay的训练数据在katy Perry上测试的结果是啥)
##生成旋律
#指定测试旋律的文件地址
PRIMER_PATH=/Users/shelter/magenta/magenta/music/coldplay/KatyPerryPeacock.mid #注意这里是绝对地址,只能指定一首歌
bazel run //magenta/models:basic_rnn_generate -- \
--experiment_run_dir=/tmp/basic_rnn/run1 \
--hparams='{"rnn_layer_sizes":[50]}' \
--primer_midi=$PRIMER_PATH \
--output_dir=/tmp/basic_rnn_3 \
--num_steps=64 \
--num_outputs=16
你可以用 "bazel test //magenta:all"查看结果,在 http://localhost:6006 里查看可视化结果,包含收敛过程,accuracy等。
最后生成的旋律就是开头百度云里的文件了。还有另外一个是用轻音乐测试的,效果也不错。
总结:
1.一开始我的训练次数是20000次,到1000次的时候算法发散了,loss值由本来从20几万下降到2000多左右然后突然上升到16000左右,accuracy也下降了,所以就退出了,把迭代次数换成1000次训练。训练结束的时候算法还没有收敛,但是我想快点看到结果,而且电脑跑的太慢了,就直接拿来用了。如果你有GPU或者愿意等个几天跑程序,可以把迭代次数设置的大一点,等算法收敛后再进行测试。模型训练的好坏直接决定最后得到的音乐的好听程度,所以最好等算法收敛后在进行测试。我测试的世界各文件中很多都像乱弹的。
2.这个项目刚开始不久,有一个论坛专门给大家交流学习的心得以及提问题,点这里。上面的注释是我遇到的问题,如果遇到了新的问题,可以在论坛上发帖求助。我看到有的人生成的音乐很有那种诡异的哥特风哈哈。
3.这个项目背后的具体原理我没有写,Github上写的很清楚,可以参考这里
4.生成后的音乐可以根据自己的需要加上节拍,应该会好听一点~
总之,现在开始做吧,很有趣的!~
用Tensorflow让神经网络自动创造音乐的更多相关文章
- 【Magenta 项目初探】手把手教你用Tensorflow神经网络创造音乐
原文链接:http://www.cnblogs.com/learn-to-rock/p/5677458.html 偶然在网上看到了一个让我很感兴趣的项目 Magenta,用Tensorflow让神经网 ...
- (转)一文学会用 Tensorflow 搭建神经网络
一文学会用 Tensorflow 搭建神经网络 本文转自:http://www.jianshu.com/p/e112012a4b2d 字数2259 阅读3168 评论8 喜欢11 cs224d-Day ...
- Tensorflow卷积神经网络[转]
Tensorflow卷积神经网络 卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络, 在计算机视觉等领域被广泛应用. 本文将简单介绍其原理并分析Te ...
- 一文学会用 Tensorflow 搭建神经网络
http://www.jianshu.com/p/e112012a4b2d 本文是学习这个视频课程系列的笔记,课程链接是 youtube 上的,讲的很好,浅显易懂,入门首选, 而且在github有代码 ...
- NVIDIA GPU的神经网络自动调度
NVIDIA GPU的神经网络自动调度 针对特定设备和工作负载的自动调整对于获得最佳性能至关重要.这是一个关于如何使用自动调度器为NVIDIA GPU调整整个神经网络的资料. 为了自动调整一个神经网络 ...
- 用Tensorflow搭建神经网络的一般步骤
用Tensorflow搭建神经网络的一般步骤如下: ① 导入模块 ② 创建模型变量和占位符 ③ 建立模型 ④ 定义loss函数 ⑤ 定义优化器(optimizer), 使 loss 达到最小 ⑥ 引入 ...
- 深度学习原理与框架-Tensorflow卷积神经网络-cifar10图片分类(代码) 1.tf.nn.lrn(局部响应归一化操作) 2.random.sample(在列表中随机选值) 3.tf.one_hot(对标签进行one_hot编码)
1.tf.nn.lrn(pool_h1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) # 局部响应归一化,使用相同位置的前后的filter进行响应归一化操作 参数 ...
- 深度学习原理与框架-Tensorflow卷积神经网络-神经网络mnist分类
使用tensorflow构造神经网络用来进行mnist数据集的分类 相比与上一节讲到的逻辑回归,神经网络比逻辑回归多了隐藏层,同时在每一个线性变化后添加了relu作为激活函数, 神经网络使用的损失值为 ...
- tensorflow之神经网络实现流程总结
tensorflow之神经网络实现流程总结 1.数据预处理preprocess 2.前向传播的神经网络搭建(包括activation_function和层数) 3.指数下降的learning_rate ...
随机推荐
- ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图
原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...
- ASP.NET 截获服务器生成的将要发送到客户端的html的方法
有时候我们需要在将服务器端生成的html发送带客户端之前对这些html进行操作,比如生成静态html加之保存.改变生成的html中的某些内容等等,那么久可以通过如下的方案解决. 我总结了两种方式,个人 ...
- 【那些年关于java多态应用】
1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal { public abstract void Say();} 子类: public class ...
- JavaScript结构三层——思想快速介绍
本文版权归博客园和作者吴双本人所有,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/,我是博客园蜗牛,我们共同进步. 今天讨论的是什么 如果你的工作中需要写JavaS ...
- 【无私分享:ASP.NET CORE 项目实战(第三章)】EntityFramework下领域驱动设计的应用
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在我们 [无私分享:从入门到精通ASP.NET MVC] 系列中,我们其实也是有DDD思想的,但是没有完全的去实现,因为并不是 ...
- 使用BitArray判断素数
首先显示1024范围内的所有素数,然后显示输入的数是否是素数.1024 是代码中计算的素数的范围,可以修改.计算平方根,是为了确定一个基数的范围.1024的平方根是32,两个超过32 的数相乘,肯定大 ...
- linux(八)__yum工具
自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载.安装. 什么是yum? yum工具实例: 因为yum指定的软件仓库源是国外的网站,在国内访问较慢.我们更改它的仓库源. 首先先备 ...
- JavaScript 字符串操作
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- angularjs 弹出框 $modal
angularjs 弹出框 $modal 标签: angularjs 2015-11-04 09:50 8664人阅读 评论(1) 收藏 举报 分类: Angularjs(3) $modal只有一 ...
- ios新手开发——toast提示和旋转图片加载框
不知不觉自学ios已经四个月了,从OC语法到app开发,过程虽然枯燥无味,但是结果还是挺有成就感的,在此分享我的ios开发之路中的小小心得~废话不多说,先上我们今天要实现的效果图: 有过一点做APP经 ...