Urban Sound Classifier using CNN v2
更好的格式化阅读请参考我的jupyter lab 输出→https://jinnsjj.github.io/projects/src/USC_CNN_v2.html
第一个CNN的分类器效果惨烈,有许多细节都没有注意到,感觉修改也令人心烦,从头开始。老实说我也不知道这次能不能成功,边做边看吧。
上次踩过的坑和经验
- 之前把频谱当作训练数据输入,但频谱里的数值都是负数,后来换为了绝对值。但这样其实也不行,应该要进行normalization。把是把值的范围限制在[-1,1]还是[0,1]还不清楚。我的想法是根据relu的性质,应当是[0,1]。(结果:应当时-1到1,值是*w+b再激活,所以负数不影响)
- 计算mfcc时的维度一般是40,有用的一般是2到13维。
构想
首先明确一下这次要做的事情:
- 训练集:UrbanSound8K dataset,训练用fold 1-3,validation用从整个数据集里面随意找一些样本,test用fold 10。
- 输入:MFCC,normalization为mean=0, var=1。
- 网络:一个非常简单的CNN,两层conv2D层,进入一个全连接层。
- 输出:10个class
动手,去做
# draw
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('ggplot')
# basic handling
import os
import glob
import pickle
import numpy as np
# audio
import librosa
import librosa.display
import IPython.display
# normalization
import sklearn
# nn
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import to_categorical
from keras.callbacks import LearningRateScheduler
keras.__version__
Using TensorFlow backend.
'2.2.0'
指定dataset的位置
parent_dir = '../data/UrbanSound8K/audio/'
train_dir = 'train/'
val_dir = 'val/'
test_dir = 'fold10/'
file_name = '*.wav'
train_files = glob.glob(os.path.join(parent_dir, train_dir, file_name))
val_files = glob.glob(os.path.join(parent_dir, val_dir, file_name))
test_files = glob.glob(os.path.join(parent_dir, test_dir, file_name))
定义一个函数用于读取音频片段,库里的片段几乎都是4s,但有一部分小于4秒,将它们补零。采样率22050,4秒一共88200个采样点。
def load_clip(filename):
x, sr = librosa.load(filename)
x = np.pad(x,(0,88200-x.shape[0]),'constant')
return x, sr
再定义一个函数,用于提取片段的mfcc并进行normalization。
def extract_feature(filename):
x, sr = load_clip(filename)
mfccs = librosa.feature.mfcc(y=x, sr=sr,