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


#————————————————————————本文禁止轉載,禁止用於各類講座及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.生成后的音樂可以根據自己的需要加上節拍,應該會好聽一點~

 

  總之,現在開始做吧,很有趣的!~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM