私人定製——使用深度學習Keras和TensorFlow打造一款音樂推薦係統
隨著生活水平的極大提高,人們在很多情況下都會邊聽音樂邊做一些事情,比如在健身房、出行路上等,越來越多的人也開始慢慢走在Hifi發燒友的這一條不歸路上,頻繁地換耳機、換功放等,小編在這裏勸一下大家不要向某米公司的為發燒而生,要學習某米公司的高性價比,發燒永無止境,適可而止就好。那大家有沒有關注一些音樂APP呢,國內做的好的音樂APP有網易雲、蝦米音樂及QQ音樂等,我們會發現這些APP中都會有兩個類似的功能——我喜歡的音樂及每日歌曲推薦,其中我喜歡的音樂這個功能會記錄你喜歡的音樂,而每日歌曲推薦是根據你喜歡的音樂風格來推薦給你一些你未曾聽過的音樂,看起來是不是很黑科技呢?其實這種技術早就存在,被稱作推薦算法,在生活中隨處可見。根據百度百科的定義:推薦算法是計算機專業中的一種算法,通過一些數學算法,推測出用戶可能喜歡的東西,目前應用推薦算法比較好的地方主要是網絡中。所謂推薦算法就是利用用戶的一些行為,通過一些數學算法,推測出用戶可能喜歡的東西。比如淘寶購物、頁麵定位廣告等。
言歸正傳,本文將利用深度學習向讀者展示一個音樂推薦係統的搭建,感興趣的讀者可以動手嚐試下。國外的音樂獲取沒有國內這麼便利及免費,這也說明國外的月亮一定比國內圓,國內的有些服務確實比國外做的方便。本文作者(後續將以“我”代替)最近幾年已經在junodownload網站花了很多錢,主要是購買購買mp3音樂,該網站是一個主要用於DJ數字下載網站,並且是一個巨大的銷售與跟蹤平台。
從圖上看該網站是一個豐富的音樂資源分享網站,他們為每一首出售的歌曲提供慷慨的2分鍾試聽MP3文件(國內還是良心)。唯一遇到的問題是當在該網站上尋找一個不是最新的或目前不在銷售排行榜的音樂真的很難。
該網站主要側重於推廣新的內容,並認為新的音樂會產生最多的收益,但對於網站上的99%其他銷售能全部跟蹤嗎?
該網站目前已經有了一些跟蹤建議。在主頁上還有銷售列表、新發布的歌單和由人員及DJ策劃的大量的推薦列表。
最重要的是,在每個單獨的跟蹤/單網頁,窗口的右側會“引薦買了這首歌曲的也會買那首歌(類似於亞馬遜網站賣電子書籍)”、“藝術家的其他版本”和“其他版本的家唱片公司”,這些也是有用的。
但對於這樣一個大型的音樂數據庫,我覺得還是缺少根據用戶目前正在聽一的歌曲推薦一些可能也會喜歡歌曲的、建議一些類似的歌曲類型,這也會增加到購物車中的機會等。
如果你能發現音樂是幾年前發布的,並且類似於你喜歡的一個新的歌曲,會不會很酷?當然,Juno網站錯過了不提供這種類型的推薦帶來的潛在銷售的。
受到最近閱讀的一篇博客的啟發,對自己的音樂庫中的歌曲進行音樂流派的分類,我決定嚐試用類似的方法來建立一個音樂推薦係統。
實現過程
實現這一目標需要采集大量數據、處理和模型訓練等步驟。下麵是所有涉及的步驟:
首先要做的第一件事就是下載大量樣本的MP3文件。
該網站上有超過400000的音樂文件可供銷售,隨意挑選了9種不同的音樂流派,然後從每種流派中都隨機選擇1000首。
9種流派:
- 碎拍
- 舞廳
- 慢搖
- 鼓與貝斯
- 經典電音
- 嘻哈/ RB
- 微聲舞曲
- 搖滾/獨立音樂
-
迷幻舞曲
在接下來的幾天日子裏,我下載了這些流派總共9000個MP3文件。
一個音頻文件包含的數據太多,所以在這部分的整個過程中的很大一部分本質上是試圖將信息從音樂中濃縮、提取主要特征並消除所有的“噪音”。它本質上是一個降維的預處理,這第一階段是將音頻轉換成圖像格式。
利用離散傅裏葉變換將音頻信號轉換到頻域上,處理收集的9000個MP3音頻文件,每首歌保存為光譜圖像。光譜圖是一種表示聲音的頻譜隨時間變化的可視化,圖片上顏色的強度代表該頻率的聲音振幅。
本文選擇創建成單色光譜圖,如下圖所示:
上圖是20秒左右的嘻哈音樂產生的聲音。X軸表示時間,Y軸表示聲音的頻率。
為了對這些數據訓練一個模型,需要將所有的圖像統一為相同的尺寸,所以將所有的光譜圖分割為256×256大小。
切割完圖片後,總共得到185000多張圖片,每一張圖像都標記與它所代表的音樂流派的標簽。
下麵將數據集分為訓練集120000張、驗證集45000張和測試集20000張。
利用上部分中的圖像數據訓練一個卷積神經網絡,該網絡要學習不同類型的音樂對應的頻譜圖像,所以使用類型標簽並訓練該網絡能從圖像中識別出音樂的類型。
上圖是本文搭建的卷積神經網絡模型,可以看到,左上邊的光譜圖像將圖像轉換成一個表示每個像素的顏色的數字矩陣;之後數據經過卷積層、池化層以及全連接層等處理後送入到右下角的softmax分類器,分類器給出一個9位數的矢量,其中每位分別對應著9種音樂流派的概率,最後選擇其中最大概率位置的流派為最終識別流派。
卷積神經網絡的表現如何呢?
本文搭建的卷積神經網絡模型能夠以75%的精度分類出歌曲的音樂流派,我個人認為結果還是比較好(後續可以調參及調整網絡模型提高識別精度),這是音樂是主觀的,一首歌曲常常會有一個及以上的類型。
下麵是每種類型歌曲的分類精度的詳細情況:
- 迷幻舞曲:91%
- 鼓與貝斯:90%
- 舞廳:79%
- 碎拍:78%
- 經典電音:71 %
- 慢搖:71 %
- 搖滾/獨立音樂:70%
- 微聲舞曲:63%
-
從結果中可以看到在分類迷幻電音時候表現優異,而分類嘻哈/ RB音樂時效果不是很好,可能的原因是數據集之間有一些交叉可能導致分類精度較低,比如嘻哈、碎拍和舞廳比較類似。而迷幻電音完全不同於其他8個類型的音樂,這可能是其表現優異的原因吧。
關於音樂推薦係統
現在有了訓練好的神經網絡,該網絡能夠“看清”音樂的頻譜圖,因此我們不再需要softmax分類器,所以移除模型中的全連接層。
每個圖像代表超過5秒的音頻信息,而每個MP3文件大約有2分鍾時長,因此每個音樂文件大約對應著23張圖像,即獲得23個特征向量;然後計算這23個特征向量的均值向量,總共得到9000的特征向量;每個特征向量對應著之前下載的9000首歌曲。
回顧整個過程–開始收集9000個音頻文件,並將其轉化為9000個頻譜圖,然後將頻譜圖分成185000個更小的頻譜圖,並利用這些圖像訓練搭建的卷積神經網絡。最後從所有這些圖像中提取185000個特征向量並計算其均值得到9000個對應原始音頻文件的平均向量。
基於已經從音樂文件中提取的128個特征,這些特征能夠確定音樂所屬的類型。為了創建有著類似特征的推薦歌曲,所以需要找到最相似的向量。為此,計算出9000個向量之間的餘弦相似性。
最後一步是隨意選擇一首歌,然後訓練好的模型從9000首歌曲集中推薦一首與之最類似的音樂(最大的餘弦相似性)。
下圖是推薦的幾個例子,播放的第一首歌是隨機選擇的,第3個例子獲得了最類似的推薦。由於網絡受限,播放需要通過外網,圖片下麵對應著播放鏈接。
)
)
)
)
)
整個過程完全是無監督的,這點是很厲害的。想象一下,如果聽完這9000首歌後並評估這些歌曲的不同的特征和類別需要花多少時間。類似的工作也在潘多拉進行,已經開始嚐試這種“音樂基因工程”。根據這篇文章,25個音樂分析師聽完並對10000首歌進行分類所花的時間是一個月,而本文的整個項目從開始到完成僅花費三個星期,並提取了多達450個不同的音樂特征。該模型的表現與人類的表現類似,並且在查找歌曲時不需要任何人預先聽段音頻,此外花費極少的時間。
相關代碼
Matthew Murray:數據科學家和分析師
Linkedin:https://www.linkedin.com/in/mattsrm/
Github: https://github.com/mattmurray
本文由北郵@愛可可-愛生活老師推薦,阿裏雲雲棲社區組織翻譯。
文章原標題《Building a Music Recommender with Deep Learning》,作者:Matthew Murray,譯者:海棠,審閱:李烽
文章為簡譯,更為詳細的內容,請查看原文
最後更新:2017-08-13 22:41:26