Keras深度学习——使用神经网络进行音频分类

1,852 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

前言

在前面的部分中,我们已经了解了在结构化数据集以及非结构化文本数据上执行建模的策略。在本节中,我们将学习如何在输入为音频的情况下执行分类任务。

音频分类任务与神经网络模型分析

urbansound8k 数据集介绍

urbansound8k 数据集中包含 10 个类别的城市生活声音文件,包括孩子的嬉闹声、警报声、狗叫声等。共有 8732 个带有标签的声音,每个声音长度均在 4s 内。这些声音文件被预先分类存储在十个文件夹中(文件夹名为 fold1-fold10),除了声音文件之外,数据集中还提供了一个 CSV 文件,其中包含每个声音片段文件的相关元数据。可以在数据集网页链接中,了解此数据更详细信息。

神经网络模型

我们用于音频分类的神经网络模型策略如下:首先从输入音频中提取用于神经网络模型的特征,其中每个音频信号都表示为具有固定数量特征的向量,有多种可以从音频中提取特征的方法,在本节中,我们将提取与音频文件相对应的梅尔倒谱系数 (Mel Frequency Cepstral Coefficients, MFCC) 作为音频特征。 提取特征后,构建与 MNIST 数据集分类模型的相似的架构执行音频分类任务,在该模型中,在输入层与输出层间包含一个隐藏层。

2. 使用神经网络进行音频分类

根据我们在上节中定义的神经网络架构策略,将音频数据集进行分类,使用 Keras 实现如下。

  1. 首先,导入数据集:
import pandas as pd
data = pd.read_csv('/content/train.csv')
  1. 接下来,定义提取每个音频输入特征的函数:
# 读取每个音频文件的元数据
ids = data['ID'].values
def extract_features(file_name):
    X, sample_rate = librosa.load(file_name)
    stft = np.abs(librosa.stft(X))
    mfccs = np.mean(librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=40).T, axis=0)
    return mfccs

在前面的代码中,我们定义了函数 extract_features,该函数以 file_name 作为输入,提取与音频文件相对应的 MFCC,然后将其返回。

  1. 创建输入和输出数据集:
x = []
y = []
for i in range(len(ids)):
    try:
        filename = '/content/Train/'+str(ids[i]) + '.wav'
        y.append(data[data['ID']==ids[i]]['Class'].values)
        x.append(extract_features(filename))
    except:
        continue
x = np.array(x)

在以上的代码中,我们一次循环遍历一个音频文件,提取其特征并将其存储在输入列表中。同样,我们将把输出类存储在输出列表中,并将输出列表转换为独热编码形式:

y2 = []
for i in range(len(y)):
    y2.append(y[i][0])
y3 = np.array(pd.get_dummies(y2))

pd.get_dummies 方法的工作原理与 to_categorical 方法非常相似,都用于将输入参数转换为独热编码形式返回。不同的是,to_categorical 不适用于文本类(它仅适用将于数值转换为独热编码的情况)。

  1. 接下来,我们建立神经网络模型并进行编译:
model = Sequential()
model.add(Dense(1024, input_shape = (40,), activation = 'relu'))
#model.add(Dense(1000,activation='relu'))
model.add(Dense(10,activation='sigmoid'))
model.summary()

创建的模型简要概述信息输出如下,可以看到神将网络中仅包含一个含有 1024 个隐藏节点的隐藏层:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 1024)              41984     
_________________________________________________________________
dense_1 (Dense)              (None, 10)                10250     
=================================================================
Total params: 52,234
Trainable params: 52,234
Non-trainable params: 0
_________________________________________________________________
  1. 将数据集进行拆分,划分为训练和测试数据集,然后拟合模型:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(x, y3, test_size=0.30,random_state=10)
model.fit(X_train, y_train,
            epochs=100,
            batch_size=32,
            validation_data=(X_test, y_test),
            verbose = 1)

模型训练完成后,该模型在音频分类任务中可以达到 90% 以上的准确率。