《基于循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM算法)的音樂譜曲生成模型研究》8200字_第1頁
《基于循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM算法)的音樂譜曲生成模型研究》8200字_第2頁
《基于循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM算法)的音樂譜曲生成模型研究》8200字_第3頁
《基于循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM算法)的音樂譜曲生成模型研究》8200字_第4頁
《基于循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM算法)的音樂譜曲生成模型研究》8200字_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

基于循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM算法)的音樂譜曲生成模型研究摘要音樂是人們的天然追求之一。從古至今,哲學(xué)家們對人們?nèi)绾蝿?chuàng)作音樂,如何欣賞音樂極感興趣。與此同時,人們不斷總結(jié)作曲的技巧。隨著機器學(xué)習(xí)的不斷發(fā)展,人們開始思考如何運用計算機進行音樂創(chuàng)作。機器作曲應(yīng)運而生。機器作曲是一種通過在計算機上建立數(shù)學(xué)模型來創(chuàng)作音樂的技術(shù)。計算機作曲以任何音樂都具有一定程度的程式化特征為基礎(chǔ)。機器作曲有六大類方法,分別是以隨機過程(Markov鏈表)為主的數(shù)學(xué)模型方法、利用規(guī)則的知識庫系統(tǒng)、音樂文法、遺傳演化算法、人工神經(jīng)網(wǎng)絡(luò)算法和混合系統(tǒng)。本文主要介紹如何利用循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM算法)進行作曲。循環(huán)神經(jīng)網(wǎng)絡(luò)主要用于處理與時間有關(guān)的序列數(shù)據(jù),在實驗時我們將每一首音樂看做以音高和音長為特征信息的時間序列,在每一時刻都存在相對應(yīng)的不同特征信息。為了處理方便,實驗的音樂數(shù)據(jù)從音樂文件mid中轉(zhuǎn)化而來,同時編寫程序?qū)⒔?jīng)過神經(jīng)網(wǎng)絡(luò)處理生成的mid格式音樂轉(zhuǎn)化為mp3格式。值得一提的是,循環(huán)神經(jīng)網(wǎng)絡(luò)存在梯度消失問題,不能直接用于作曲。所以本文提出利用長短時間記憶算法(LSTM)進行作曲,該網(wǎng)絡(luò)能夠有效解決梯度消失問題。關(guān)鍵詞:循環(huán)神經(jīng)網(wǎng)絡(luò);LSTM;機器作曲目錄TOC\o"1-3"\h\u122091引言 1274311.1機器作曲介紹 147561.2機器作曲中的算法 1108311.3機器作曲的主要難點 299351.4機器作曲的研究意義與相關(guān)應(yīng)用 2238511.5文章的組織結(jié)構(gòu) 245282音樂的特征屬性 371102.1音樂的基礎(chǔ)知識 3151702.2常用音樂特征 3177912.3音樂特征的表示 4181503循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM算法) 550643.1單向循環(huán)神經(jīng)網(wǎng)絡(luò) 550643.1.1單向循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu) 550643.1.2循環(huán)神經(jīng)網(wǎng)絡(luò)算法 850643.2雙向循環(huán)神經(jīng)網(wǎng)絡(luò) 950643.3梯度消失問題 1050643.4LSTM算法 10259974實驗介紹 1410064.1數(shù)據(jù)集 14304424.2模型構(gòu)建 15225404.3網(wǎng)絡(luò)訓(xùn)練 16228084.4音樂生成 16124315總結(jié)與展望 176465.1總結(jié) 1728165.2展望 178229參考文獻 181引言機器作曲介紹機器作曲,是基于機器學(xué)習(xí),利用一系列的算法、規(guī)則或者操作來生成音樂的過程。機器作曲旨在通過訓(xùn)練已經(jīng)存在的某種風(fēng)格的音樂,來盡可能的生成類似音樂。研究機器作曲,實質(zhì)上是要了解如何利用機器學(xué)習(xí)的算法對音樂序列的特征進行提取,以根據(jù)提取出的特征來生成新的音樂序列。機器作曲中的算法至今,機器作曲的算法大概分為六大類:以隨機過程(Markov鏈表)為主的數(shù)學(xué)模型方法、利用規(guī)則的知識庫系統(tǒng)、音樂文法、遺傳演化算法、人工神經(jīng)網(wǎng)絡(luò)算法和混合系統(tǒng)。接下來我們簡單地介紹各個算法的基本概念。以隨機過程為主的數(shù)學(xué)模型方法,主要利用Markov鏈表,應(yīng)用廣泛。Herman于1993年提出了基于混沌給線性系統(tǒng)的作曲系統(tǒng);Gogins于1991年提出了基于迭代函數(shù)的作曲系統(tǒng)。然而這兩個系統(tǒng)所生成的音樂的質(zhì)量難以判斷。應(yīng)用規(guī)則的知識庫系統(tǒng)方法主要依靠符號運算和規(guī)則約束來進行音樂創(chuàng)作。這類方法能夠?qū)σ魳窋?shù)據(jù)進行詳細(xì)地推理,并且能夠?qū)π袨檫M行解釋。然而這一方法在計算機上很難實現(xiàn),主要因為某些音樂知識不能靈活的在計算機上表示出來,并且很難進行補充。音樂文法應(yīng)用音樂的某些顯著特征來創(chuàng)作音樂。然而,當(dāng)音樂不存在一定的文法時,這一方法趨于無效。遺傳演化算法通過模擬生物界物種遺傳進化,利用適應(yīng)函數(shù)來進行全局優(yōu)化。如何構(gòu)造適應(yīng)函數(shù)是使用遺傳演化算法的關(guān)鍵。然而,適應(yīng)函數(shù)的確定存在著較大的主觀性和不有效性。人工神經(jīng)網(wǎng)絡(luò)(ArtificialNeuralNetwork,ANN)能夠?qū)Υ罅繑?shù)據(jù)進行學(xué)習(xí)和訓(xùn)練。用神經(jīng)網(wǎng)絡(luò)作曲,關(guān)鍵是捕捉音樂片段的音高、音長等特征信息。但是,用神經(jīng)網(wǎng)絡(luò)算法創(chuàng)作音樂需要提供大量的訓(xùn)練集,而且很難獲取音樂的某些特征,如旋律、和聲等相關(guān)信息?;旌舷到y(tǒng)基于上述五種方法創(chuàng)作音樂。機器作曲的主要難點(1)音樂的知識表達如何將一首音樂轉(zhuǎn)換為神經(jīng)網(wǎng)絡(luò)可以接收的數(shù)據(jù),是機器作曲首先要考慮的問題。要想利用神經(jīng)網(wǎng)絡(luò)進行作曲,得研究如何用數(shù)學(xué)方法來表示音樂的特征。(2)創(chuàng)造性和人機交互性問題經(jīng)過自主學(xué)習(xí),沒有作曲家干涉的機器作曲是沒有創(chuàng)造性的。要想讓機器作曲具有創(chuàng)造性這一概念是很困難的。機器作曲應(yīng)該以通過算法對音樂創(chuàng)作過程進行優(yōu)化,從而方便人們操作為目的。(3)音樂創(chuàng)作風(fēng)格問題要想應(yīng)用神經(jīng)網(wǎng)絡(luò)生成某種風(fēng)格的音樂,需要大量該風(fēng)格的音樂訓(xùn)練集。不過這一做法并不一定適合創(chuàng)作其他風(fēng)格的音樂。(4)創(chuàng)作作品的質(zhì)量評估問題如何對機器作曲生成的音樂作品質(zhì)量進行評估?每個人對音樂的評價都不一樣。這時就需要建立一個總體上符合人們觀點的評價機制。機器作曲的研究意義與相關(guān)應(yīng)用對機器作曲進行研究,可以滿足人們對藝術(shù)的追求。更重要的是,給我們提供一個很貼近作曲家的渠道來了解和模擬作曲家的音樂創(chuàng)作方式。機器作曲主要用于音樂的創(chuàng)作,生成藝術(shù)相關(guān)的技術(shù)和產(chǎn)品。文章的組織結(jié)構(gòu)本文由引言、音樂的特征屬性、循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM)、實驗介紹和總結(jié)與展望這五個主要的部分組成,各個部分的大致內(nèi)容如下:引言:介紹機器作曲的概念、常用的六大類算法、作曲研究中的主要難點和對機器作曲進行研究的意義及有關(guān)應(yīng)用。音樂的特征屬性:介紹音樂的定義、產(chǎn)生方式和常用的音樂特征,以及如何用數(shù)學(xué)對音樂特征進行表示。循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM)介紹循環(huán)神經(jīng)網(wǎng)絡(luò)的構(gòu)造,包括單向循環(huán)神經(jīng)網(wǎng)絡(luò)和雙向循環(huán)神經(jīng)網(wǎng)絡(luò),用于處理音樂序列;接著給出前向傳播算法和反向傳播算法的具體公式;再分析梯度消失問題,最后提出用于解決梯度消失為的長短時間記憶算法及其具體學(xué)習(xí)過程。實驗介紹:詳細(xì)介紹實驗的項目組成文件,包括數(shù)據(jù)集的建立,模型的建立,訓(xùn)練數(shù)據(jù)以及音樂的生成??偨Y(jié)與展望:對本文的內(nèi)容進行總結(jié),指出在實驗過程中存在的不足和對未來的期待。2音樂的特征屬性2.1音樂的基礎(chǔ)知識音分為樂音和噪音兩大類。在音樂創(chuàng)作過程中,樂音和噪音都發(fā)揮著重要的作用。每一首音樂都深刻地表達著創(chuàng)作者的情感。傾聽者能夠通過音樂感受到作曲家的感受,同時展開豐富的想象和聯(lián)想,與作曲家進行共鳴。2.2常用音樂特征(1)音色音色指音的色調(diào)。發(fā)音體種類不同,音色也不同。例如,人發(fā)出的聲音和嗩吶發(fā)出的聲音不一樣。(2)音量音量指音的強弱。發(fā)聲體的振動幅度決定音量的大小。振動幅度與音量之間存在線性關(guān)系。(3)音高音高可以理解為音的高低。它與發(fā)音體的振動頻率呈線性關(guān)系。當(dāng)聲速一定時,音的高低由機械波的頻率和波長決定。(4)音長音長表示音持續(xù)時間的長短。發(fā)聲體振動的時間長短決定了音長的長短。在音樂的創(chuàng)作過程中,用“拍”為單位來計算時長。不妨設(shè)一個三十二分音符為8拍,則一個十六音符為4拍,八分音符為2拍。(5)和聲和聲包括和弦以及和聲進行。前者是和聲的縱向結(jié)構(gòu),后者為和聲的橫向結(jié)構(gòu)。和聲能夠使音樂中各個聲部有協(xié)調(diào)性的組合在一起,表現(xiàn)出音樂的內(nèi)容。2.3音樂特征的表示本文介紹兩種方法來表示音樂數(shù)據(jù)。僅對單聲部的音樂進行研究。規(guī)定:一首音樂為一個序列,簡單地記為M,長度為n。直接表示法對于任一段音樂序列M,不妨設(shè)該音列中音高的最低數(shù)值為1,該數(shù)值隨著音高的增高而遞增1。不發(fā)音時音高值設(shè)為0。令時間單位的最小值為單位1。當(dāng)音符使用附點進行表示時,一個音符附點表示時長是原來的1.5倍,2個就表示時長是原來的1.75倍。0-1表示法不防設(shè)一段音樂序列M包含k個不同的音,用0-1表示法表示音高。則可以用一個k維向量來表示音高。也就是說,當(dāng)某個音p的音高值為i時,k維向量的第i位數(shù)值為1,其余的為0.如果不發(fā)音,則該k維向量為0向量。表示如下:而對于時長,一方面可以取序列M中所有音的最短時長為單位時長,則其他音的持續(xù)時長為該單位時長的m倍;另一方面,當(dāng)存在某些音的時長并非上述的單位時長的整數(shù)倍時,可以取所有音長的最大公約數(shù)作為單位時長。這樣所有音的音長便可以表示為單位時長的整數(shù)倍。3循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM算法)循環(huán)神經(jīng)網(wǎng)絡(luò)(RecurrentNeturalNetwork)是一類具有短期記憶能力的神經(jīng)網(wǎng)絡(luò),主要用于解決音頻、文本、視頻等與時序有關(guān)的問題。通俗地說,用于處理和預(yù)測序列數(shù)據(jù)。3.1單向循環(huán)神經(jīng)網(wǎng)絡(luò)3.1.1單向循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)單向循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖如下圖所示:圖1單向循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)從圖1中可以看出:一個典型的循環(huán)神經(jīng)網(wǎng)絡(luò)由輸入,神經(jīng)元A(狀態(tài)記為)和輸出組成??梢詫D1展開進行理解:圖2單向循環(huán)神經(jīng)網(wǎng)絡(luò)展開結(jié)構(gòu)圖初始輸入向量為,輸出為,神經(jīng)元在初始時刻0時的狀態(tài)保存在A中。當(dāng)進入到下一個時刻,網(wǎng)絡(luò)神經(jīng)元的狀態(tài)由對應(yīng)輸入向量和初始時刻神元的狀態(tài)共同決定。依此類推,直到查閱完所有節(jié)點。以音樂序列為例。一首音樂即為一個時間序列數(shù)據(jù),包含音高和音長這兩個特征。使用單向循環(huán)神經(jīng)網(wǎng)絡(luò)進行作曲,一開始需要把音樂序列作為初始輸入向量輸入神經(jīng)網(wǎng)絡(luò),經(jīng)過神經(jīng)元處理后,得到該訓(xùn)練樣本的第一個音的相關(guān)特征信息,再將音的上下文信息作為新的輸入向量輸入網(wǎng)絡(luò),接著得到第二個音的特征信息。逐次進行,最后便能得到該音樂序列所有音的特征信息的輸出向量。 圖3為流程圖圖3神經(jīng)網(wǎng)絡(luò)作曲流程下圖為有多個隱藏層的循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu):圖4多層循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖其中:代表時間節(jié)點為t時訓(xùn)練樣本的輸入值,指時間節(jié)點為t時訓(xùn)練樣本序列的真實輸出值,而表示時間節(jié)點為t時模型的輸出,由模型當(dāng)前的隱藏狀態(tài)決定。由輸入值和上一時間節(jié)點的隱藏狀態(tài)決定,指模型在t時刻的隱藏狀態(tài)。指時刻t下模型的損失函數(shù)。U是循環(huán)神經(jīng)網(wǎng)絡(luò)的權(quán)重矩陣;V為隱藏層到輸出層的權(quán)重矩陣;而W為t時刻隱藏層到t+1時刻隱藏層的權(quán)重矩陣。在這一神經(jīng)網(wǎng)絡(luò)中U、V、W這三個權(quán)重矩陣是不變的。3.1.2循環(huán)神經(jīng)網(wǎng)絡(luò)算法下面以具有多個隱藏層的循環(huán)神經(jīng)網(wǎng)絡(luò)為例介紹其算法。(1)前向傳播算法t時刻下的隱藏狀態(tài)由輸入值和t-1時刻的狀態(tài)決定,得到:。其中f為循環(huán)神經(jīng)網(wǎng)絡(luò)的激活函數(shù),b為輸入層到隱藏層的偏倚向量。模型的輸出向量為,c為隱藏層到輸出層的偏置向量。而模型預(yù)測的輸出為。隨后通過損失函數(shù),我們可以量化模型在當(dāng)前時刻的損失,也就是預(yù)測輸出和模型實際輸出的差距。(2)反向傳播算法反向傳播算法是指通過梯度下降法對神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練,從而得到最優(yōu)的循環(huán)神經(jīng)網(wǎng)絡(luò)模型參數(shù)U,V,W,b,c的過程。我們使用的損失函數(shù)為交叉熵?fù)p失函數(shù),輸出的激活函數(shù)為softmax函數(shù),隱藏層的激活函數(shù)為tanh函數(shù)(雙曲正切函數(shù))。最終的損失L表示如下:(1)通過對損失函數(shù)求對應(yīng)偏導(dǎo)來求V和c,如下所示:(2)(3)定義t時刻序列的隱藏狀態(tài)梯度為,由遞推:(4)(5)可得:(6)接下來便可以根據(jù)計算出W,U和b。它們的梯度計算表達式如下所示:(7)(8)(9)3.2雙向循環(huán)神經(jīng)網(wǎng)絡(luò)對音樂序列進行處理時,每個音的特征信息與上下文有關(guān),這時就需要能夠反向傳遞信息的網(wǎng)絡(luò)層。雙向循環(huán)神經(jīng)網(wǎng)絡(luò)包含兩層循環(huán)神經(jīng)網(wǎng)絡(luò),這兩層網(wǎng)絡(luò)的輸入序列相同,傳遞數(shù)據(jù)方向相反。圖5展示了雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的構(gòu)成。圖5雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)圖假設(shè)第一層按時間順序傳遞數(shù)據(jù),第二層反向傳遞數(shù)據(jù),它們在節(jié)點t下的隱藏狀態(tài)分別為,則有:(10)(11)(12)3.3梯度消失問題以反向傳播算法為例,當(dāng)激活函數(shù)f為sigmoid函數(shù),即,對其進行求導(dǎo),得到。這個時候,倘若sigmoid函數(shù)接近0或者1時會導(dǎo)致梯度接近于0,造成梯度消失問題。不論是單向循環(huán)神經(jīng)網(wǎng)絡(luò)還是雙向循環(huán)神經(jīng)網(wǎng)絡(luò),都存在梯度消失問題。因此不能直接利用它們對音樂序列進行處理。3.4LSTM算法長短時間記憶算法(LSTM算法),是包含塊(Block)和門神經(jīng)元(gateunit)的一個遞歸神經(jīng)網(wǎng)絡(luò)。塊能夠?qū)ι窠?jīng)網(wǎng)絡(luò)中的神經(jīng)元進行分組管理,門神經(jīng)元用來控制數(shù)據(jù)流,能有效解決梯度消失問題。下圖為LSTM的網(wǎng)絡(luò)結(jié)構(gòu):圖6LSTM網(wǎng)絡(luò)結(jié)構(gòu)由上圖可以看出,LSTM網(wǎng)絡(luò)利用Memoryblock(塊)代替了傳統(tǒng)的神經(jīng)元,它的輸出向輸出層的所有輸出元傳出的過程也與其所在層相連。而每一個塊又是由若干個MemoryCell(胞)組成。下圖展示了CELL的結(jié)構(gòu):圖7LSTM算法的胞結(jié)構(gòu)每一個胞中都包含一個帶有自反饋連接的中心神經(jīng)元,input,forget和outputgate同時控制著塊內(nèi)所有的胞。Inputgate決定外部的輸入流能否進去塊內(nèi)的胞中,forgetgate決定能夠?qū)械臄?shù)據(jù)進行重置,而outputgate決定塊內(nèi)胞的輸出能否從塊中流出。下面介紹LSTM算法具體的學(xué)習(xí)過程。輸入數(shù)據(jù):初始輸入向量x,時間序列,假設(shè)LSTM網(wǎng)絡(luò)包含n個塊輸出:訓(xùn)練成功的網(wǎng)絡(luò)過程:初始化神經(jīng)網(wǎng)絡(luò)遍歷時間節(jié)點t=1,2,...,n,接著遍歷網(wǎng)絡(luò)中所有塊的所有胞。設(shè)第j塊第v個胞為。上一個時間節(jié)點的輸出為y(t-1),其中第m個神經(jīng)元的輸出為,第m個神經(jīng)元與相連的神經(jīng)元的權(quán)值為,與塊j的input/forget/outputgate神經(jīng)元相連的權(quán)值為。接著計算流向的輸入,。再計算流入控制塊j的input/forget/outputgate神經(jīng)元的輸入。(13)(14)(15)再結(jié)算控制塊j的input/forget/outputgate神經(jīng)元的輸出(16)(17)(18)其中f為值域在[0,1]上的sigmoid函數(shù):(19)接著計算胞為的輸出值。其中h為值域是[-1,1]的sigmoid函數(shù):(20)(21)其中為胞存儲上下文的信息,初始值為0。遍歷所有的輸出層神經(jīng)元,設(shè)第k個輸出神經(jīng)元與連接的權(quán)值為,接受的輸入為。得到輸出。其中為一個sigmoid函數(shù)。查閱所有的輸出神經(jīng)元,計算誤差梯度。設(shè)第k個輸出神經(jīng)元對應(yīng)的標(biāo)簽值為。計算第k個輸出神經(jīng)元的誤差梯度(22)其中為第k個輸出神經(jīng)元的輸入值遍歷所有塊的所有胞,計算與輸出神經(jīng)元相連的權(quán)值改變量。第k個輸出神經(jīng)元與胞相連的權(quán)值改變量為遍歷所有塊=1,2,...,n,修改input/forget/outputgate神經(jīng)元相關(guān)的權(quán)值。在塊j中,設(shè)ouputgate的輸出為,并計算其相應(yīng)的權(quán)值改變量。其中為當(dāng)前outputgate的第m個輸入值。<1>計算塊j內(nèi)所有胞的誤差梯度,胞的誤差梯度為(23)<2>計算塊j的inputgate對應(yīng)的權(quán)值改變量(24)(25)<3>計算塊j的inputgate相關(guān)權(quán)值改變量(26)(27)<4>計算塊j的forgetgate權(quán)值改變量(28)(29)<5>計算胞與輸入神經(jīng)元之間的權(quán)值改變量(30)(31)(32)4實驗介紹本實驗基于Microsoft62位windows10家庭普版下的python3.7進行開發(fā),開發(fā)工具為PyCharm2021,在構(gòu)建神經(jīng)網(wǎng)絡(luò)模型時主要使用框架Keras、tensorflow庫和matplotlib庫。項目組成如下圖所示:圖8項目組成其中,utils.py文件用于從music_midi目錄下將所有mid文件的音符note和和弦chord提取出來,并且將數(shù)據(jù)存進data目錄下得notes文件中。除此之外,utils.py文件定義了convert_midi_to_mp3()函數(shù)和create_music(prediction)函數(shù),前者將神經(jīng)網(wǎng)絡(luò)生成的mid文件轉(zhuǎn)換為mp3文件;后者用神經(jīng)網(wǎng)絡(luò)預(yù)測出的音樂數(shù)據(jù)來生成mid文件,再調(diào)用conver_midi_to_mp3()函數(shù)將mid文件轉(zhuǎn)換為mp3文件。network.py文件定義函數(shù)network_model(),用于構(gòu)建LSTM模型。其包含三個輸入?yún)?shù),分別是inputs、num_pitch和weights_file。inputs為輸入數(shù)據(jù);num_pitch為數(shù)據(jù)對應(yīng)的one-hot編碼;weights_file初始默認(rèn)值為none,需要train.py運行后才能得到。train.py文件用于訓(xùn)練神經(jīng)網(wǎng)絡(luò),將參數(shù)weight存進hdf5文件供模型使用。train()函數(shù)用于訓(xùn)練神經(jīng)網(wǎng)絡(luò),prepare_sequences()函數(shù)為神經(jīng)網(wǎng)絡(luò)提供訓(xùn)練的序列。generate.py文件利用訓(xùn)練時獲得的最佳參數(shù)文件best-weights.hdf5來生成音樂。首先,從data目錄中加載讀取后獲得的音樂數(shù)據(jù)notes;其次,載入訓(xùn)練好的參數(shù)文件,調(diào)用network.py文件生成神經(jīng)網(wǎng)絡(luò)模型,便可以通過函數(shù)network_model()來生成音樂數(shù)據(jù)。最后調(diào)用utils.py文件的create_music()函數(shù)用音樂數(shù)據(jù)生成mid文件,轉(zhuǎn)換為MP3格式。4.1數(shù)據(jù)集本文用于訓(xùn)練的數(shù)據(jù)集有30首音樂,均為mid類型的文件。Mid文件記錄了音樂片段的屬性,如音高、音長和音調(diào)等。部分?jǐn)?shù)據(jù)如圖9所示:圖9music_mid部分?jǐn)?shù)據(jù)機器作曲第一步需要把訓(xùn)練數(shù)據(jù)的mid類型文件轉(zhuǎn)換為note數(shù)組,讀取,記錄對應(yīng)音樂的音符note和和弦chord數(shù)據(jù)并保存到data目錄下。實現(xiàn)函數(shù)是get_notes()。同樣地,notes數(shù)據(jù)也可以轉(zhuǎn)換為mid文件,實現(xiàn)函數(shù)是create_music()。圖10為讀取文件的部分信息:圖10讀取文件的部分信息可以看出,C為主要的音調(diào),樂器為銅管樂器(Brass);節(jié)拍為3/4拍,包含有關(guān)音符和和弦的信息。為了能夠處理方便,需要將音符note和和弦chord進行轉(zhuǎn)換,通常情況下,計算機程序不能直接處理音符和和弦。需要對得到的note數(shù)組進行one-hot編碼,也就是對音符note進行編號。例如,音符A5的編號是0,F(xiàn)5的編號是4。經(jīng)過one-hot編碼處理后的數(shù)據(jù)才能傳遞給神經(jīng)網(wǎng)絡(luò)進行處理。通常情況下,一個one-hot向量的長度為78。如果輸入的音樂序列包含50個音符,為了能讓網(wǎng)絡(luò)對數(shù)據(jù)進行處理,需要調(diào)用reshape()函數(shù)將其轉(zhuǎn)換為二維矩陣(50,,78)。同樣地,輸出數(shù)據(jù)與輸入數(shù)據(jù)格式一致。部分?jǐn)?shù)據(jù)如圖11和圖12所示:圖11部分輸入數(shù)據(jù)和輸出數(shù)據(jù)圖12one-hot編碼后的部分?jǐn)?shù)據(jù)4.2模型構(gòu)建模型架構(gòu)圖如下所示:圖13LSTM模型框架圖該LSTM網(wǎng)絡(luò)神經(jīng)元的數(shù)目是512,輸出層的維度同樣是512個。首先利用框架Keras的shape設(shè)置LSTM的第一個層輸入數(shù)據(jù)的形狀;當(dāng)return_sequences為True時,return所有的輸出序列,為False則給出輸出序列的最后一個數(shù)據(jù)。然后利用Dropout函數(shù)丟棄30%的神經(jīng)元,這是為了防止過度擬合,同時返回所有的輸出序列,再重復(fù)Dropout函數(shù),返回輸出序列的最后一個。把數(shù)據(jù)傳遞到全連接神經(jīng)元后再進行Dropout,利用Dense輸出所有不重復(fù)的音調(diào)的數(shù)目。接著到激活層,利用softmax激活函數(shù)算各個不同音調(diào)的概率,最后利用交叉熵計算誤差。4.3網(wǎng)絡(luò)訓(xùn)練對神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練先,需要為神經(jīng)網(wǎng)絡(luò)準(zhǔn)備好供訓(xùn)練的序列,實現(xiàn)函數(shù)是prepare_sequences()。首先需要get_notes函數(shù)對音樂數(shù)據(jù)進行讀取,再獲取排序不重復(fù)的音符名稱。接著為了方便訓(xùn)練,設(shè)計一個字典pitch_to_int,把音符映射成數(shù)字。再定義該神經(jīng)網(wǎng)絡(luò)的輸入序列和輸出序列,把映射后得到的整數(shù)分別存進去。實現(xiàn)函數(shù)是append()。隨后利用導(dǎo)入的numpy函數(shù)reshape()把輸入序列轉(zhuǎn)換為神經(jīng)網(wǎng)絡(luò)模型可以接受的形狀,同時將輸入進行歸一化。最后利用Keras框架的to_categorical()將輸出轉(zhuǎn)化為0-1布爾矩陣,以配合交叉熵誤差法使用。訓(xùn)練函數(shù)為train(),用設(shè)計好的prepare_sequences()函數(shù)獲取輸入和輸出序列后,用Keras的ModelCheckpoint對損失進行監(jiān)控并取最小的損失進行記錄。用Checkpoint文件可以保存每一個Epoch(所有訓(xùn)練樣本完成一次迭代)結(jié)束時模型所對應(yīng)的參數(shù),這樣就防止在訓(xùn)練過程中丟失模型參數(shù)。最后利用fit方法對模型進行訓(xùn)練。我們首先讀取music_mid文件下的音樂對神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練,所有訓(xùn)練樣本完成一次迭代用Epoch表示。下圖為訓(xùn)練數(shù)據(jù)迭代10個Epoch后得到的結(jié)果:圖14訓(xùn)練數(shù)據(jù)圖其中,loss為損失。同時生成了3個參數(shù)文件:weights-01-4.1977.hdf5、weights-02-4.1061.hdf5和weights-03-4.1036.hdf5。可以看出,最小損失值為4.1036,將最后一個文件重新命名為best-weights.hdf5,供后續(xù)generate.py生成音樂。同理,對神經(jīng)網(wǎng)絡(luò)進行100個Epoch迭代后,得到的損失如下圖所示:圖15100次Epoch獲得的損失數(shù)據(jù)圖16為損失loss隨著Epoch變化的圖象。圖16Epoch-Loss圖象4.4音樂生成用訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型來作曲,大概思路如下圖所示:圖17作曲思路圖先加載用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的音樂數(shù)據(jù),再調(diào)用prepare_sequuences()函數(shù)為神經(jīng)網(wǎng)絡(luò)提供訓(xùn)練的序列,同時載入訓(xùn)練時包含最小損失的參數(shù)文件,調(diào)取network.py文件獲取神經(jīng)網(wǎng)絡(luò)模型model。接著利用generate_notes()函數(shù)生成音樂數(shù)據(jù)prediction,調(diào)用create_music(prediction)函數(shù)用音樂數(shù)據(jù)生成Mid文件,再轉(zhuǎn)換為MP3即可。上述10個epoch訓(xùn)練后得到結(jié)果如下圖所示:圖1810Epoch訓(xùn)練生成的音樂播放生成的音樂output.mid后,發(fā)現(xiàn)音樂旋律比較單一。這是因為訓(xùn)練集數(shù)目比較少。100個Epoch訓(xùn)練后得到的音樂;圖19100Epoch訓(xùn)練生成的音樂5總結(jié)與展望5.1總結(jié)本文首先介紹了機器作曲的基本概念、主要算法、難點和對其進行研究的意義及應(yīng)用。接著介紹機器作曲過程中可能用到的常見的音樂特征,如音色、音長、音高等;同時提出音樂知識的表示方法,包括直接表示法和0-1表示法。隨后給出循環(huán)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)組成、算法、梯度消失問題和LSTM算法。循環(huán)神經(jīng)網(wǎng)絡(luò)常見類型有單向循環(huán)神經(jīng)網(wǎng)絡(luò)和雙向循環(huán)神經(jīng),用于處理時間序列數(shù)據(jù)。在使用循環(huán)神經(jīng)網(wǎng)絡(luò)作曲前,需要將音樂表示為與時刻有關(guān)的序列。本次實驗所用的訓(xùn)練集是從網(wǎng)上資源站下載的流行音樂,均為mid格式??梢酝ㄟ^編寫函數(shù)將mid格式文件轉(zhuǎn)換為包含音符和和弦的數(shù)據(jù)。但是,使用循環(huán)神經(jīng)網(wǎng)絡(luò)時常常會碰到梯度消失問題,這樣便不能直接利用其進行作曲。為了解決梯度消失問題,我們使用LSTM算法進行作曲。LSTM算法通過input、forget和outputgate等門控對輸入信息、內(nèi)部狀態(tài)信息和輸出信息進行控制,這使得其具有長期記憶能力。當(dāng)時間序列過長時,LSTM網(wǎng)絡(luò)仍然可以記錄各個時刻的參數(shù),而不會出現(xiàn)梯度消失問題。5.2展望 在本次實驗中,訓(xùn)練集僅為30首流行音樂,利用LSTM算法進行作曲后得到的音樂顯得比較單調(diào)。為了生成更具旋律的音樂,應(yīng)該為神經(jīng)網(wǎng)絡(luò)提供至少100個訓(xùn)練集。除此之外,本次實驗沒有對生成的音樂進行質(zhì)量評估。這是實驗的一個不足之處。目前,人工神經(jīng)網(wǎng)絡(luò)算法正在不斷的進行優(yōu)化。如果能夠開發(fā)出對訓(xùn)練集數(shù)目要求較低的新型神經(jīng)網(wǎng)絡(luò),機器作曲創(chuàng)作出的音樂會更悅耳動聽。更重要的是,需要考慮如何建立一個符合人們對音樂的看法的評價機制,以創(chuàng)作出更能滿足人們追求的音樂。參考文獻算法作曲的研究進展[J]馮寅,周昌樂.軟件學(xué)報.2006(02)五線譜基礎(chǔ)教程[M].航空工業(yè)出版社,黃紅盈編著,2005算法作曲及分層結(jié)構(gòu)控制[J].劉健.黃鐘(中國.武漢音樂學(xué)院學(xué)報).2003(02)遺傳算法作曲系統(tǒng)研究[J].張英俐,劉弘,馬金剛.信息技術(shù)與信息化.2005(05)遺傳算法在作曲中的應(yīng)用[J].張英俐,劉弘,李少輝.計算機應(yīng)用研究.2005(11)郭震.基于神經(jīng)網(wǎng)絡(luò)的專家系統(tǒng)實現(xiàn)研究[J].紅水河,2003,22(3):62-65.單薇.利用神經(jīng)網(wǎng)絡(luò)專家系統(tǒng)支持企業(yè)家網(wǎng)絡(luò)的實現(xiàn)[J].數(shù)量經(jīng)濟技術(shù)經(jīng)濟研究;2000,(4);56-57徐云濤BP神經(jīng)網(wǎng)絡(luò)在專家系統(tǒng)知識獲取上的應(yīng)用[J].大眾科技,20

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論