零基础入门语音识别-食物声音识别 Task01『Baseline学习』


介绍

本篇文章主要是我在阿里云天池学习赛零基础入门语音识别-食物声音识别上的学习笔记。参加天池比赛是快速入门数据科学的一条必经之路,感兴趣的小伙伴也可以一起参加天池比赛噢(虽然我也还是小白,嘻嘻)~

一、下载数据集

首先通过shell对数据进行下载,也自己可以手动进行下载。

#训练集
wget http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531887/train_sample.zip
#测试集
wget http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531887/test_a.zip

分别对测试集和训练集解压

unzip -qq train_sample.zip
unzip -qq test_a.zip

二、导入数据

由于本次比赛是对音频数据进行分类,所以我们要对音频文件进行特征提取,提取为向量形式的特征。我们主要用到librosa库。
导入音频处理库

import os
import librosa
import librosa.display
import glob 

对特征进行提取

feature = []
label = []
# 建立类别标签,不同类别对应不同的数字。
label_dict = {'aloe': 0, 'burger': 1, 'cabbage': 2,'candied_fruits':3, 'carrots': 4, 'chips':5,
                  'chocolate': 6, 'drinks': 7, 'fries': 8, 'grapes': 9, 'gummies': 10, 'ice-cream':11,
                  'jelly': 12, 'noodles': 13, 'pickles': 14, 'pizza': 15, 'ribs': 16, 'salmon':17,
                  'soup': 18, 'wings': 19}
label_dict_inv = {v:k for k,v in label_dict.items()}

from tqdm import tqdm
def extract_features(parent_dir, sub_dirs, max_file=10, file_ext="*.wav"):
    c = 0
    label, feature = [], []
    for sub_dir in sub_dirs:
        for fn in tqdm(glob.glob(os.path.join(parent_dir, sub_dir, file_ext))[:max_file]): # 遍历数据集的所有文件
            
           # segment_log_specgrams, segment_labels = [], []
            #sound_clip,sr = librosa.load(fn)
            #print(fn)
            label_name = fn.split('/')[-2]
            label.extend([label_dict[label_name]])
            X, sample_rate = librosa.load(fn,res_type='kaiser_fast')
            mels = np.mean(librosa.feature.melspectrogram(y=X,sr=sample_rate).T,axis=0) # 计算梅尔频谱(mel spectrogram),并把它作为特征
            feature.extend([mels])
            
    return [feature, label]
    
# 自己更改目录
parent_dir = './train_sample/'
save_dir = "./"
folds = sub_dirs = np.array(['aloe','burger','cabbage','candied_fruits',
                             'carrots','chips','chocolate','drinks','fries',
                            'grapes','gummies','ice-cream','jelly','noodles','pickles',
                            'pizza','ribs','salmon','soup','wings'])

# 获取特征feature以及类别的label
temp = extract_features(parent_dir,sub_dirs,max_file=100)
temp = np.array(temp)
data = temp.transpose()
# 获取特征
X = np.vstack(data[:, 0])

# 获取标签
Y = np.array(data[:, 1])
print('X的特征尺寸是:',X.shape)
print('Y的特征尺寸是:',Y.shape)

# 在Keras库中:to_categorical就是将类别向量转换为二进制(只有0和1)的矩阵类型表示
Y = to_categorical(Y)
'''最终数据'''
print(X.shape)
print(Y.shape)

分割训练集和测试集

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state = 1, stratify=Y)
print('训练集的大小',len(X_train))
print('测试集的大小',len(X_test))

更改数据维度,便于后续进行训练

X_train = X_train.reshape(-1, 16, 8, 1)
X_test = X_test.reshape(-1, 16, 8, 1)

三、建立模型

CNN网络模型

model = Sequential()

# 输入的大小
input_dim = (16, 8, 1)

model.add(Conv2D(64, (3, 3), padding = "same", activation = "tanh", input_shape = input_dim))# 卷积层
model.add(MaxPool2D(pool_size=(2, 2)))# 最大池化
model.add(Conv2D(128, (3, 3), padding = "same", activation = "tanh")) #卷积层
model.add(MaxPool2D(pool_size=(2, 2))) # 最大池化层
model.add(Dropout(0.1))
model.add(Flatten()) # 展开
model.add(Dense(1024, activation = "tanh"))
model.add(Dense(20, activation = "softmax")) # 输出层:20个units输出20个类的概率

# 编译模型,设置损失函数,优化方法以及评价标准
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

在Task01的学习中,主要是采用了CNN对音频进行分类,看到这里很多小伙伴可能会有了疑问,CNN不是一般用于图像识别吗?怎么在语音识别上也会有应用呢?…
正因如此,CNN在图像识别领域的影响力是非常大的,通过这个逻辑,将声音转换为语谱图,再通过CNN进行分析。

四、卷积神经网络原理(CNN)

典型的 CNN 由3个部分构成:

  1. 卷积层
  2. 池化层
  3. 全连接层

简单来说:
卷积层负责提取图像中的局部特征;池化层主要是用来对数据进行降维,减少内存开销;全连接层类似传统神经网络的部分,用来输出想要的结果。

卷积——提取特征

在这里插入图片描述
这个过程我们可以理解为我们使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。

池化层(下采样)——数据降维,避免过拟合

池化层简单说就是下采样,他可以大大降低数据的维度。其过程如下:
在这里插入图片描述
上图中,我们可以看到,原始图片是20×20的,我们对其进行下采样,采样窗口为10×10,最终将其下采样成为一个2×2大小的特征图。

之所以这么做的原因,是因为即使做完了卷积,图像仍然很大(因为卷积核比较小),所以为了降低数据维度,就进行下采样。

总结:池化层相比卷积层可以更有效的降低数据维度,这么做不但可以大大减少运算量,还可以有效的避免过拟合。

全连接层——输出结果

这个部分就是最后一步了,经过卷积层和池化层处理过的数据输入到全连接层,得到最终想要的结果。

经过卷积层和池化层降维过的数据,全连接层才能”跑得动”,不然数据量太大,计算成本高,效率低下。

在这里插入图片描述

总结

通过Task01的学习,拓宽了我的认知,原来CNN算法并不只局限于图像数据,在语音数据中也会用到。

参考资料


一文看懂卷积神经网络-CNN
Datawhale Github官方代码

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值