Magenta魔改記 3 Melody RNN總覽

2021-09-23 14:36:05 字數 3760 閱讀 3624

本文主要介紹magenta rnn的模型架構和通過執行python檔案進行訓練、生成的方法,以及修改python檔案的引數。

magenta version:1.1.1

melody rnn是magenta的自動作曲模型中最簡單也是最基本的乙個模型。萬丈高樓平地起,magenta就是從這個模型開始,一點點新增內容與架構,最後寫就了如今這些種類繁多的自動作曲模型。

melody rnn,顧名思義,是使用rnn模型對旋律(melody)進行生成的模型。該模型的輸入為一段旋律(midi格式),而輸出則是這段旋律與模型根據這段旋律繼續生成的旋律,格式也為midi。

在melody rnn中,總體的資料表示方式為pianoroll式,即將音符序列按一定時間間隔(通常是1/4小節)取樣,形成時間序列對於見前文所述。其運用監督式學習進行訓練,基於最大似然進行訓練,目標函式為softmax。

訓練的目標為:輸入一定長度的時間序列,**(即輸出)這個序列的下乙個點的值。

在melody rnn中,又分為四種不同的配置(或模型架構),每個架構都有不同的資料表示與rnn結構。這四種配置依次由簡到繁,請讀者依次閱讀:

basic_rnn:基準架構,音高使用one-hot編碼。one-hot碼的表示形式為:對於n個類,只有其中的乙個位置值為1,其餘為0,值為1位置的索引值即為當前編碼的類的值。獨熱碼中每個類的含義為midi音高,即每個類為乙個半音。每個時間點的輸入為按最小頻率(預設為1/4個四分音符)取樣的旋律的獨熱表示,獨熱碼中值為1位置的索引值就是當前的事件(event)編號。event的編號有三種:note-on:音符的開始,即開始彈下,其值為音符的音高。note-off:彈奏結束,即乙個音符結束。no-event:當前為休止符,或為彈下乙個音後的保持。在basic_rnn中,輸入和輸出被限制在了[48, 84],即[c3,c5]的音高範圍。這樣一來,輸入維度較少,計算量與記憶體占用就相對較小。

mono_rnn:與basic_rnn相同,但音高表示範圍為128個音高,即可以生成全部midi音高。

lookback_rnn:rnn(lstm)很難學習(相對)長期的時序關係,或時序資料長期規律。為了解決這一問題,magenta引入了lookback_rnn,在basic_rnn的基礎上新增了一些自定義的標籤。顧名思義,在lookback_rnn中,每一步的輸入都包含之前的序列。也就是說,在生成下乙個音符時,lookback_rnn不僅輸入上乙個音符,還輸入乙個小節前和兩個小節前的所有音符,因此叫「look back」。同時,lookback_rnn還加了用於指示當前音符在小節中位置、當前旋律是否為重複出現的特徵。總體來說,相當於在lookback_rnn中,手動對旋律做了特徵工程,提取了旋律反覆的資訊,以及手動輸入了之前序列(而不是令rnn自己學習在hidden state中儲存)。對於**的旋律,尤其是流行**的旋律,出現旋律重複的情況很多,因此這樣提取特徵可以很直接的提取出該旋律的長期關係資訊。

attention_rnn:此方法在lookback_rnn的基礎上新增了attention機制。

對lookback_rnn與attention_rnn中資料表示的更詳細介紹,可以閱讀magenta的部落格。關於資料表示的具體表示方法見下一節。

這四種配置在訓練完畢後的輸入輸出都是相同的,可以理解為是乙個功能的四種實現方式。同時我們可以發現,這四種模型在複雜度上層層遞進,其輸出的效果在我主觀感受上也是越複雜的模型生成效果越好。

如果你想的話,也可以先簡單瀏覽一下magenta的github中對melody rnn的介紹。

如果你想先上手試試melody rnn的效果的話,自己訓練乙個模型並根據生成自己的**是再合適不過的了。通過命令列進行訓練、生成或匯入magenta專案組提供的訓練好的模型引數進行生成,請檢視這裡。

但是,如果你想對melody rnn進行修改或者更深一步的了解,我們需要檢視melody rnn的**,以及一步步檢視它執行的過程。這樣的話,我們可以使用執行python檔案的方式進行訓練和生成。

在melody rnn(包括magenta中很多其他模型)中,模型的訓練、生成過程有著以下幾個特點:

對應第一步,我們需要在python檔案中修改tf.flags的值。我們需要先在melody_rnn_config_flags.py中填寫:

'config',

'basic_rnn',

"which config to use. must be one of 'basic', 'lookback', or 'attention'. "

"mutually exclusive with `--melody_encoder_decoder`.")

注意,melody_rnn_config_flags.py的修改需要在python執行環境的路徑中。比如使用anaconda的話,就在***\anaconda3\envs\你的環境名\lib\site-packages\庫名中修改。

下一步的資料轉換則對應melody_rnn_create_dataset.py。這裡我們可以把這個檔案放置到任意位置並修改後執行即可。在melody_rnn_create_dataset.py中,需要填寫:

如果一切填寫完畢,在這一步我們只需要執行melody_rnn_create_dataset.py,就可以成功轉換資料了。

資料轉換的詳細過程以及資料表示見下一節。

訓練則對應melody_rnn_train.py。在這裡,我們需要填寫:

同時,如果是執行訓練程式,需要把eval寫為false,bool格式。

在一切準備完畢後,執行melody_rnn_train.py,我們就可以開始訓練了。訓練的速度取決於你電腦的配置與效能。在訓練過程中,我們也可以使用tensorboard進行監視。在命令列中輸入tensorboard --logdir=run_dir就可以啟動tensorboard。這裡run_dir指的是上文中填寫的模型引數儲存的路徑。

驗證也使用melody_rnn_train.py。不同的是,在執行驗證程式時,我們需要把eval寫為true,bool格式;同時,sequence_example_file為驗證集,即eval_melodies.tfrecord的路徑。最後,我們可以選擇修改num_eval_examples,這個引數為使用驗證集中資料的數目。不過我一般傾向於填寫預設值0,即在全部驗證集上驗證。

在訓練程式執行的同時,執行填寫驗證引數的melody_rnn_train.py,會啟動乙個新的python程序。run_dir下每有乙個新模型檔案生成,便讀取該模型檔案並進行驗證,顯示驗證結果。

然而,同時執行兩個程序、兩套神經網路會使用兩倍視訊記憶體。因此這一點是magenta專案的乙個缺點。不過,也許谷歌不會在意這一點。

melody rnn的生成需要先輸入一段前置序列,模型以輸入一段序列,**後乙個點的方式迭代執行(即把輸出當做下次的輸入),輸出**。melody rnn的生成也採用了beam search(預設不開啟beam search)。生成程式的檔案為melody_rnn_generate.py

需要填寫的引數如下:

可選引數(可以不填或使用預設值):

3 魔改 神話魔改小劇場第3話

未完待續.純原創盜圖使用者必究 夸父關於夸父的記載最廣為人知的應該是 夸父逐日 的故事 夸父與日逐走,入日。渴欲得飲,飲於河渭,河渭不足,北飲大澤。未至,道渴而死。棄其杖。化為鄧林。出自 山海經 海外北經 不過翻開山海經,我們還能看到關於夸父更多的記錄。比如在 山海經 海外北經 還有一處寫道 博父國...

魔都,3年,程式設計師到CTO

過乙個平凡無趣的人生實在太容易了,你可以不讀書,不冒險,不運動,不寫作,不外出,不折騰 但是,人生最後悔的事情就是 我本可以。陳素封 在來上海之前我看完了李華明老師寫的 android遊戲程式設計之從零開始 特別喜歡他的銘言 不要讓任何事情成為你不去學習的理由!2013年6月22號,當時懷滿腔熱血,...

魔教《3字魔經》為何優於其它武功秘籍?

復原魔方6面,有以下幾個步驟 底稜歸位,底角歸位 底面復原 中稜歸位 第二層復原 頂稜歸位 頂面十字 頂角面位 頂面復原 頂稜歸位 頂角歸位 每一步可以用乙個公式完成,學會這6個公式就能復原魔方6面了。但是要在短時間內熟練應用這6個公式來復原是很困難的 網路上的教程 或者購買魔方時附送的教程,通常要...