卓尔高考网

Keras深度学习实战(10)——音频分类

篇首语:本文由小编为大家整理,主要介绍了Keras深度学习实战(10)——音频分类相关的知识,希望对你有一定的参考价值。

NS。jszhuoEr.CoM

Keras深度学习实战(10)——音频分类

    • 0. 前言
    • 1. 音频分类任务与神经网络模型分析
      • 1.1 urbansound8k 数据集介绍
      • 1.2 神经网络模型
    • 2. 使用神经网络进行音频分类
    • 小结
    • 系列链接

0. 前言

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

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

1.1 urbansound8k 数据集介绍

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

1.2 神经网络模型

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

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

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

  1. 首先,导入数据集:
import pandas as pddata = pd.read_csv("UrbanSound8K/metadata/UrbanSound8K.csv")
  1. 接下来,定义提取每个音频输入特征的函数:
# 读取每个音频文件的元数据file_list = data["slice_file_name"].valuesfold_list = data["fold"].valuesclass_list = data["class"].valuesdef 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 = "UrbanSound8K/audio/fold"+str(fold_list[i]) + "/" + file_list[i]        y.append(class_list[i])        x.append(extract_features(filename))    except:        continuex = np.array(x)
NS。jszhuoEr.CoM

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

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,234Trainable params: 52,234Non-trainable params: 0_________________________________________________________________
  1. 将数据集进行拆分,划分为训练和测试数据集,然后拟合模型:
from sklearn.model_selection import train_test_splitX_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% 以上的准确率。

小结

本节,我们继续学习了使用神经网络训练另一种常见的非结构化数据——音频,通过对音频进行分类,我们可以总结出训练非结构化数据的一般步骤,即首先通过非结构化数据构建网络输入、输出,然后剩余的步骤和训练结构化数据就完全一样了。

系列链接

NS。jszhuoEr.CoM

Keras深度学习实战(1)——神经网络基础与模型训练过程详解
Keras深度学习实战(2)——使用Keras构建神经网络
Keras深度学习实战(3)——神经网络性能优化技术
Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解
Keras深度学习实战(5)——批归一化详解
Keras深度学习实战(6)——深度学习过拟合问题及解决方法
Keras深度学习实战(7)——信用预测
Keras深度学习实战(8)——房价预测
Keras深度学习实战(9)——新闻文本分类

NS。jszhuoEr.CoM

以上是关于Keras深度学习实战(10)——音频分类的主要内容,如果未能解决你的问题,请参考以下文章

您可能还会对下面的文章感兴趣: