#————————————————————————本文禁止轉載,禁止用於各種講座及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.生成後的音樂能夠根據本身的須要加上節拍,應該會好聽一點~
總之,如今開始作吧,頗有趣的!~