學會python可以做自己想做的事----用Python給你喜歡的音樂分個類吧
你喜歡什麼樣的音樂?目前,很多公司實現了對音樂的分類,要麼是為了向客戶提供推薦(如Spotify、SoundCloud),要麼只是作為一種產品(如Shazam)。對音樂進行分類,首先要確定音樂型別。事實證明,用機器學習技術從大量資料中找出音樂的各種潮流和型別是非常成功的。音樂分析亦然。
本文我們將學習如何用Python進行音訊/音樂訊號分析以及之後如何用該技能對不同型別的音樂片段進行分類。
在這裡給大家推薦一個python系統學習q群:250933691有免費開發工具以及初學資料,(資料分析,爬蟲,機器學習,神經網路)每天有老師給大家免費授課,歡迎一起交流學習
用Python處理音訊
聲音以音訊訊號的形式表示,音訊訊號具有頻率、頻寬、分貝等引數,音訊訊號一般可表示為振幅和時間的函式。
這些聲音有多種格式,因此計算機可以對其進行讀取和分析。例如:
• mp3 格式
• WMA (Windows Media Audio) 格式
• wav (Waveform Audio File) 格式
音訊庫
Python有一些很好用的音訊處理庫,比如Librosa和PyAudio。另外,還有一些基本的音訊功能的內建模組。
我們將主要使用兩個音訊庫進行音訊採集和回放,如下:
1.Librosa
Librosa是一個Python模組,通常用於分析音訊訊號,但更適合音樂訊號分析。它包括構建一個音樂資訊檢索(MIR)系統的具體細節,目前,Librosa已充分實現文件化,並具有許多相關的示例和教程。
安裝
pip install librosa
or
conda install -c conda-forge librosa
可以安裝附帶很多音訊解碼器的ffmpeg(一個開源免費跨平臺的視訊和音訊流方案)以提高音訊解碼功率。
2.IPython.display.Audio
IPython.display.Audio可以讓使用者直接在Jupyter notebook中播放音訊。
音訊包載入
import librosa
audio_path = '../T08-violin.wav'
x , sr = librosa.load(audio_path)
print(type(x), type(sr))
<class 'numpy.ndarray'> <class 'int'>
print(x.shape, sr)
(396688,) 22050
以上步驟的返回值為一段音訊的時間序列,其預設取樣頻率(sr)為22KHZ mono。我們可將其改為:
librosa.load(audio_path, sr=44100)
可重新取樣為44.1KHZ,
librosa.load(audio_path, sr=None)
或者不重新取樣。
取樣頻率指音訊每秒鐘的取樣樣本數,以Hz或kHz表示。
音訊播放
用Ipython.display.Audio 播放音訊。
import IPython.display as ipd
ipd.Audio(audio_path)
以上步驟的返回值為Jupyter notebook的一個音訊外掛。如下:
這裡的外掛不起作用,不過放到你的notebooks上就可以了。
以下音訊也可用mp3格式或WMA格式聽。
視覺化音訊(Visualizing Audio)
波形音訊 (Waveform)
我們可以用librosa.display.waveplot來繪製音訊。
%matplotlib inline
import matplotlib.pyplot as plt
import librosa.display
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)
上圖顯示了該段波形音訊的振幅包絡線(amplitude envelope)。
聲譜圖(spectrogram)
聲譜圖(spectrogram)是聲音或其他訊號的頻率隨時間變化時的頻譜(spectrum)的一種直觀表示。聲譜圖有時也稱sonographs,voiceprints,或者voicegrams。當資料以三維圖形表示時,可稱其為瀑布圖(waterfalls)。在二維陣列中,第一個軸是頻率,第二個軸是時間。
我們可以用librosa.display.specshow 來展示聲譜圖。
X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X))
plt.figure(figsize=(14, 5))
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')
plt.colorbar()
縱軸顯示的是頻率(從0到10kHz),橫軸顯示的是音訊的時間。因為所有可見的波動都發生在頻譜的底部,故這裡將頻率軸轉換成對數軸。
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='log')
plt.colorbar()
音訊編寫
用librosa.output.write_wav 將NumPy陣列儲存到WAV檔案中。
librosa.output.write_wav('example.wav', x, sr)
建立音訊訊號
現在讓我們建立一個220HZ的音訊訊號。由於音訊訊號是一個numpy陣列,所以建立後需將其轉換為音訊函式。
import numpy as np
sr = 22050 # sample rate
T = 5.0 # seconds
t = np.linspace(0, T, int(T*sr), endpoint=False) # time variable
x = 0.5*np.sin(2*np.pi*220*t)# pure sine wave at 220 Hz
Playing the audio
ipd.Audio(x, rate=sr) # load a NumPy array
Saving the audio
librosa.output.write_wav('tone_220.wav', x, sr)
然後,這就是你建立的第一個音訊訊號。
特徵提取
每一個音訊訊號都有很多特徵。然而,我們必須提取出與我們試圖解決的問題相關的特徵。提取特徵以用於分析的過程稱為特徵提取。接下來我們將詳細研究其中幾個特徵。
過零率(Zero Crossing Rate)
過零率(zero crossing rate)是一個訊號符號變化的比率,即,在每幀中,語音訊號從正變為負或從負變為正的次數。 這個特徵已在語音識別和音樂資訊檢索領域得到廣泛使用,通常對類似金屬、搖滾等高衝擊性的聲音的具有更高的價值。
現在我們來計算示例音訊片段的過零率:
# Load the signal
x, sr = librosa.load('../T08-violin.wav')
#Plot the signal:
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)
# Zooming in
n0 = 9000
n1 = 9100
plt.figure(figsize=(14, 5))
plt.plot(x[n0:n1])
plt.grid()
上圖似乎有6個過零點,用librosa來驗證下該結果。
zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)
print(sum(zero_crossings))
頻譜質心(Spectral Centroid)
頻譜質心指示聲音的“質心”位於何處,並按照聲音的頻率的加權平均值來加以計算。 假設現有兩首歌曲,一首是藍調歌曲,另一首是金屬歌曲。現在,與同等長度的藍調歌曲相比,金屬歌曲在接近尾聲位置的頻率更高。所以藍調歌曲的頻譜質心會在頻譜偏中間的位置,而金屬歌曲的頻譜質心則靠近頻譜末端。
用librosa.feature.spectral_centroid 計算出每一幀音訊訊號的頻譜質心。
spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]
spectral_centroids.shape
(775,)
# Computing the time variable for visualization
frames = range(len(spectral_centroids))
t = librosa.frames_to_time(frames)
# Normalising the spectral centroid for visualisation
def normalize(x, axis=0):
return sklearn.preprocessing.minmax_scale(x, axis=axis)
#Plotting the Spectral Centroid along the waveform
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_centroids), color='r')
頻譜質心在接近末端處有上升。
譜滾降(Spectral Rolloff)
譜滾降(Spectral Rolloff)是對訊號形狀的測量,表示的是在譜能量的特定百分比(如85%)時的頻率。
librosa.feature.spectral_rolloff 計算出每一幀訊號的滾降頻率。
spectral_rolloff = librosa.feature.spectral_rolloff(x+0.01, sr=sr)[0]
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_rolloff), color='r')
梅爾頻率倒譜系數(Mel-Frequency Cepstral Coefficients)
訊號的梅爾頻率倒譜系數(MFCC)是一個通常由10-20個特徵構成的集合,可簡明地描述頻譜包絡的總體形狀,對語音特徵進行建模。
這次我們使用一個簡單的迴圈波。
x, fs = librosa.load('../simple_loop.wav')
librosa.display.waveplot(x, sr=sr)
用librosa.feature.mfcc 計算出音訊訊號的梅爾頻率倒譜系數:
mfccs = librosa.feature.mfcc(x, sr=fs)
print mfccs.shape
(20, 97)
#Displaying the MFCCs:
librosa.display.specshow(mfccs, sr=sr, x_axis='time')
計算出該段超過97幀的音訊的梅爾頻率倒譜系數為20。
我們也可以給特徵標上刻度,使其每個係數有相應的零均值和單位方差。
import sklearn
mfccs = sklearn.preprocessing.scale(mfccs, axis=1)
print(mfccs.mean(axis=1))
print(mfccs.var(axis=1))
librosa.display.specshow(mfccs, sr=sr, x_axis='time')
Chroma Frequencies
色度特徵是對音樂音訊的一種有趣生動的表示,可將整個頻譜投射到代表“八度”(在音樂中,相鄰的音組中相同音名的兩個音,包括變化音級,稱之為八度。)上12個不同的半音(或色度)的12進位制上。色度向量(chroma vector )(維基百科)(FMP,p.123)是一個通常包含12個元素特徵的向量,表示訊號中每個音級{C, C#, D, D#, E, …, B}中的能量。
用librosa.feature.chroma_stft 計算Chroma Frequencies。
# Loadign the file
x, sr = librosa.load('../simple_piano.wav')
hop_length = 512
chromagram = librosa.feature.chroma_stft(x, sr=sr, hop_length=hop_length)
plt.figure(figsize=(15, 5))
librosa.display.specshow(chromagram, x_axis='time', y_axis='chroma', hop_length=hop_length, cmap='coolwarm')
案例分析:對歌曲型別進行分類
以上我們對聲學(聽覺)訊號及其特徵和特徵提取過程進行了概述,現在讓我們用剛習得的技能來解決機器學習問題。
目標
本節,我們將嘗試建立一個分類器將歌曲歸為不同的型別。假設這樣一個場景:出於某種原因,我們在硬碟上找到一堆隨機命名的MP3檔案,且檔案裡有音樂。我們的任務是根據音樂型別將它們分到不同的資料夾中,如爵士、古典音樂、鄉村音樂、流行音樂、搖滾樂和金屬樂。
資料集
我們將用最常用的的GITZAN資料集進行案例研究。G. Tzanetakis和P. Cook在2002年IEEETransactions on audio and Speech Processing中發表的著名論文: Musical genre classification of audio signals (音訊訊號的音樂型別分類)中曾用到該資料集。
該資料集每30秒包含1000條音軌,共包含10個音樂型別,即布魯斯、古典、鄉村、迪斯科、嘻哈、爵士、雷鬼、搖滾、金屬和流行音樂。每種型別包含100段聲頻。
資料處理
在訓練分類模型之前,我們須將原始資料從音訊樣本轉換成更有意義的表示形式。需將音訊片段從.au格式轉換為能與python的 wave模組相容的.wav格式,以讀取音訊檔案。不過我常用的是開源SoX模組。
sox input.au output.wav
分類
特徵提取(Feature Extraction)
我們接下來需要從音訊檔案中提取出有意義的特徵。為了對音訊片段進行分類,這裡將選擇5個特徵,即梅爾頻率倒譜系數(Mel-Frequency Cepstral Coefficients),頻譜質心 (Spectral Centroid),過零率(Zero Crossing Rate), Chroma Frequencies,譜滾降(Spectral Roll-off)。然後將所有特徵附加到.csv檔案中,以便使用分類演算法。
分類(Classification)
提取出特徵後,用現有的分類演算法將歌曲分為不同的型別。你可以直接用聲譜圖進行分類,也可以在提取特徵後使用分類模型。
無論採用哪種方式,都要在模型上進行大量的實驗。你可以進行試驗和改進結果。建議試試CNN模型,它(在聲譜圖上)的精確度更高。
音樂型別分類的筆記
匯入庫
In [0]:
# feature extractoring and preprocessing data
import librosa
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import os
from PIL import Image
import pathlib
import csv
# Preprocessing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
#Keras
import keras
import warnings
warnings.filterwarnings('ignore')
音樂和特徵提取
資料集
我們用GTZAN genre collection 資料集進行分類。
資料集包含10中音樂型別。如下:
• 布魯斯
• 古典
• 鄉村
• 迪斯科
• 嘻哈
• 爵士
• 金屬樂
• 流行音樂
• 雷鬼
• 搖滾
每一種音樂型別包含100首歌曲。共計1000首歌曲。
音訊的聲譜圖提取
In [0]:
cmap = plt.get_cmap('inferno')
plt.figure(figsize=(10,10))
genres = 'blues classical country disco hiphop jazz metal pop reggae rock'.split()
for g in genres:
pathlib.Path(f'img_data/{g}').mkdir(parents=True, exist_ok=True)
for filename in os.listdir(f'./MIR/genres/{g}'):
songname = f'./MIR/genres/{g}/{filename}'
y, sr = librosa.load(songname, mono=True, duration=5)
plt.specgram(y, NFFT=2048, Fs=2, Fc=0, noverlap=128, cmap=cmap, sides='default', mode='default', scale='dB');
plt.axis('off');
plt.savefig(f'img_data/{g}/{filename[:-3].replace(".", "")}.png')
plt.clf()
將所有的音訊檔案轉換成相應的聲譜圖,以方便提取特徵。
聲譜圖特徵提取
我們將提取以下特徵:
• 梅爾頻率倒譜系數(Mel-frequency cepstral coefficients (MFCC))(20 個)
• 頻譜質心(Spectral Centroid)
• 過零率(Zero Crossing Rate)
• Chroma Frequencies
• 譜滾降(Spectral Roll-off)
In [0]:
header = 'filename chroma_stft rmse spectral_centroid spectral_bandwidth rolloff zero_crossing_rate'
for i in range(1, 21):
header += f' mfcc{i}'
header += ' label'
header = header.split()
將資料寫入csv 檔案
In [0]:
file = open('data.csv', 'w', newline='')
with file:
writer = csv.writer(file)
writer.writerow(header)
genres = 'blues classical country disco hiphop jazz metal pop reggae rock'.split()
for g in genres:
for filename in os.listdir(f'./MIR/genres/{g}'):
songname = f'./MIR/genres/{g}/{filename}'
y, sr = librosa.load(songname, mono=True, duration=30)
chroma_stft = librosa.feature.chroma_stft(y=y, sr=sr)
spec_cent = librosa.feature.spectral_centroid(y=y, sr=sr)
spec_bw = librosa.feature.spectral_bandwidth(y=y, sr=sr)
rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)
zcr = librosa.feature.zero_crossing_rate(y)
mfcc = librosa.feature.mfcc(y=y, sr=sr)
to_append = f'{filename} {np.mean(chroma_stft)} {np.mean(rmse)} {np.mean(spec_cent)} {np.mean(spec_bw)} {np.mean(rolloff)} {np.mean(zcr)}'
for e in mfcc:
to_append += f' {np.mean(e)}'
to_append += f' {g}'
file = open('data.csv', 'a', newline='')
with file:
writer = csv.writer(file)
writer.writerow(to_append.split())
以上資料已被提取並寫入data.csv檔案。
用Pandas進行資料分析
In [6]:
data = pd.read_csv('data.csv')
data.head()
Out[6]:
5行× 28列
In [7]:
data.shape
Out[7]:
(1000, 28)
In [0]:
# Dropping unneccesary columns
data = data.drop(['filename'],axis=1)
對標籤進行編碼
In [0]:
genre_list = data.iloc[:, -1]
encoder = LabelEncoder()
y = encoder.fit_transform(genre_list
給特徵欄標上刻度
In [0]:
scaler = StandardScaler()
X = scaler.fit_transform(np.array(data.iloc[:, :-1], dtype = float))
將資料分為訓練集和測試集
In [0]:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
In [12]:
len(y_train)
Out[12]:
800
In [13]:
len(y_test)
Out[13]:
200
In [14]:
X_train[10]
Out[14]:
array([-0.9149113 , 0.18294103, -1.10587131, -1.3875197 , -1.14640873,
-0.97232926, -0.29174214, 1.20078936, -0.68458101, -0.55849017,
-1.27056582, -0.88176926, -0.74844069, -0.40970382, 0.49685952,
-1.12666045, 0.59501437, -0.39783853, 0.29327275, -0.72916871,
0.63015786, -0.91149976, 0.7743942 , -0.64790051, 0.42229852,
-1.01449461])
使用Keras進行分類
建立自己的網路
In [0]:
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(256, activation='relu', input_shape=(X_train.shape[1],)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
In [0]:
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
In [19]:
history = model.fit(X_train,
y_train,
epochs=20,
batch_size=128)
Epoch 1/20
800/800 [==============================] - 1s 811us/step - loss: 2.1289 - acc: 0.2400
Epoch 2/20
800/800 [==============================] - 0s 39us/step - loss: 1.7940 - acc: 0.4088
Epoch 3/20
800/800 [==============================] - 0s 37us/step - loss: 1.5437 - acc: 0.4450
Epoch 4/20
800/800 [==============================] - 0s 38us/step - loss: 1.3584 - acc: 0.5413
Epoch 5/20
800/800 [==============================] - 0s 38us/step - loss: 1.2220 - acc: 0.5750
Epoch 6/20
800/800 [==============================] - 0s 41us/step - loss: 1.1187 - acc: 0.6288
Epoch 7/20
800/800 [==============================] - 0s 37us/step - loss: 1.0326 - acc: 0.6550
Epoch 8/20
800/800 [==============================] - 0s 44us/step - loss: 0.9631 - acc: 0.6713
Epoch 9/20
800/800 [==============================] - 0s 47us/step - loss: 0.9143 - acc: 0.6913
Epoch 10/20
800/800 [==============================] - 0s 37us/step - loss: 0.8630 - acc: 0.7125
Epoch 11/20
800/800 [==============================] - 0s 36us/step - loss: 0.8095 - acc: 0.7263
Epoch 12/20
800/800 [==============================] - 0s 37us/step - loss: 0.7728 - acc: 0.7700
Epoch 13/20
800/800 [==============================] - 0s 36us/step - loss: 0.7433 - acc: 0.7563
Epoch 14/20
800/800 [==============================] - 0s 45us/step - loss: 0.7066 - acc: 0.7825
Epoch 15/20
800/800 [==============================] - 0s 43us/step - loss: 0.6718 - acc: 0.7787
Epoch 16/20
800/800 [==============================] - 0s 36us/step - loss: 0.6601 - acc: 0.7913
Epoch 17/20
800/800 [==============================] - 0s 36us/step - loss: 0.6242 - acc: 0.7963
Epoch 18/20
800/800 [==============================] - 0s 44us/step - loss: 0.5994 - acc: 0.8038
Epoch 19/20
800/800 [==============================] - 0s 42us/step - loss: 0.5715 - acc: 0.8125
Epoch 20/20
800/800 [==============================] - 0s 39us/step - loss: 0.5437 - acc: 0.8250
In [20]:
test_loss, test_acc = model.evaluate(X_test,y_test)
200/200 [==============================] - 0s 244us/step
In [21]:
print('test_acc: ',test_acc)
test_acc: 0.68
以上資料的精確度不如訓練資料的精確度高,這說明可能存在“過度擬合”(Overfitting)。
對所用方法進行驗證
我們要從訓練資料中留出200個樣本作為測驗集:
In [0]:
x_val = X_train[:200]
partial_x_train = X_train[200:]
y_val = y_train[:200]
partial_y_train = y_train[200:]
Now let's train our network for 20 epochs:
In [37]:
model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(X_train.shape[1],)))
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(partial_x_train,
partial_y_train,
epochs=30,
batch_size=512,
validation_data=(x_val, y_val))
results = model.evaluate(X_test, y_test)
Train on 600 samples, validate on 200 samples
Epoch 1/30
600/600 [==============================] - 1s 1ms/step - loss: 2.3074 - acc: 0.0950 - val_loss: 2.1857 - val_acc: 0.2850
Epoch 2/30
600/600 [==============================] - 0s 65us/step - loss: 2.1126 - acc: 0.3783 - val_loss: 2.0936 - val_acc: 0.2400
Epoch 3/30
600/600 [==============================] - 0s 59us/step - loss: 1.9535 - acc: 0.3633 - val_loss: 1.9966 - val_acc: 0.2600
Epoch 4/30
600/600 [==============================] - 0s 58us/step - loss: 1.8082 - acc: 0.3833 - val_loss: 1.8713 - val_acc: 0.3250
Epoch 5/30
600/600 [==============================] - 0s 59us/step - loss: 1.6663 - acc: 0.4083 - val_loss: 1.7302 - val_acc: 0.3450
Epoch 6/30
600/600 [==============================] - 0s 52us/step - loss: 1.5329 - acc: 0.4550 - val_loss: 1.6233 - val_acc: 0.3700
Epoch 7/30
600/600 [==============================] - 0s 62us/step - loss: 1.4236 - acc: 0.4850 - val_loss: 1.5402 - val_acc: 0.3950
Epoch 8/30
600/600 [==============================] - 0s 57us/step - loss: 1.3250 - acc: 0.5117 - val_loss: 1.4655 - val_acc: 0.3800
Epoch 9/30
600/600 [==============================] - 0s 52us/step - loss: 1.2338 - acc: 0.5633 - val_loss: 1.3927 - val_acc: 0.4650
Epoch 10/30
600/600 [==============================] - 0s 61us/step - loss: 1.1577 - acc: 0.5983 - val_loss: 1.3338 - val_acc: 0.5500
Epoch 11/30
600/600 [==============================] - 0s 64us/step - loss: 1.0981 - acc: 0.6317 - val_loss: 1.3111 - val_acc: 0.5550
Epoch 12/30
600/600 [==============================] - 0s 52us/step - loss: 1.0529 - acc: 0.6517 - val_loss: 1.2696 - val_acc: 0.5400
Epoch 13/30
600/600 [==============================] - 0s 52us/step - loss: 0.9994 - acc: 0.6567 - val_loss: 1.2480 - val_acc: 0.5400
Epoch 14/30
600/600 [==============================] - 0s 65us/step - loss: 0.9673 - acc: 0.6633 - val_loss: 1.2384 - val_acc: 0.5700
Epoch 15/30
600/600 [==============================] - 0s 58us/step - loss: 0.9286 - acc: 0.6633 - val_loss: 1.1953 - val_acc: 0.5800
Epoch 16/30
600/600 [==============================] - 0s 59us/step - loss: 0.8849 - acc: 0.6783 - val_loss: 1.2000 - val_acc: 0.5550
Epoch 17/30
600/600 [==============================] - 0s 61us/step - loss: 0.8621 - acc: 0.6850 - val_loss: 1.1743 - val_acc: 0.5850
Epoch 18/30
600/600 [==============================] - 0s 61us/step - loss: 0.8195 - acc: 0.7150 - val_loss: 1.1609 - val_acc: 0.5750
Epoch 19/30
600/600 [==============================] - 0s 62us/step - loss: 0.7976 - acc: 0.7283 - val_loss: 1.1238 - val_acc: 0.6150
Epoch 20/30
600/600 [==============================] - 0s 63us/step - loss: 0.7660 - acc: 0.7650 - val_loss: 1.1604 - val_acc: 0.5850
Epoch 21/30
600/600 [==============================] - 0s 65us/step - loss: 0.7465 - acc: 0.7650 - val_loss: 1.1888 - val_acc: 0.5700
Epoch 22/30
600/600 [==============================] - 0s 65us/step - loss: 0.7099 - acc: 0.7517 - val_loss: 1.1563 - val_acc: 0.6050
Epoch 23/30
600/600 [==============================] - 0s 68us/step - loss: 0.6857 - acc: 0.7683 - val_loss: 1.0900 - val_acc: 0.6200
Epoch 24/30
600/600 [==============================] - 0s 67us/step - loss: 0.6597 - acc: 0.7850 - val_loss: 1.0872 - val_acc: 0.6300
Epoch 25/30
600/600 [==============================] - 0s 67us/step - loss: 0.6377 - acc: 0.7967 - val_loss: 1.1148 - val_acc: 0.6200
Epoch 26/30
600/600 [==============================] - 0s 64us/step - loss: 0.6070 - acc: 0.8200 - val_loss: 1.1397 - val_acc: 0.6150
Epoch 27/30
600/600 [==============================] - 0s 66us/step - loss: 0.5991 - acc: 0.8167 - val_loss: 1.1255 - val_acc: 0.6300
Epoch 28/30
600/600 [==============================] - 0s 62us/step - loss: 0.5656 - acc: 0.8333 - val_loss: 1.0955 - val_acc: 0.6350
Epoch 29/30
600/600 [==============================] - 0s 66us/step - loss: 0.5513 - acc: 0.8300 - val_loss: 1.1030 - val_acc: 0.6050
Epoch 30/30
600/600 [==============================] - 0s 56us/step - loss: 0.5498 - acc: 0.8233 - val_loss: 1.0869 - val_acc: 0.6250
200/200 [==============================] - 0s 65us/step
In [38]:
results
Out[38]:
[1.2261371064186095, 0.65]
對測試集進行預測
In [0]:
predictions = model.predict(X_test)
In [26]:
predictions[0].shape
Out[26]:
(10,)
In [27]:
np.sum(predictions[0])
Out[27]:
1.0
In [28]:
np.argmax(predictions[0])
Out[28]:
8
In [0]:
下一步
音樂型別分類是音樂資訊檢索的眾多分支之一。你還可以對音樂資料執行其他任務,如節拍跟蹤(beat tracking)、音樂生成、推薦系統、音軌分離(track separation)、樂器識別等。音樂分析是一個既多元化又有趣的領域。音樂在某種程度上代表了使用者的一個時刻。在資料科學領域,發現並描述這些時刻將會是一個有趣的挑戰。
在這裡給大家推薦一個python系統學習q群:250933691有免費開發工具以及初學資料,(資料分析,爬蟲,機器學習,神經網路)每天有老師給大家免費授課,歡迎一起交流學習