【乾貨】用神經網絡識別歌曲流派(附代碼)

2020-12-25 和訊

? 新智元報導 ?

作者:Navdeep Singh

編譯:肖琴

【新智元導讀】本文手把手教你如何構建一個能夠識別歌曲類型的神經網絡。

DataSet: 本文使用GTZAN Genre Collection音樂數據集,地址:[1]

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

使用的庫:Python庫librosa,用於從歌曲中提取特徵,並使用梅爾頻率倒譜係數( Mel-frequency cepstral coefficients ,MFCC)。

MFCC數值模仿人類的聽覺,在語音識別和音樂類型檢測中有廣泛的應用。MFCC值將被直接輸入神經網絡。

了解MFCC

讓我們用兩個例子來說明MFCC。請通過Stereo Surgeon下載Kick Loop 5[2]和Whistling[3]。其中一個是低音鼓聲,另一個是高音口哨聲。它們明顯不同,你可以看到它們的MFCC數值是不同的。

讓我們轉到代碼(本文的所有代碼文件都可以在Github連結中找到)。

以下是你需要導入的內容列表:

librosalibrary

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

numpy

matplotlib,繪製MFCC graphs

Keras的序列模型,一種典型的前饋神經網絡

密集的神經網絡層,即有很多神經元的層。

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

這樣,你已經正式開發了一個輔助函數來顯示MFCC的值

首先,加載歌曲,然後從中提取MFCC值。然後,使用specshow,這是librosa庫裡的頻譜圖。?

這是踏板鼓:

Low frequency: Kick loop?5

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

High frequency: Whistling

顏色越深或越接近紅色,在那個頻率範圍內的能量越大。

限定歌曲流派

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

Song type/genre: Disco

下面是頻率輸出:

Disco Songs

你可以在前面的輸出中看到節拍,但由於它們只有30秒長,因此很難看到單個的節拍。將它與古典樂相比較,會發現古典音樂沒有那麼多的節拍,而是有連續的低音線,比如下面是來自大提琴的低音線:

Song genre: Classical

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

Song genre:?HipHop

HipHop songs

它看起來有點像disco,分辨它們之間的細微區別是神經網絡的問題。

這裡還有另一個輔助函數,它只加載MFCC值,但這次你是正在為神經網絡做準備:

同時加載的是歌曲的MFCC值,但由於這些值可能在-250到+150之間,它們對神經網絡沒有什麼好處。你需要輸入接近-1到+1或0到1的值。

因此,需要計算出每首歌曲的最大值和絕對值。然後將所有值除以最大值。此外,歌曲的長度略有不同,因此只需要選擇25000個MFCC值。你必須非常確定你輸入神經網絡的東西的大小總是相同,因為只有那麼多的輸入神經元,一旦搭建好網絡就無法改變了。

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

接下來,有一個名為generate _features_and_labels的函數,它將遍歷所有不同的流派,並遍歷數據集中的所有歌曲,然後生成MFCC值和流派名:

如上面的截圖所示,準備一個所有特徵和標籤的列表。遍歷全部10種流派。對於每種流派,請查看該文件夾中的文件。'generes /'+ genre +'/ *。au'文件夾顯示數據集的組織方式。

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

對於目前的所有標籤,有一個1000 entry的列表,裡面是藍調、古典、鄉村、迪斯科、嘻哈、爵士、金屬、流行、雷鬼和搖滾等等詞彙。這就成問題了,因為神經網絡不會預測單詞或預測字母。你需要給它一個one-hot編碼,這意味著這裡的每個單詞都將被表示為十個二進位數。

藍調(blues)的情況下,它是1後面跟著9個0。

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

那麼,返回的是1000x10維。因為有1000首歌曲,每個歌曲都有10個二進位數字來表示單熱編碼。然後,通過命令return np.stack(all_features)返回堆疊在一起的所有特徵,onehot_labels到單個矩陣,以及one-hot矩陣。因此,調用上層函數並保存特徵和標籤:

為了確保正確,請列印如下面的截圖所示的特性和標籤的形狀。特性是1000×25000,標籤是1000×10。現在,將數據集拆分為一個列並測試拆分。將80%的標記定義為training_split= 0.8,以執行拆分:

接下來,構建神經網絡:

你會得到一個序列神經網絡。第一層是100個神經元的dense layer。在第一層,你需要給出輸入尺寸或輸入形狀,在這個例子裡,就是25000。

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

第一層將對其輸入,權重和偏差項進行加權求和,然後運行relu激活函數。relu表示任何小於0的都會變成0,任何高於0的都是值本身。

然後,這100個將連接到另外10個,就是輸出層。之所以是10,是因為你已經完成了one-hot編碼並且在編碼中有10個二進位數。

代碼中使用的激活softmax告訴你取10的輸出並對它們進行規範化,使它們加起來為1。這樣,它們最終成為了概率。現在考慮10個中的得分最高或概率最高的作為預測。這將直接對應於最高數字位置。例如,如果它在位置4,那麼它就是disco。

接下來,編譯模型,選擇Adam等優化器,並定義損失函數。由於你有多個輸出,你可能希望進行分類交叉熵和度量準確性,以便除了始終顯示的損失之外,還可以在評估期間看到準確度。但是,準確度更有意義。接下來,列印model.summary,它會告訴你有關層的詳細信息。它看起來是這樣的:

第一個100神經元的層的輸出形狀肯定是100個值,因為有100個神經元,而密集的第二層的輸出是10,因為有10個神經元。那麼,為什麼第一層有250萬個參數或權重?這是因為你有25000個輸入。

你有25000個輸入,每個輸入都會進入100個密集神經元中的一個。因此,也就是250萬個,然後加上100,因為100個個神經元中每個都有自己的bias term,它自身的偏差權重也需要學習。

你有大約250萬個參數或權重。接下來,運行擬合。這需要訓練輸入和訓練標籤,並獲取你想要的epochs數量。你想要10,所以在經過訓練的輸入上重複10次。它需要一個batch size來告訴你這個數字,在這種情況下,歌曲在更新權重之前要遍歷;並且validation_split是0.2,表示要接受20%的訓練輸入,將其拆分出來,實際上並沒有對其進行訓練,並用它來評估每個epoch之後它的表現如何。實際上從來沒有訓練驗證拆分,但驗證拆分可讓你隨時查看進度。

最後,因為你提前將訓練和測試分開了,所以對測試、測試數據進行評估,並列印出測試數據的損失和準確度。以下是訓練結果:

它邊運行邊列印,並始終列印損失和準確性。這是在訓練集本身,而不是驗證集上,所以這應該非常接近1.0。你可能不希望它接近1.0,因為這可能代表過擬合,但是如果你讓它持續足夠長時間,通常會在訓練集上達到1.0的精度,因為它會記住訓練集。

你真正關心的是驗證的準確度,這就需要使用測試集。測試集是以前從未見過的數據,至少不是用於訓練的數據。最終的準確性取決於你提前分離的測試數據。現在你的準確度大約為53%。這看起來比較低,但要知道有10種不同的流派。隨機猜測的準確率是10%,所以這比隨機猜測要好很多。

[1]marsyasweb.appspot.com/download/data_sets/.GTZAN Genre Collection

[2]https://freesound.org/people/Stereo Surgeon/sounds/266093/

[3]https://freesound.org/people/grrlrighter/sounds/98195/

原文:

https://medium.com/@navdeepsingh_2336/identifying-the-genre-of-a-song-with-neural-networks-851db89c42f0

新智元AI WORLD 2018

世界人工智慧峰會全程回顧

新智元於9月20日在北京國家會議中心舉辦AI WORLD 2018世界人工智慧峰會,邀請機器學習教父、CMU教授 Tom Mitchell,邁克思·泰格馬克,周志華,陶大程,陳怡然等AI領袖一起關注機器智能與人類命運。

全程回顧新智元 AI World 2018 世界人工智慧峰會盛況:?

愛奇藝?

上午:https://www.iqiyi.com/v_19rr54cusk.html?

下午:https://www.iqiyi.com/v_19rr54hels.html

新浪:http://video.sina.com.cn/l/p/1724373.html

本文首發於微信公眾號:新智元。文章內容屬作者個人觀點,不代表和訊網立場。投資者據此操作,風險請自擔。

(責任編輯:唐明梅 )

相關焦點

  • OpenAI神經網絡能生成任何流派音樂
    由諸多矽谷大亨聯合建立的AI非營利組織OpenAI,通過平克·弗洛伊德(Pink Floyd)、埃拉·菲茨傑拉德(Ella Fitzgerald)、2Pac等風格的歌曲創作,揭示了AI在音樂領域的全新應用,結果令人驚嘆。只是,有時候這些曲目聽起來很像許多流行音樂的醉酒卡拉OK版本。
  • OpenAI 神經網絡能生成任何流派音樂
    由諸多矽谷大亨聯合建立的AI非營利組織OpenAI,通過平克·弗洛伊德(Pink Floyd)、埃拉·菲茨傑拉德(Ella Fitzgerald)、2Pac等風格的歌曲創作,揭示了AI在音樂領域的全新應用,結果令人驚嘆。只是,有時候這些曲目聽起來很像許多流行音樂的醉酒卡拉OK版本。
  • 火爆網絡的《神經網絡與深度學習》,有人把它翻譯成了中文版!
    ,第一時間送達今天給大家介紹一本非常好的深度學習入門書籍,就是《Neural Network and Deep Learning》,中文譯為《神經網絡與深度學習》。這是我個人以為目前最好的神經網絡與機器學習入門資料之一。內容非常淺顯易懂,很多數學密集的區域作者都有提示。全書貫穿的是 MNIST 手寫數字的識別問題,每個模型和改進都有詳細注釋的代碼。非常適合用來入門神經網絡和深度學習!
  • 實戰|手把手入門神經網絡,74行代碼實現手寫數字識別
    如果別人已經做好了輪子,直接拿過來用則更快。因此,本文直接用Michael Nielsen先生的代碼作為例子,給大家展現神經網絡分析的普遍過程:導入數據,訓練模型,優化模型,啟發式理解等。本文假設大家已經了解python的基本語法,並在自己機器上運行過簡單python腳本。
  • 如何教神經網絡玩 21 點遊戲(附代碼)?
    本文的目標是討論我們是否可以用深度學習來找到一個比上面更好的策略。我們將:使用我們上次編碼的 BLUJACK 模擬器生成數據(通過一些修改,使其更適合於訓練算法)。編碼訓練神經網絡玩 21 點。如果你不熟悉神經網絡,我在這篇文章中寫過它們的簡介。
  • 30行代碼,帶你分分鐘創建神經網絡!(附工具&教程)
    。在本篇文章中,你將學到今天我們要講的例子是一個非常簡單的神經網絡,我們將用它來學習邏輯異或方程(XOR equation)。同時,我也在Scrimba上創建了一個交互式屏幕錄像。你也可以通過觀看視頻來學習本教程。(https://scrimba.com/casts/cast-1980)在開始編程之前,讓我們先快速瀏覽神經網絡的一些基本概念。
  • 神經網絡人工智慧氣體分析儀:識別多種氣味的「電子鼻」
    打開APP 神經網絡人工智慧氣體分析儀:識別多種氣味的「電子鼻」 發表於 2017-12-04 14:13:36 俄羅斯技術、系統和進程領域空間研究實驗室工作人員研製出一款小型「電子鼻」並獲專利,這是一款能快速學習的神經網絡人工智慧氣體分析儀,可識別多種化學物質的氣味。
  • 如何用30行JavaScript代碼編寫神經網絡異或運算器
    近日,編程學習平臺 Scrimba 聯合創始人 Per Harald Borgen 在 Medium 上發文介紹了一種僅用 30 行 JavaScript 代碼就創建出了一個神經網絡的教程,而且使用的工具也只有 Node.js、Synaptic.js 和瀏覽器而已。另外,作者還做了一個交互式 Scrimba 教程,也許能幫你理解其中的複雜概念。
  • 谷歌圖像識別神經網絡製造幻景
    今天36氪的一篇報導說:Faebook的AI技術可以自主生成一些含有飛機、汽車、小鳥等東西在內的場景圖像樣本,令受試者在40%的時間把計算機生成的圖樣當作是真的照片。 今後,我們在網絡上看到的圖片,哪些是人類的創造,哪些是機器的夢想?虛擬和現實之間,還會有明確的邊界麼?
  • RNN遞歸神經網絡原理介紹+數字識別應用
    +圖片識別應用(附源碼)BP神經網絡+TensorFlow做圖片識別前言:自己學習研究完CNN卷積神經網絡後,很久的一段時間因為要完成自己的畢業設計就把更新博客給耽擱了。介紹CNN卷積神經網絡和RNN遞歸神經網絡都是由BP神經網絡演化而來的。CNN卷積神經網絡主要應用在圖像識別領域;而RNN遞歸神經網絡的改進版LSTM網絡主要應用於自然語言處理中;為什麼我介紹RNN是叫——遞歸神經網絡?這之前是一個困擾我很久的問題。
  • 如何用張量分解加速深層神經網絡?(附代碼)
    加上裁剪(pruning),張量分解是加快現有深度神經網絡的實用工具,我希望這篇文章能讓這些內容更加容易理解。這些方法需要將一個層分解成幾個更小的層。儘管在分解後會有更多的層,但是浮點運算次數和權重的總數會變小。一些報告的結果是整個網絡的x8倍的速度提升(不針對像imagenet這樣的大型任務),或者imagenet中的特定層中x4倍的提升。
  • 三步教你搭建給黑白照片上色的神經網絡 !(附代碼)
    免費版支持1個項目、每月20小時GPU時長、10G存儲空間,用上色項目練個手足夠了。進入正題~以下內容編譯自FloydHub官方博客:我將分三個步驟展示如何打造你自己的著色神經網絡。第一部分介紹核心邏輯。
  • 使用Siamese神經網絡進行人臉識別
    ,特別是其中的 Siamese 神經網絡。我將與大家分享我從 deeplearning.ai 上一篇論文 FaceNet《人臉識別和聚類的統一嵌入》上學到的知識。如果你對它很感興趣的話,以此,你可以節省更多的時間深入研究這個話題。更多乾貨內容請關注微信公眾號「AI 前線」,(ID:ai-front) 為了理解為什麼我們有一次性學習的原因,我們需要討論下深度學習和數據。
  • 人工智慧算法:訓練神經網絡中的批量歸一化(附代碼)
    而且,如果您還沒有這樣做的話,本文將解釋BN的基本直覺,包括其起源以及如何使用TensorFlow和Keras在神經網絡中實現它。對於那些熟悉BN技術並且只想專注於實現的人,可以跳到下面的「代碼」部分。
  • 神經網絡篇——從代碼出發理解BP神經網絡
    一提到反向傳播算法,我們就不自覺的想到隨機梯度下降、sigmoid激活函數和最讓人頭大的反向傳播法則的推導,即便是把反向傳播神經網絡的原理學了一遍,也還是一頭霧水,在這裡推薦一本小編認為把BP神經網絡講的最通透的教材《Python神經網絡編程》。
  • 乾貨 | 人臉識別的簡要介紹(附實例、Python代碼)
    本文將介紹人臉識別的基本思路和對代碼進行簡要分析。介紹你是否意識到,每當你上傳照片到Facebook上,平臺都會用人臉識別算法來識別圖片中的人物?目前還有一些政府在用人臉識別技術來識別和抓捕罪犯。此外,最常見的應用就是通過自己的臉部解鎖手機。
  • 深度神經網絡——中文語音識別
    聲學模型是語音識別系統中關鍵的部分,它的作用是對聲學單元產生的特徵序列進行描述,對語音信號進行了分類。我們可以用聲學模型來計算一段觀測到的特徵矢量屬於各個聲學單元的概率並根據似然準則將特徵序列轉化為狀態序列。
  • 【ML系列】手把手教你用Numpy構建神經網絡!(附代碼)
    我們的目標是創建一個程序,該程序能夠創建具有指定體系結構(層的數量和大小以及適當的激活函數)的密集連接的神經網絡。 下圖給出了這種網絡的例子。最重要的是,我們必須能夠訓練該網絡並使用它進行預測。那些已經看過上面代碼並對Numpy有一定經驗的人注意到,矩陣W和向量b已經被小的隨機數填充了。這種做法並非偶然。權重值不能用相同的數字初始化,因為這會導致破壞對稱問題。基本上,如果所有的權值都是一樣的,不管輸入X是多少,隱藏層中的所有單位也是一樣的。在某種程度上,我們陷入了最初的狀態,沒有任何逃脫的希望,無論訓練我們的模型多長時間,我們的網絡有多深。線性代數是不會原諒你的。
  • 如何用Python和深度神經網絡識別圖像?
    你的好友可能(不止一次)給你演示如何用新買的iPhone X做面部識別解鎖了吧?沒有機器對圖像的辨識,能做到嗎?雖然不過寫了10幾行代碼,但是你構建的模型卻足夠複雜和高大上。它就是傳說中的卷積神經網絡(Convolutional Neural Network, CNN)。它是深度機器學習模型的一種。最為簡單的卷積神經網絡大概長這個樣子:
  • 【乾貨】圖神經網絡的十大學習資源分享
    字幕組雙語原文:【乾貨】圖神經網絡的十大學習資源分享英語原文:Top 10 Learning Resources for Graph Neural Networks>翻譯:雷鋒字幕組(聽風1996)圖神經網絡(GNNs)是深度學習的一個相對較新的領域,從最近開始越來越流行。