【Day4】音乐分类小实验

资料集

在这个实验里我们用的原始资料集在这里下载

或是直接从这里下载 csv 跟 notebook 就好

这个资料集名称叫做 GTZAN ,里头一共有 10 种类型的音乐,每种类型有 100 首歌曲,每首歌曲都是 30 秒钟

这 10 种音乐类型为:
0: "disco",
1: "metal",
2: "reggae",
3: "blues",
4: "rock",
5: "classical",
6: "jazz",
7: "hiphop",
8: "country",
9: "pop"

除此之外,他很好心的帮我们把 features 萃取出来了,你还会额外有两个 csv 档,分别是 features_3_sec 跟 features_30_sec

/images/emoticon/emoticon07.gif

features_3_sec 把一首 30 秒的歌切成 10 个音框,每个音框 3 秒,然後计算每 3 秒的 features,所以他的features 数是原本的 10 倍

开始工作

我们就用它提供给的 csv 档来做即可

import pandas as pd 
import numpy as np
from sklearn.preprocessing import LabelEncoder
data = pd.read_csv("features_3_sec.csv")
data.head()

# (9990,60)
data.shape

# 移除有档名的那栏
data = data.drop(labels='filename',axis=1)
# 最後一栏是类别 (str)
class_list = data.iloc[:,-1] 
# 用 LabelEncoder 帮我们把类别编码
convert = LabelEncoder()
y = convert.fit_transform(class_list)
y

x = data.iloc[:,:-1]
x

接着我们要把喂进去的 feature data 常态分布化,这样平均值会变成 0, 标准差变为 1,使离群值影响降低

from sklearn.preprocessing import StandardScaler
fit = StandardScaler()
X = fit.fit_transform(np.array(x,dtype=float))

再切分成 train, valid 两份 data

from sklearn.model_selection import train_test_split
X_train,x_test, Y_train, y_test = train_test_split(X,y,test_size=0.2)
print(len(Y_train),len(y_test))

开始 build 我们的模型吧,单纯用 FCN 就好了

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential(
    [

        Dense(512,input_shape=(X_train.shape[1],),activation='relu'),
        Dense(256,activation='relu'),
        Dense(128,activation='relu'),
        Dense(64,activation='relu'),
        Dense(10,activation='softmax')
    ]
)

model.summary()
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics='accuracy')
    

开 Train

history = model.fit(
                X_train,
                Y_train, 
                validation_data=(x_test,y_test), 
                epochs=600, 
                batch_size=128
                )
                

到这里差不多 test data 就有 9 成的准确率了,我们来看一下 loss 长怎样

from matplotlib import pyplot 
pyplot.plot(history.history['loss'], label='train') 
pyplot.plot(history.history['val_loss'], label='test') 
pyplot.legend()
pyplot.show()

小结

其实你会发现比较恼人的部分是在萃取资料的 feature,以这个资料集来说一段音乐用了 60 个 feature,如果想要试在其他音乐上的话就必须生出那 60 个 feature。当然也可以试着用比较少的 feature 来做,但效果在这个 model 上就会开始变差,或是要训练的更久才能一样好。总而言之,我们确实证明了声音的 feature 是可以让机器来区别音乐种类的。

参考资料

Kaggle GTZAN Dataset

/images/emoticon/emoticon09.gif/images/emoticon/emoticon13.gif/images/emoticon/emoticon14.gif/images/emoticon/emoticon22.gif/images/emoticon/emoticon28.gif


<<:  Day 02-购物车系统简介

>>:  [Day 4] 资料产品第二层 - 资料加工术 - 资料验证与清洗

Day.9 Add Two Numbers

Leetcode #2. Add Two Numbers 简单来说就是要做两个链结的加总 ex.1 ...

Day26. 星多天空亮,人多智慧广 - Plugins

来到了第 26 天,其实我们快把所有的模组都走过一遍了,今天是最後一天单独介绍某个特色的,接下来 3...

< 关於 React: 开始打地基| 如何创立一个新专案>

09-02-2021 如何开始使用React 本章内容 将React加到网页中 只需部分使用时 建立...

#12. Drawing App(原生JS版)

#12. Drawing App 这次要挑战的是比小画家还阳春的绘图app,会利用到canvas a...

[Day29] 立即函式 IIFE

立即函式简介 立即函式 IIFE (Immediately Invoked Function Exp...