Magenta魔改記-1:MIDI檔案讀取
Magenta魔改記-0: ofollow,noindex" target="_blank">Magenta魔改記-0:Magetna初見
本專案github:
https:// github.com/lukewys/Mage nta-Modification
包含所有文字及程式碼。
讀取資料
Magenta支援MIDI(.mid/.midi)檔案與MusicXML(.xml/.mxl)、ABC資料( http://abcnotation.com ,沒有測試過)檔案做訓練資料。
通常,製作資料集的步驟是,先將原始檔案轉化成單個tfrecord檔案儲存,再根據每個不同的模型進行不同的資料清洗與處理。
那麼這篇文章先著重分析第一步,將MIDI/MusicXML檔案直接轉換成tfrecord:
對應github中的提示:
https:// github.com/tensorflow/m agenta/tree/master/magenta/scripts#building-your-dataset
上述連結中的命令列如下:
INPUT_DIRECTORY=<folder containing MIDI and/or MusicXML files. can have child folders.> # TFRecord file that will contain NoteSequence protocol buffers. SEQUENCES_TFRECORD=/tmp/notesequences.tfrecord convert_dir_to_note_sequences \ --input_dir=$INPUT_DIRECTORY \ --output_file=$SEQUENCES_TFRECORD \ --recursive
這一步的bazel命令列如下(摘自原始碼註釋):
Example usage: $ bazel build magenta/scripts:convert_dir_to_note_sequences $ ./bazel-bin/magenta/scripts/convert_dir_to_note_sequences \ --input_dir=/path/to/input/dir \ --output_file=/path/to/tfrecord/file \ --num_threads=4 \ --log=INFO
可以看到,兩個命令列的引數內容都不同,可見Magenta專案組對於文件或API的介紹並沒有進行認真的維護。
魔改-1.0:
那麼下面介紹如何修改這一步預處理的引數。
這一步執行的檔案位置如下:
https:// github.com/tensorflow/m agenta/blob/master/magenta/scripts/convert_dir_to_note_sequences.py
開啟原始碼我們可以看到,程式一開始就定義了一系列tf.flag:
FLAGS = tf.app.flags.FLAGS tf.app.flags.DEFINE_string('input_dir', None, 'Directory containing files to convert.') #輸入路徑 tf.app.flags.DEFINE_string('output_file', None, 'Path to output TFRecord file. Will be overwritten ' 'if it already exists.') #輸出路徑 tf.app.flags.DEFINE_bool('recursive', False, 'Whether or not to recurse into subdirectories.') #是否遞迴查詢子路徑的檔案 tf.app.flags.DEFINE_integer('num_threads', 1, 'Number of worker threads to run in parallel.') #執行緒數量。如果資料檔案很多且CPU效能足夠的話,建議設定一個相對大的值 tf.app.flags.DEFINE_string('log', 'INFO', 'The threshold for what messages will be logged ' 'DEBUG, INFO, WARN, ERROR, or FATAL.') #顯示訊息的型別
這是Tensorflow中用於從命令列傳遞引數的變數,基於argparse實現。如果在執行時不輸入引數,則會按程式中預設填寫的引數執行。
因此可以看到,這一個程式共有5個引數,而上面兩種命令列方法都沒有寫出所有的變數,但上述兩種方法都能執行,因為沒有預設值的變數只有輸入路徑和輸出路徑兩個。
通過
python convert_dir_to_note_sequences.py.py –h
可以顯示註釋資訊和引數及其詳情。
因此,我們在自定義引數時,既可以在命令列執行時輸入:
python convert_dir_to_note_sequences.py --input_dir=E:\Magenta\Dataset\raw\bach --output_file=E:\Magenta\Dataset\pre\bach.tfrecord --recursive=True --num_threads=4
同樣,我們也可以把前面這幾行當做超引數變數宣告,直接在程式裡改(第二個引數),然後執行。
魔改-2.0
接下來介紹這一步的詳細原理以及檔案儲存的資料型別。
在本程式中,大致的執行步驟為:1. 先檢測輸入路徑(以及子路徑)中所有符合要求的檔案,生成檔案路徑列表。2. 再根據列表多執行緒的處理資料,3. 最後再存成.tfrecord檔案。
第一步對應queue_conversions(root_dir, sub_dir, pool, recursive=False)函式,在此不多展開。
第二步對應convert_midi(root_dir, sub_dir, full_file_path)、
convert_musicxml(root_dir, sub_dir, full_file_path)兩個函式。顧名思義就是針對midi和xml檔案的處理函式(一開始說的ABC資料處理函式未知)。它們的引數以及返回值可以在函式註釋中找到詳細的介紹。簡單來說就是輸入檔案路徑、檔案所在資料夾路徑、上一級路徑,輸出NoteSequence proto,一個在Magenta專案中用來表示音符序列的資料型別。
後續程式碼太多,在知乎文章中不便顯示,見我的github:
https:// github.com/lukewys/Mage nta-Modification/blob/master/Magenta-Modification-1.ipynb
注:Magenta version:0.3.6