用Tensorflow讓神經網絡自動創造音樂

#————————————————————————本文禁止轉載,禁止用於各種講座及ppt中,違者必究————————————————————————# html

  前幾天看到一個有意思的分享,大意是講如何用Tensorflow教神經網絡自動創造音樂。聽起來好好玩有木有!做爲一個Coldplay死忠粉,第一想法就是自動生成一個相似Coldplay曲風的音樂,因而,開始跟着Github上的教程(項目的名稱:Project Magenta)一步一步作,弄了三天,最後的生成的音樂在這裏(若是有人能告訴我怎麼在博客裏插入音樂請趕快聯繫我!謝謝!)python

   https://pan.baidu.com/s/1k827vpJkI6ZSKkJAz9v0oQlinux

    https://pan.baidu.com/s/1zxripqVM18gw8wxnqgZOrwgit

  這兩段音樂是我生成的十幾個音樂中聽起來還不錯的,雖然仍是有點怪,可是至少有節奏,嘿嘿。下面來講一下是怎麼作的:github

 

   1.首先下載Project Magenta算法

   1 git clone https://github.com/tensorflow/magenta.git 數據庫

 

  2.安裝須要的工具:xcode

  在這裏(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了半天后發現發現了這個:app

  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.生成後的音樂能夠根據本身的須要加上節拍,應該會好聽一點~

 

  總之,如今開始作吧,頗有趣的!~

相關文章
相關標籤/搜索