Tensorflow 神经网络

Tensorflow让神经网络自动创造音乐

前几天看到一个有意思的分享,大意是讲如何用Tensorflow教神经网络自动创造音乐。听起来好好玩有木有!作为一个Coldplay死忠粉,第一想法就是自动生成一个类似Coldplay曲风的音乐,于是,开始跟着Github上的教程(项目的名称:Project Magenta)一步一步做,弄了三天,最后的生成的音乐在这里(如果有人能告诉我怎么在博客里插入音乐请赶快联系我!谢谢!)

   http://yun.baidu.com/share/link?shareid=1799925478&uk=840708891

  http://yun.baidu.com/share/link?shareid=3718079494&uk=840708891

  这两段音乐是我生成的十几个音乐中听起来还不错的,虽然还是有点怪,但是至少有节奏,嘿嘿。下面来说一下是怎么做的:

 

  1.首先下载Project Magenta

   1 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的位置,然后改一下软链接:

1 cd /usr/local/bin
2 sudo mv gcc gcc_OLD
3 sudo ln -s /usr/bin/clang /usr/local/bin/gcc
4 gcc -v
5 Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
6 Target: x86_64-apple-darwin14.5.0
7 Thread model: posix

  这样就大功告成了!哈哈!不要问我为什么花这么大篇幅写这个看似无关紧要的东西,因为我被这玩意儿折磨了两天!!弄完这个才花了三天结果搞个这个居然就花了两天!!哦,对了,如果你看到这儿不知道bazel是干啥的,简单的说就是一个编译工具,相当于pip的intsall。

  现在用bazel来测试一下能不能顺利运行:

   1 bazel test //magenta:all

  

  注:如果全部测试成功,很好。如果出现这个错误:

 1 INFO: Found 5 targets and 6 test targets...
 2 INFO: Elapsed time: 0.427s, Critical Path: 0.00s
 3 //magenta:basic_one_hot_encoder_test                            (cached) PASSED in 3.7s
 4 //magenta:convert_midi_dir_to_note_sequences_test               (cached) PASSED in 2.3s
 5 //magenta:melodies_lib_test                                     (cached) PASSED in 3.5s
 6 //magenta:midi_io_test                                          (cached) PASSED in 5.5s
 7 //magenta:note_sequence_io_test                                 (cached) PASSED in 3.5s
 8 //magenta:sequence_to_melodies_test                             (cached) PASSED in 40.2s
 9
10 Executed 0 out of 6 tests: 6 tests pass.11 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的内存还不够吗 = =),所以你可以跟我一样手动测试,以其中一个举例:

1 >>>bazel-bin/magenta/basic_one_hot_encoder_test
2 >>>----------------------------------------------------------------------
3 Ran 5 tests in 0.074s
4
5 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序列里提取出旋律:

 1 ##从Sequences中提取旋律
 2 SEQUENCES_TFRECORD=/tmp/notesequences.tfrecord
 3 TRAIN_DATA=/tmp/training_melodies.tfrecord #生成的训练文件地址
 4 EVAL_DATA=/tmp/evaluation_melodies.tfrecord
 5 EVAL_RATIO=0.10 ENCODER=basic_one_hot_encoder
 6 bazel run //magenta/models:basic_rnn_create_dataset --  7 --input=$SEQUENCES_TFRECORD  8 --train_output=$TRAIN_DATA  9 --eval_output=$EVAL_DATA 10 --eval_ratio=$EVAL_RATIO 11 --encoder=$ENCODER

  ok,这里我们的数据处理就完成了,生成的训练文件在"/tmp/training_melodies.tfrecord"里

  4.训练神经网络模型

  训练数据生成后就可以训练模型了,这里使用的是RNN模型:

1 ##训练神经网络模型
2 #首先compile basic_rnn工具
3 bazel build //magenta/models:basic_rnn_train
4
5 #训练模型,其中“rnn_layer_size”是神经网络的层数,可以自定义
6 ./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上测试的结果是啥)

 1 ##生成旋律
 2 #指定测试旋律的文件地址
 3 PRIMER_PATH=/Users/shelter/magenta/magenta/music/coldplay/KatyPerryPeacock.mid #注意这里是绝对地址,只能指定一首歌
 4 bazel run //magenta/models:basic_rnn_generate --  5 --experiment_run_dir=/tmp/basic_rnn/run1  6 --hparams=‘{"rnn_layer_sizes":[50]}‘  7 --primer_midi=$PRIMER_PATH  8 --output_dir=/tmp/basic_rnn_3  9 --num_steps=64 10 --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.生成后的音乐可以根据自己的需要加上节拍,应该会好听一点~

时间: 2024-10-07 14:11:17

Tensorflow 神经网络的相关文章

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

原文链接:http://www.cnblogs.com/learn-to-rock/p/5677458.html 偶然在网上看到了一个让我很感兴趣的项目 Magenta,用Tensorflow让神经网络自动创造音乐. 白话就是:可以用一些音乐的风格来制作模型,然后用训练出的模型对新的音乐进行加工从而创造出新的音乐. 花了半天时间捣鼓终于有了成果,挺开心的,同时也把这半天的经验拿来分享,能让大家节约一些时间也算是我对社会做出的一点贡献吧. 再次感受 Google 的黑科技 希望大家能喜欢我的Chi

tensorflow神经网络拟合非线性函数

本实验通过建立一个含有两个隐含层的BP神经网络,拟合具有二次函数非线性关系的方程,并通过可视化展现学习到的拟合曲线,同时随机给定输入值,输出预测值,最后给出一些关键的提示. 源代码如下: # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np import matplotlib.pyplot as plt plotdata = { "batchsize":[], "loss":[] } d

用tensorflow神经网络实现一个简易的图片分类器

文章写的不清晰请大家原谅QAQ 这篇文章我们将用 CIFAR-10数据集做一个很简易的图片分类器. 在 CIFAR-10数据集包含了60,000张图片.在此数据集中,有10个不同的类别,每个类别中有6,000个图像.每幅图像的大小为32 x 32像素.虽然这么小的尺寸通常给人类识别正确的类别带来了困难,但它实际上是对计算机模型的简化并且减少了分析图像所需的计算.                                                                CIFA

TensorFlow 神经网络相关函数

TensorFlow 激活函数 激活操作提供用于神经网络的不同类型的非线性.这些包括平滑的非线性(sigmoid,tanh,elu,softplus,和softsign),连续的,但不是到处可微函数(relu,relu6,crelu和relu_x),和随机正规化(dropout). 所有激活操作应用于分量,并产生与输入张量相同形状的张量. tf.nn.relu tf.nn.relu6 tf.nn.crelu tf.nn.elu tf.nn.softplus tf.nn.softsign tf.n

TensorFlow 神经网络教程

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

使用mnist数据搭建tensorflow神经网络 - notes

画个图花了我好久 plt.figure(figsize=(16, 8), dpi=80) displayX = X[5:10].reshape(5,28,28) for ind in range(len(displayX)): axes = plt.subplot(2,3,ind+1) pic = displayX[ind] for rowInd in range(len(pic)): oneRow = pic[rowInd] for eachPixelInd in range(len(oneR

Tensorflow卷积神经网络[转]

Tensorflow卷积神经网络 卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络, 在计算机视觉等领域被广泛应用. 本文将简单介绍其原理并分析Tensorflow官方提供的示例. 关于神经网络与误差反向传播的原理可以参考作者的另一篇博文BP神经网络与Python实现. 工作原理 卷积是图像处理中一种基本方法. 卷积核是一个nxn的矩阵通常n取奇数, 这样矩阵就有了中心点和半径的概念. 对图像中每个点取以其为中心的n阶方阵, 将该方阵与卷积核中

运用tensorflow写的第一个神经网络

因为实训课要用LSTM+attention机制在钢材领域做一个关系抽取.作为仅仅只学过一点深度学习网络的小白在b站上学习了RNN,LSTM的一些理论知识. 但只懂得一些理论知识是无法完成关系抽取的任务的.于是从图书馆借来<tensoflow实战-----深度学习框架>,在此开始记录我的tensorflow神经网络编程! 首先先介绍一下tensorflow的运作机制,对一个具体的计算而言,一般可以分为两个阶段,第一个阶段用来定义计算图中的计算,第二个阶段用来执行计算. 有了这个概念之后,就会发现

tensorflow安装

在Linux上各种尝试各种失败,因为没有Linux权限,没法通过yum.apt等工具自动更新系统的底层环境(主要是glibc),而自己手动安装往往十分繁琐. Windows上安装就比较简单了,但是一定要注意:目前只支持python3.5的64bit版本,有了python后,pip安装numpy后,就可以pip安装tensorflow了,亲测可用. 网上有比较好的入门教程了: 莫烦 tensorflow 神经网络 教程 莫烦python - github(还有其他系列的,都比较有用)