#————————————————————————本文禁止轉載,禁止用於各類講座及ppt中,違者必究————————————————————————#
前幾天看到一個有意思的分享,大意是講如何用Tensorflow教神經網絡自動創造音樂。聽起來好好玩有木有!作為一個Coldplay死忠粉,第一想法就是自動生成一個類似Coldplay曲風的音樂,於是,開始跟着Github上的教程(項目的名稱:Project Magenta)一步一步做,弄了三天,最后的生成的音樂在這里(如果有人能告訴我怎么在博客里插入音樂請趕快聯系我!謝謝!)
https://pan.baidu.com/s/1k827vpJkI6ZSKkJAz9v0oQ
https://pan.baidu.com/s/1zxripqVM18gw8wxnqgZOrw
這兩段音樂是我生成的十幾個音樂中聽起來還不錯的,雖然還是有點怪,但是至少有節奏,嘿嘿。下面來說一下是怎么做的:
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.生成后的音樂可以根據自己的需要加上節拍,應該會好聽一點~
總之,現在開始做吧,很有趣的!~