0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

手把手教你如何構(gòu)建一個(gè)能夠識(shí)別歌曲類型的神經(jīng)網(wǎng)絡(luò)

DPVg_AI_era ? 來(lái)源:未知 ? 作者:李倩 ? 2018-10-27 10:11 ? 次閱讀

本文手把手教你如何構(gòu)建一個(gè)能夠識(shí)別歌曲類型的神經(jīng)網(wǎng)絡(luò)

DataSet: 本文使用GTZAN Genre Collection音樂(lè)數(shù)據(jù)集,地址:[1]

這個(gè)數(shù)據(jù)集包含1000首不同的歌曲,分布在10種不同流派,每個(gè)流派100首,每首歌曲大約30秒。

使用的庫(kù):Python庫(kù)librosa,用于從歌曲中提取特征,并使用梅爾頻率倒譜系數(shù)( Mel-frequency cepstral coefficients ,MFCC)。

MFCC數(shù)值模仿人類的聽覺,在語(yǔ)音識(shí)別和音樂(lè)類型檢測(cè)中有廣泛的應(yīng)用。MFCC值將被直接輸入神經(jīng)網(wǎng)絡(luò)。

了解MFCC

讓我們用兩個(gè)例子來(lái)說(shuō)明MFCC。請(qǐng)通過(guò)Stereo Surgeon下載Kick Loop 5[2]和Whistling[3]。其中一個(gè)是低音鼓聲,另一個(gè)是高音口哨聲。它們明顯不同,你可以看到它們的MFCC數(shù)值是不同的。

讓我們轉(zhuǎn)到代碼(本文的所有代碼文件都可以在Github鏈接中找到)。

以下是你需要導(dǎo)入的內(nèi)容列表:

librosalibrary

glob,你需要列出不同類型目錄中的文件

numpy

matplotlib,繪制MFCC graphs

Keras的序列模型,一種典型的前饋神經(jīng)網(wǎng)絡(luò)

密集的神經(jīng)網(wǎng)絡(luò)層,即有很多神經(jīng)元的層。

例如,與卷積不同的是,它具有2D表示。你必須使用import activation,它允許你為每個(gè)神經(jīng)元層提供一個(gè)激活函數(shù),以及to_categorical,它允許你把類的名稱轉(zhuǎn)換成諸如搖滾(rock),迪斯科(disco)等等,稱為one-hot 編碼, 如下所示:

這樣,你已經(jīng)正式開發(fā)了一個(gè)輔助函數(shù)來(lái)顯示MFCC的值

首先,加載歌曲,然后從中提取MFCC值。然后,使用specshow,這是librosa庫(kù)里的頻譜圖。

這是踏板鼓:

Low frequency: Kick loop5

可以看到,在低頻率下,低音是非常明顯的。沒有多少其他頻率被表示。但是,口哨聲的頻譜圖明顯有更高的頻率表示:

High frequency: Whistling

顏色越深或越接近紅色,在那個(gè)頻率范圍內(nèi)的能量越大。

限定歌曲流派

你甚至可以看到口哨聲的頻率的變化。下面是是disco曲的頻率:

Song type/genre: Disco

下面是頻率輸出:

Disco Songs

你可以在前面的輸出中看到節(jié)拍,但由于它們只有30秒長(zhǎng),因此很難看到單個(gè)的節(jié)拍。將它與古典樂(lè)相比較,會(huì)發(fā)現(xiàn)古典音樂(lè)沒有那么多的節(jié)拍,而是有連續(xù)的低音線,比如下面是來(lái)自大提琴的低音線:

Song genre: Classical

下面是嘻哈音樂(lè)(hip-hop)的頻率:

Song genre:HipHop

HipHop songs

它看起來(lái)有點(diǎn)像disco,分辨它們之間的細(xì)微區(qū)別是神經(jīng)網(wǎng)絡(luò)的問(wèn)題。

這里還有另一個(gè)輔助函數(shù),它只加載MFCC值,但這次你是正在為神經(jīng)網(wǎng)絡(luò)做準(zhǔn)備:

同時(shí)加載的是歌曲的MFCC值,但由于這些值可能在-250到+150之間,它們對(duì)神經(jīng)網(wǎng)絡(luò)沒有什么好處。你需要輸入接近-1到+1或0到1的值。

因此,需要計(jì)算出每首歌曲的最大值和絕對(duì)值。然后將所有值除以最大值。此外,歌曲的長(zhǎng)度略有不同,因此只需要選擇25000個(gè)MFCC值。你必須非常確定你輸入神經(jīng)網(wǎng)絡(luò)的東西的大小總是相同,因?yàn)橹挥心敲炊嗟妮斎肷窠?jīng)元,一旦搭建好網(wǎng)絡(luò)就無(wú)法改變了。

限定歌曲以獲得MFCC值和流派名稱

接下來(lái),有一個(gè)名為generate _features_and_labels的函數(shù),它將遍歷所有不同的流派,并遍歷數(shù)據(jù)集中的所有歌曲,然后生成MFCC值和流派名:

如上面的截圖所示,準(zhǔn)備一個(gè)所有特征和標(biāo)簽的列表。遍歷全部10種流派。對(duì)于每種流派,請(qǐng)查看該文件夾中的文件。'generes /'+ genre +'/ *。au'文件夾顯示數(shù)據(jù)集的組織方式。

處理這個(gè)文件夾時(shí),每個(gè)文件會(huì)有100首歌曲; 你可以提取特征并將這些特征放在all_features.append(features)列表中。那首歌曲的流派名稱也需要列在一個(gè)列表中。因此,最終,所有features將包含1000個(gè)條目,所有標(biāo)簽也將包含1000個(gè)條目。在所有feature的情況下,這1000個(gè)條目中的每一個(gè)都將有25000個(gè)條目。這是一個(gè)1000 x 25000矩陣。

對(duì)于目前的所有標(biāo)簽,有一個(gè)1000 entry的列表,里面是藍(lán)調(diào)、古典、鄉(xiāng)村、迪斯科、嘻哈、爵士、金屬、流行、雷鬼和搖滾等等詞匯。這就成問(wèn)題了,因?yàn)樯窠?jīng)網(wǎng)絡(luò)不會(huì)預(yù)測(cè)單詞或預(yù)測(cè)字母。你需要給它一個(gè)one-hot編碼,這意味著這里的每個(gè)單詞都將被表示為十個(gè)二進(jìn)制數(shù)。

藍(lán)調(diào)(blues)的情況下,它是1后面跟著9個(gè)0。

古典(classical)的情況是,是0后面跟著1,再跟著9個(gè)0。以此類推。首先,通過(guò)np.unique(all_labels, return_inverse=True) 命令將它們作為整數(shù)返回來(lái)計(jì)算所有唯一的名稱。然后,使用to_categorical,將這些整數(shù)轉(zhuǎn)換為one-hot編碼。

那么,返回的是1000x10維。因?yàn)橛?000首歌曲,每個(gè)歌曲都有10個(gè)二進(jìn)制數(shù)字來(lái)表示單熱編碼。然后,通過(guò)命令return np.stack(all_features)返回堆疊在一起的所有特征,onehot_labels到單個(gè)矩陣,以及one-hot矩陣。因此,調(diào)用上層函數(shù)并保存特征和標(biāo)簽:

為了確保正確,請(qǐng)打印如下面的截圖所示的特性和標(biāo)簽的形狀。特性是1000×25000,標(biāo)簽是1000×10?,F(xiàn)在,將數(shù)據(jù)集拆分為一個(gè)列并測(cè)試拆分。將80%的標(biāo)記定義為training_split= 0.8,以執(zhí)行拆分:

接下來(lái),構(gòu)建神經(jīng)網(wǎng)絡(luò):

你會(huì)得到一個(gè)序列神經(jīng)網(wǎng)絡(luò)。第一層是100個(gè)神經(jīng)元的dense layer。在第一層,你需要給出輸入尺寸或輸入形狀,在這個(gè)例子里,就是25000。

這表示每個(gè)示例有多少輸入值。25000將連接到第一層中的100。

第一層將對(duì)其輸入,權(quán)重和偏差項(xiàng)進(jìn)行加權(quán)求和,然后運(yùn)行relu激活函數(shù)。relu表示任何小于0的都會(huì)變成0,任何高于0的都是值本身。

然后,這100個(gè)將連接到另外10個(gè),就是輸出層。之所以是10,是因?yàn)槟阋呀?jīng)完成了one-hot編碼并且在編碼中有10個(gè)二進(jìn)制數(shù)。

代碼中使用的激活softmax告訴你取10的輸出并對(duì)它們進(jìn)行規(guī)范化,使它們加起來(lái)為1。這樣,它們最終成為了概率?,F(xiàn)在考慮10個(gè)中的得分最高或概率最高的作為預(yù)測(cè)。這將直接對(duì)應(yīng)于最高數(shù)字位置。例如,如果它在位置4,那么它就是disco。

接下來(lái),編譯模型,選擇Adam等優(yōu)化器,并定義損失函數(shù)。由于你有多個(gè)輸出,你可能希望進(jìn)行分類交叉熵和度量準(zhǔn)確性,以便除了始終顯示的損失之外,還可以在評(píng)估期間看到準(zhǔn)確度。但是,準(zhǔn)確度更有意義。接下來(lái),打印model.summary,它會(huì)告訴你有關(guān)層的詳細(xì)信息。它看起來(lái)是這樣的:

第一個(gè)100神經(jīng)元的層的輸出形狀肯定是100個(gè)值,因?yàn)橛?00個(gè)神經(jīng)元,而密集的第二層的輸出是10,因?yàn)橛?0個(gè)神經(jīng)元。那么,為什么第一層有250萬(wàn)個(gè)參數(shù)或權(quán)重?這是因?yàn)槟阌?5000個(gè)輸入。

你有25000個(gè)輸入,每個(gè)輸入都會(huì)進(jìn)入100個(gè)密集神經(jīng)元中的一個(gè)。因此,也就是250萬(wàn)個(gè),然后加上100,因?yàn)?00個(gè)個(gè)神經(jīng)元中每個(gè)都有自己的bias term,它自身的偏差權(quán)重也需要學(xué)習(xí)。

你有大約250萬(wàn)個(gè)參數(shù)或權(quán)重。接下來(lái),運(yùn)行擬合。這需要訓(xùn)練輸入和訓(xùn)練標(biāo)簽,并獲取你想要的epochs數(shù)量。你想要10,所以在經(jīng)過(guò)訓(xùn)練的輸入上重復(fù)10次。它需要一個(gè)batch size來(lái)告訴你這個(gè)數(shù)字,在這種情況下,歌曲在更新權(quán)重之前要遍歷;并且validation_split是0.2,表示要接受20%的訓(xùn)練輸入,將其拆分出來(lái),實(shí)際上并沒有對(duì)其進(jìn)行訓(xùn)練,并用它來(lái)評(píng)估每個(gè)epoch之后它的表現(xiàn)如何。實(shí)際上從來(lái)沒有訓(xùn)練驗(yàn)證拆分,但驗(yàn)證拆分可讓你隨時(shí)查看進(jìn)度。

最后,因?yàn)槟闾崆皩⒂?xùn)練和測(cè)試分開了,所以對(duì)測(cè)試、測(cè)試數(shù)據(jù)進(jìn)行評(píng)估,并打印出測(cè)試數(shù)據(jù)的損失和準(zhǔn)確度。以下是訓(xùn)練結(jié)果:

它邊運(yùn)行邊打印,并始終打印損失和準(zhǔn)確性。這是在訓(xùn)練集本身,而不是驗(yàn)證集上,所以這應(yīng)該非常接近1.0。你可能不希望它接近1.0,因?yàn)檫@可能代表過(guò)擬合,但是如果你讓它持續(xù)足夠長(zhǎng)時(shí)間,通常會(huì)在訓(xùn)練集上達(dá)到1.0的精度,因?yàn)樗鼤?huì)記住訓(xùn)練集。

你真正關(guān)心的是驗(yàn)證的準(zhǔn)確度,這就需要使用測(cè)試集。測(cè)試集是以前從未見過(guò)的數(shù)據(jù),至少不是用于訓(xùn)練的數(shù)據(jù)。最終的準(zhǔn)確性取決于你提前分離的測(cè)試數(shù)據(jù)。現(xiàn)在你的準(zhǔn)確度大約為53%。這看起來(lái)比較低,但要知道有10種不同的流派。隨機(jī)猜測(cè)的準(zhǔn)確率是10%,所以這比隨機(jī)猜測(cè)要好很多。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:【干貨】用神經(jīng)網(wǎng)絡(luò)識(shí)別歌曲流派(附代碼)

文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    圖文教程:手把手教你焊接貼片元件

    圖文教程:手把手教你焊接貼片元件,首先來(lái)張全部焊接個(gè)點(diǎn)的PCB圖
    發(fā)表于 04-01 11:03 ?3.6w次閱讀
    圖文教程:<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>焊接貼片元件

    基于labview的BP人工神經(jīng)網(wǎng)絡(luò)曲線擬合小程序

    `點(diǎn)擊學(xué)習(xí)>>《龍哥手把手教你學(xué)LabVIEW視覺設(shè)計(jì)》視頻教程用LabVIEW實(shí)現(xiàn)的BP人工神經(jīng)網(wǎng)絡(luò)曲線擬合,感謝LabVIEW的矩陣運(yùn)算函數(shù),程序流程較之文本型語(yǔ)言清晰很多。[hide] [/hide]`
    發(fā)表于 12-13 16:41

    手把手教你構(gòu)建個(gè)完整的工程

    手把手教你構(gòu)建個(gè)完整的工程
    發(fā)表于 08-03 09:54 ?33次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b><b class='flag-5'>構(gòu)建</b><b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>完整的工程

    手把手教你寫批處理-批處理的介紹

    手把手教你寫批處理-批處理的介紹
    發(fā)表于 10-25 15:02 ?69次下載

    美女手把手教你如何裝機(jī)(中)

    美女手把手教你如何裝機(jī)(中) 再來(lái)是硬碟的部份,這款機(jī)殼還不錯(cuò),可以旋轉(zhuǎn)支架~
    發(fā)表于 01-27 11:14 ?1446次閱讀

    美女手把手教你如何裝機(jī)(下)

    美女手把手教你如何裝機(jī)(下) 接著下來(lái)就是今天的重頭戲,開核蘿!~
    發(fā)表于 01-27 11:16 ?2910次閱讀

    手把手教你學(xué)習(xí)FPGA—LED篇

    電子專業(yè)單片機(jī)相關(guān)知識(shí)學(xué)習(xí)教材資料——手把手教你學(xué)習(xí)FPGA—LED篇
    發(fā)表于 08-08 17:19 ?0次下載

    手把手教你學(xué)電子書制作

    手把手教你學(xué)電子書制作,可以自己DIY電子書
    發(fā)表于 09-13 11:26 ?0次下載

    手把手教你安裝Quartus II

    本章手把手把教你如何安裝 Quartus II 軟件 ,并將它激活 。此外 還有USB -Blaster下載器的驅(qū)動(dòng)安裝步驟 。
    發(fā)表于 09-18 14:55 ?9次下載

    手把手教你在家搭建監(jiān)控系統(tǒng)

    手把手教你在家搭建監(jiān)控系統(tǒng)
    發(fā)表于 01-17 19:47 ?25次下載

    手把手教你做電子時(shí)鐘---前言

    手把手教你做彩鈴電子時(shí)鐘
    發(fā)表于 11-14 16:53 ?11次下載

    手把手教你如何開始DSP編程

    手把手教你如何開始DSP編程。
    發(fā)表于 04-09 11:54 ?12次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>如何開始DSP編程

    手把手教你學(xué)LabVIEW視覺設(shè)計(jì)

    手把手教你學(xué)LabVIEW視覺設(shè)計(jì)手把手教你學(xué)LabVIEW視覺設(shè)計(jì)手把手教你學(xué)LabVIEW視
    發(fā)表于 03-06 01:41 ?3043次閱讀

    手把手教你開關(guān)電源PCB排板

    手把手教你開關(guān)電源PCB排板(新型電源技術(shù))-分享下開關(guān)電源PCB排板的基本要點(diǎn)及分析,以及例子講解。絕對(duì)的手把手
    發(fā)表于 09-18 12:27 ?57次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>開關(guān)電源PCB排板

    手把手教你學(xué)FPGA仿真

    電子發(fā)燒友網(wǎng)站提供《手把手教你學(xué)FPGA仿真.pdf》資料免費(fèi)下載
    發(fā)表于 10-19 09:17 ?2次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>學(xué)FPGA仿真