Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用PyTorch对音频进行分类

使用PyTorch对音频进行分类

作者头像
代码医生工作室
发布于 2020-07-03 02:52:57
发布于 2020-07-03 02:52:57
5.9K00
代码可运行
举报
文章被收录于专栏:相约机器人相约机器人
运行总次数:0
代码可运行

作者 | Aakash

来源 | Medium

编辑 | 代码医生团队

什么是分类问题?

对对象进行分类就是将其分配给特定的类别。这本质上是一个分类问题是什么,即将输入数据从一组这样的类别,也称为类分配到预定义的类别。

机器学习中的分类问题示例包括:识别手写数字,区分垃圾邮件和非垃圾邮件或识别核中的不同蛋白质。

https://www.kaggle.com/c/jovian-pytorch-z2g

使用的数据集

为了演示分类问题的工作原理,将使用UrbanSound8K数据集。该数据集包括10种类别的城市声音:空调,汽车喇叭,儿童游戏,狗吠,钻探,enginge_idling,gun_shot,手提钻,警笛和street_music。

https://urbansounddataset.weebly.com/urbansound8k.html

目的是将数据提供给模型(目前可以将其视为黑匣子),并确定模型预测的准确性。

数据集的结构

该数据集可以作为压缩包使用,大小约为5.6GB。与某些机器学习数据集不同,此特定数据集中的音频数据与元数据文件夹一起存在于10个不同的文件夹中,元数据文件夹包含名为“ UrbanSound8K.csv”的文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
D:\DL\ZEROTOGANS\06-URBAN8K-CLASSIFICATION\DATA\URBANSOUND8K
├───audio
│   ├───fold1
│   ├───fold10
│   ├───fold2
│   ├───fold3
│   ├───fold4
│   ├───fold5
│   ├───fold6
│   ├───fold7
│   ├───fold8
│   └───fold9
└───metadata

大多数ML数据集都有训练/测试文件夹,每个文件夹分别包含用于训练和测试的数据。但是在此数据集中,所有文件夹中都可以使用所有(10)类数据。建议使用10折中的9折作为训练数据,其余的折作为测试数据。

依赖关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import pandas as pd
import librosa
import numpy as np
from torch.utils.data import TensorDataset, DataLoader, random_split
import librosa.display
import matplotlib.pyplot as plt
import tarfile
import torch.nn as nn
import torch.nn.functional as F

上面的库以python编程语言提供。专门使用它们来创建两个具有不同架构的模型。用来进行此项目的环境在anaconda云上可用。

https://anaconda.org/aakash_/pytorch-cuda

可视化数据

音频数据通常以波状图的形式可视化。波形图是由两个轴组成的图形。X轴表示时间,Y轴表示距平均位置(即振幅)的位移。以下代码行使用python中的librosa包为每个类显示一个波形图。最初提取每个音频文件的路径并将其存储在字典中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
classes=list(df["class"].unique())
df=pd.read_csv("data/UrbanSound8K/metadata/UrbanSound8K.csv")
paths=dict()
for i in range(len(classes)):
    temp_df=df[df["class"]==classes[i]].reset_index()
    fold=temp_df["fold"].iloc[0]    # The fold of the first audio sample for the specific class
    sample_name=temp_df["slice_file_name"].iloc[0]
    path="data/UrbanSound8K/audio/fold{0}/{1}".format(fold, sample_name)
paths[classes[i]]=path

提取路径后,可以使用此词典显示波图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for i, label in enumerate(classes):
    sample=paths[label]
    plt.clf()
    plt.title(label)
    data, sample_rate=librosa.load(sample)
    librosa.display.waveplot(data, sr=sample_rate)
plt.show()

产生以下输出

每个班级的Waveplots。

产生特征

要将音频数据输入模型,必须将其转换为某种数字形式。在ML中音频数据通常会转换为梅尔频率倒谱系数(MFCC)特征向量。librosa软件包用于生成这些系数。此外该视频还提供了对MFCC的深入了解。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Helper function to generate mfccs
def extract_mfcc(path):
    audio, sr=librosa.load(path)
    mfccs=librosa.feature.mfcc(audio, sr, n_mfcc=40)
    return np.mean(mfccs.T, axis=0)
features=[]
labels=[]
folds=[]
for i in range(len(df)):
    fold=df["fold"].iloc[i]
    filename=df["slice_file_name"].iloc[i]
    path="data/UrbanSound8K/audio/fold{0}/{1}".format(fold, filename)
    mfccs=extract_mfcc(path)
    features.append(mfccs)
    folds.append(fold)
    labels.append(df["classID"].iloc[i])
features=torch.tensor(features)
labels=torch.tensor(labels)
folds=torch.tensor(folds)
# Saving the dataset to disk to prevent re-Loading
torch.save(features, "data/features_mfccs.pt")
torch.save(labels, "data/labels.pt")
torch.save(folds, "data/folds.pt")

定义模型

最初定义了两种模型都通用的基类。它主要包括用于为训练数据集和验证数据集计算损失(即模型的预测与实际类别的距离)的函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class AudioClassificationBase(nn.Module):
    def training_step(self, batch):
        images, labels = batch
        out = self(images)               
        loss = F.cross_entropy(out, labels)
        return loss
def validation_step(self, batch):
        images, labels = batch
        out = self(images)                    
        loss = F.cross_entropy(out, labels)   
        acc = accuracy(out, labels)           
        return {'val_loss': loss.detach(), 'val_acc': acc}
def validation_epoch_end(self, outputs):
        batch_losses = [x['val_loss'] for x in outputs]
        epoch_loss = torch.stack(batch_losses).mean()   
        batch_accs = [x['val_acc'] for x in outputs]
        epoch_acc = torch.stack(batch_accs).mean()     
        return {'val_loss': epoch_loss.item(), 'val_acc': epoch_acc.item()}

模型架构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Model 1
class UrbanSound8KModel(AudioClassificationBase):
    def __init__(self):
        super().__init__()
        self.network=nn.Sequential(
            nn.Linear(input_size,128),
            nn.ReLU(),
            nn.Linear(128, 64),
            nn.ReLU(),
            nn.Linear(64,output_size),
            nn.Sigmoid()
        )
def forward(self, x_batch):
        return self.network(x_batch)
# Model 2
class UrbanSound8KModel2(AudioClassificationBase):
    def __init__(self):
        super().__init__()
        self.network=nn.Sequential(
            nn.Linear(input_size,128),
            nn.ReLU(),
            nn.Linear(128, 256),
            nn.ReLU(),
            nn.Linear(256, 512),
            nn.ReLU(),
            nn.Linear(512,64),
            nn.ReLU(),
            nn.Linear(64,output_size),
            nn.Tanh()
        )
def forward(self, xb):
        return self.network(xb)
model=UrbanSound8KModel()
model2=UrbanSound8KModel2()

为了更快地进行训练,将模型与数据集一起移至GPU(图形处理单元)。请注意这仅在安装了cuda工具包的Nvidia GPU上有效。或者可以使用Kaggle部署其ML模型。Kaggle提供了基于云的GPU,每周可使用30个小时。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_default_device():
    if torch.cuda.is_available():
        return torch.device("cuda")
    return torch.device("cpu")
device=get_default_device()
device
# Function to move data to the chosen default device
def to_device(data, device):
    if isinstance(data, (list,tuple)):
        return [to_device(x, device) for x in data]
    return data.to(device, non_blocking=True)
# Defining an instance that moves all the tensors (DataLoaders) into the default device
class DeviceDataLoader():
    def __init__(self, dl, device):
        self.dl = dl
        self.device = device
def __iter__(self):
        for b in self.dl:
            yield to_device(b, self.device)
def __len__(self):
        return len(self.dl)

所以现在模型看起来像这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UrbanSound8KModel(
  (network): Sequential(
    (0): Linear(in_features=40, out_features=128, bias=True)
    (1): ReLU()
    (2): Linear(in_features=128, out_features=64, bias=True)
    (3): ReLU()
    (4): Linear(in_features=64, out_features=10, bias=True)
    (5): Sigmoid()
  )
)
UrbanSound8KModel2(
  (network): Sequential(
    (0): Linear(in_features=40, out_features=128, bias=True)
    (1): ReLU()
    (2): Linear(in_features=128, out_features=256, bias=True)
    (3): ReLU()
    (4): Linear(in_features=256, out_features=512, bias=True)
    (5): ReLU()
    (6): Linear(in_features=512, out_features=64, bias=True)
    (7): ReLU()
    (8): Linear(in_features=64, out_features=10, bias=True)
    (9): Tanh()
  )
)

在每个模型训练了约50个时期后,第一个模型获得了1.769的验证损失和58%的验证精度。第二个模型产生约1.42的验证损失和约65%的验证精度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Model 1
Validation loss -> 1.7691158056259155, Validation accuracy -> 0.5827487111091614
Model 2
Validation loss -> 1.4253952503204346, Validation accuracy -> 0.6507228016853333

最后可以将模型保存到磁盘以防止重新训练。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
torch.save(model.state_dict(), "outputs/model1.pth")
torch.save(model2.state_dict(), "outputs/model2.pth")

为了重新加载模型,初始化模型的方式类似于初始化新模型,然后运行以下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.load_state_dict(torch.load("outputs/model.pth"))
model2.load_state_dict(torch.load("outputs/model2.pth"))

现在所有指标和超参数均已记录并成功加载回GPU。

结论

虽然这些模型可能不是最先进的架构,但它们可以作为一个人进入机器学习之旅的良好起点。通过实施诸如Dropout和Normalization等正则化技术,可以在更大程度上改善模型。学习率还可以根据“单周期策略”而变化。

代码可以在这里,在jovian.ml这是一个伟大的网站主机和运行jupyter笔记本电脑,登录ML指标等等。

https://jovian.ml/aakashshankar/urbansound8kclassification

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用深度学习进行疟疾检测 | PyTorch版
蚊子看起来很小,很脆弱,但是是非常危险的。众所周知,疟疾对所有年龄段的人来说都是一种威胁生命的疾病,它通过蚊子传播。更重要的是,在最初的阶段,这些症状很容易被误认为是发烧、流感或普通感冒。但是,在晚期,它可以通过感染和破坏细胞结构造成严重破坏,这可能危及生命。如果不及时治疗,甚至可能导致死亡。
小白学视觉
2020/11/13
8350
使用深度学习进行疟疾检测 | PyTorch版
使用深度学习进行音频分类的端到端示例和解释
声音分类是音频深度学习中应用最广泛的方法之一。它包括学习对声音进行分类并预测声音的类别。这类问题可以应用到许多实际场景中,例如,对音乐片段进行分类以识别音乐类型,或通过一组扬声器对短话语进行分类以根据声音识别说话人。
deephub
2021/03/25
1.3K0
使用深度学习进行音频分类的端到端示例和解释
VGG卷积神经网络实现Cifar10图片分类-Pytorch实战
当涉足深度学习,选择合适的框架是至关重要的一步。PyTorch作为三大主流框架之一,以其简单易用的特点,成为初学者们的首选。相比其他框架,PyTorch更像是一门易学的编程语言,让我们专注于实现项目的功能,而无需深陷于底层原理的细节。
fanstuck
2025/01/16
2911
VGG卷积神经网络实现Cifar10图片分类-Pytorch实战
PyTorch-24h 02_分类问题
loss:loss函数用于衡量模型预测和实际值的差距。不同的问题需要不同的loss函数。例如,回归问题可能用MAE,二分类问题可能用binary cross entropy。 优化器:优化器用来更新模型参数,一般使用SGD(torch.optim.SGD())或Adam(torch.optim.Adam())。
一只大鸽子
2023/02/24
3560
PyTorch-24h  02_分类问题
基于Pytorch构建AlexNet网络对cifar-10进行分类
AlexNet网络是CV领域最经典的网络结构之一了,在2012年横空出世,并在当年夺下了不少比赛的冠军。也是在那年之后,更多的更深的神经网络被提出,比如优秀的vgg,GoogLeNet。AlexNet和LeNet的设计非常类似,但AlexNet的结构比LeNet规模更大。
python与大数据分析
2023/09/03
7540
基于Pytorch构建AlexNet网络对cifar-10进行分类
CNN实战(二):pytorch搭建CNN对猫狗图片进行分类
在上一篇文章:CNN实战(一):pytorch处理图像数据(Dataset和Dataloader)里,大致介绍了怎么利用pytorch把猫狗图片处理成CNN需要的数据,本篇文章主要用该数据对自己定义的CNN模型进行训练及测试。
Cyril-KI
2022/09/16
2.7K0
CNN实战(二):pytorch搭建CNN对猫狗图片进行分类
我用 PyTorch 复现了 LeNet-5 神经网络(MNIST 手写数据集篇)!
详细介绍了卷积神经网络 LeNet-5 的理论部分。今天我们将使用 Pytorch 来实现 LeNet-5 模型,并用它来解决 MNIST数据集的识别。
红色石头
2022/01/10
2.3K0
我用 PyTorch 复现了 LeNet-5 神经网络(MNIST 手写数据集篇)!
基于卷积神经网络的垃圾分类
自今年7月1日起,上海市将正式实施 《上海市生活垃圾管理条例》。垃圾分类,看似是微不足道的“小事”,实则关系到13亿多人生活环境的改善,理应大力提倡。
云微
2023/02/11
9210
基于卷积神经网络的垃圾分类
我用 PyTorch 复现了 LeNet-5 神经网络(CIFAR10 数据集篇)!
我用 PyTorch 复现了 LeNet-5 神经网络(MNIST 手写数据集篇)!
红色石头
2022/01/10
1.3K0
我用 PyTorch 复现了 LeNet-5 神经网络(CIFAR10 数据集篇)!
基于Pytorch构建LeNet网络对cifar-10进行分类
LeNet5诞生于1994年,是最早的卷积神经网络之一,是Yann LeCun等人在多次研究后提出的最终卷积神经网络结构,是一种用于手写体字符识别非常高效的网络。一般LeNet即指代LeNet5。LeNet5 这个网络虽然很小,但是它包含了深度学习的基本模块:卷积层,池化层,全连接层,是其他深度学习模型的基础。
python与大数据分析
2023/09/03
4880
基于Pytorch构建LeNet网络对cifar-10进行分类
PyTorch-24h 03_图像分类
torchvision.datasets 包含许多示例数据集,可用于练习编写计算机视觉代码。FashionMNIST 就是其中之一。它有 10 个不同的图像类别(不同类型的服装),用于多分类问题。torchvision已经内置了该数据集,可以通过torchvision.datasets加载。
一只大鸽子
2023/02/24
7840
PyTorch-24h  03_图像分类
Fashion_minst 图像识别 by PyTorch CNN
Fashion_minst 是之前介绍 Tensorflow 时用过的数据集。下面用 PyTorch 再跑它一遍 ,用作 PyTorch 的入门示例。
用户6021899
2022/03/04
4670
Fashion_minst 图像识别 by PyTorch CNN
PyTorch与深度学习
PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用。
正在走向自律
2024/12/18
1040
PyTorch与深度学习
手撕 CNN 之 AlexNet(PyTorch 实战篇)
详细介绍了 AlexNet 的网络结构,今天我们将使用 PyTorch 来复现AlexNet网络,并用AlexNet模型来解决一个经典的Kaggle图像识别比赛问题。
红色石头
2022/04/14
1.9K0
手撕 CNN 之 AlexNet(PyTorch 实战篇)
PyTorch入门,快速上手案例
PyTorch是一种开源的深度学习框架,主要用于自然语言处理和图像识别等机器学习任务,由Facebook(Meta)人工智能研究院(FAIR)开发。它提供了强大的GPU加速张量计算能力,并内置了自动微分系统。
皮大大
2024/12/06
2140
最新翻译的官方 PyTorch 简易入门教程
https://github.com/fengdu78/machine_learning_beginner/tree/master/PyTorch_beginner
用户1737318
2019/11/19
1.5K0
最新翻译的官方 PyTorch 简易入门教程
小白学PyTorch | 8 实战之MNIST小试牛刀
在这个文章中,主要是来做一下MNIST手写数字集的分类任务。这是一个基础的、经典的分类任务。建议大家一定要跟着代码做一做,源码和数据已经上传到公众号。回复【pytorch】获取数据和源码哦~
机器学习炼丹术
2020/09/14
7960
小白学PyTorch | 8 实战之MNIST小试牛刀
PyTorch ImageNet 基于预训练六大常用图片分类模型的实战
在本教程中,我们将深入探讨如何对 torchvision 模型进行微调和特征提取,所有这些模型都已经预先在1000类的Imagenet数据集上训练完成。 本教程将深入介绍如何使用几个现代的CNN架构,并将直观展示如何微调任意的PyTorch模型。由于每个模型架构是有差异的,因此没有 可以在所有场景中使用的微调代码样板。然而,研究人员必须查看现有架构并对每个模型进行自定义调整。
磐创AI
2019/09/19
5.1K0
PyTorch ImageNet 基于预训练六大常用图片分类模型的实战
PyTorch nn.Module
本节将介绍在pytorch中非常重要的类:nn.Module。在实现自己设计的网络时,必须要继承这个类,示例写法如下
mathor
2020/02/14
1.1K0
03-使用PyTorch处理最简单的神经网络分类任务(笔记+代码)
分类和回归是最常见的机器学习问题类型之一。在本笔记中,我们将使用 PyTorch 解决几个不同的分类问题(二元分类,多类分类,多标签分类)。换句话说,我们通过获取一组输入并预测这些输入集属于哪个类别。
renhai
2023/11/24
4.9K0
03-使用PyTorch处理最简单的神经网络分类任务(笔记+代码)
相关推荐
使用深度学习进行疟疾检测 | PyTorch版
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验