Press "Enter" to skip to content

【DCASE音频分类大赛】从参赛到优秀,也许只差这些!

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

近日对DCASE2020大赛的声学场景分类任务各个优秀参赛方案做了个汇总,具体可参见我的上一篇文章:

Curry:DCASE2020之声学场景分类优秀方案总结 ​ zhuanlan.zhihu.com

为方便阅读,将汇总表在下面再次展示下。

Task1a优秀方案:top1-top15

Task1a优秀方案:top16-top29

Task1b优秀方案:top1-top15

Task1b优秀方案:top16-top31

从统计结果来看,不难发现集成方法(Ensemble以及Snapshot)和数据增强(Data Augmentation)仍然是在近年分类比赛中的涨分利器。除此此外,针对此场景音频分类任务,在上面方案汇总结果中还有三点情况值得注意:

第一、各个参赛方案仍是以人工设计的特征如MEL等进行特征提取为主,直接利用raw waveform端到端的方案相对较少;
第二、相比循环网络RNN、GRU、LSTM等,CNN卷积网络仍在解决此类问题占据主导;
第三、数据增强方案中的mixup方法出现在了大多数的优秀参赛方案中;

这三点情况给我带来了些疑问:为什幺不通过神经网络来直接对raw waveform进行特征提取?音频是带有时序信息的,为什幺不采用循环网络进行搭建模型?mixup是如何进行数据增强的,作用在特征图上还是作用在raw waveform本身上?

 

针对上述疑问,笔者阅读了相关的论文和一些源码,同时做些简易实验对上述疑问有了初步的想法和理解,在交流向大家交流分享下,同时也欢迎相关方向的研究者讨补充。

 

问题一:为什幺众多优秀方案中,端到端的方案少有,而仍是以利用人工设计的特征为主?

 

1、首先来说一下端到端方案的优势:通常音频分类任务会从raw waveform中提取出人工设计的特征,比如:时频图、梅尔特征、CQT或者MFCC等做为卷积网络的输入进行分类,这也是面对语音任务等常见的处理方式,但实际上场景下的音频不同于语音和音乐信号等,其录制条件更复杂,周围噪声不可控,单一特征无法对场景音频进行很好的表征,因此需要可调节的自适应特征来应对复杂多变的场景音频。端到端的方案可以利用神经网络强大的特征提取能力,从raw waveform中提取出自适应数据本身情况的特征可以解决上面提到的问题,同时也省去了复杂的人工设计特征过程。

 

2、由于端到端方案有其特有优势,相关的研究也有不少学者围绕展开,比如:《 End-to-End Environmental Sound Classification using a 1D Convolutional Neural Network 》等。由于音频信号是一维的序列,网络主要采取一维卷积或者二维卷积搭配1xN的kernal_size形式进行搭建。在此篇论文中《 Learning from Between-class Examples for Deep Sound Recognition 》提出了一个EvnNetv2正是采后第二种方式搭建的。由于源码是利用Chainer这个深度学习框架写的,为了方便大家使用,笔者转成了Pytorch框架下的供大家查看,代码如下:

 

import torch
import torch.nn as nn
class EnvNetv2(nn.Module):
    # initialW = nn.init.kaiming_uniform()
    def __init__(self, n_classes):
        super(EnvNetv2, self).__init__()
        self.convstage1 = nn.Sequential(
            nn.Conv2d(1, 32, (1, 64), stride=(1, 2)),
            nn.BatchNorm2d(),
            nn.Conv2d(32, 64, (1, 16), stride=(1, 2)),
            nn.BatchNorm2d(),
            nn.MaxPool2d(1, 64),
        )
        self.convstage2 = nn.Sequential(
            nn.Conv2d(1, 32, (8, 8)),
            nn.BatchNorm2d(),
            nn.Conv2d(32, 32, (8, 8)),
            nn.BatchNorm2d(),
            nn.MaxPool2d(5, 3),
            nn.Conv2d(32, 64, (1, 4)),
            nn.BatchNorm2d(),
            nn.Conv2d(64, 64, (1, 4)),
            nn.BatchNorm2d(),
            nn.MaxPool2d(1, 2),
            nn.Conv2d(64, 128, (1, 2)),
            nn.BatchNorm2d(),
            nn.Conv2d(128, 128, (1, 2)),
            nn.BatchNorm2d(),
            nn.MaxPool2d(1, 2),
            nn.Conv2d(128, 256, (1, 2)),
            nn.BatchNorm2d(),
            nn.Conv2d(256, 256, (1, 2)),
            nn.BatchNorm2d(),
            nn.MaxPool2d(1, 2),
        )
        self.liner1 = nn.Sequential(
            nn.Linear(256 * 10 * 8, 4096),
            nn.ReLU(),
            nn.Dropout(),
        )
        self.liner2 = nn.Sequential(
            nn.Linear(4096, 4096),
            nn.ReLU(),
            nn.Dropout(),
        )
        self.liner3 = nn.Sequential(
            nn.Linear(4096, n_classes),
        )
    def __call__(self, x):
        h = self.convstage1(x)
        h = self.convstage2(h)
        h = h.permute(1,0,2)
        h = self.convstage2(h)
        h = self.liner1(h)
        h = self.liner2(h)
        h = self.liner3(h)
        return h

 

3、端到端方案看起来没有问题,但实施效果往往不如人意,究其原因:首先,一维的音频信号比提取出来的二维特征往往要Noisier;其次,神经网络通过对网络加深固然具有在raw waveform上提取特征的强大能力,但同时需要大量的音频数据来支持网络的训练,由于音频数据获取的难度要远高于图像以及文本数据,因此在此类任务上往往面临着样本有限的问题,所以在此任务上,为了取得较高的排名,大家还是不得不放弃端到端的方案,更选择效果更好的二阶方案。

 

问题二:相比在语音识别领域广泛应用的GRU、LSTM等循环网络,为何CNN卷积网络在此任务的优秀方案中仍占据主导?

 

这个问题还要从语音识别等任务说起,近些年来,循环网络在语音识别领域被广泛运用且取得了显着的成绩,但是针对同样具有时域信息的场景音频,为何循环网络在此次大赛上纷纷被大家抛弃呢?翻看DCASE2018及以前任务一的众多方案,在分类器一列还能见到比如CRNN、LSTM等内容的出现,但在2019年及今年的比赛,参赛队伍仿佛有共同的默契一般,纷纷抛弃了循环网络。

 

首先要说下语音信号和场景音频的区别,毫无疑问场景音频更为复杂,嘈杂,虽说是具有时域维度信息,但是时序上信息关联度太弱,而语音信号是具有语义特征的,时序上的信息是强关联的。为了验证上述猜测,笔者基于城市音频数据集urbansound8k的子集进行了验证,分别尝试了端到端的方案A:LSTM;方案B:CNN+RNN;方案C:CNN+FC。实验结果如下:方案A:端到端的LSTM网络无法收敛,训练损失始终维持在一个较高的水平;方案B和方案C的训练过程收敛,测试结果基本一致。从上述结果中可以看出,对此类场景音频分类任务,端到端的方案(LSTM)确实存在训练过程困难,不容易收敛的问题;RNN和FC的作用几乎相同,循环层也几乎没有学到时序上有用的内容,作用退化为全连接层,这也间接说明了前面提到的场景音频时序上信息关联度太弱这一观点。(此处实验不够充分,感兴趣的可以自行补做,交流讨论)。

 

问题三:mixup是如何进行数据增强的,为何会被广泛使用在此类场景音频分类任务上?增强角度是针对音频本身,还是提取出来的特征图?

 

对mixup增强方法的原文进行了仔细阅读,并且在github上分别找到了其针对音频以及针对图像进行增强的代码,在下文进行展示。mixup方法有两篇在18年的论文分别对其进行了阐述,《 Mixup : Beyond Empirical Risk Minimization 》和《 Between-class Learning for Image Classification 》,两篇文章讲述的方法大致相同,可以认为mixup即bc learning。为了理解mixup,先来看一下原文给出的公式:

其中, 是我们训练中随机的样本, 是在[0,1]之间随机数,并服从beta分布,论文中也是直接给出了实现的源码,如下图所示。

同时,在《 Between-class Learning for Image Classification 》这篇文章里还重点强调了其中 需属于不同的类别,即不同类别间的样本进行融合。总结下什幺是mixup增强方法: 用随机比率混合两个属于不同类别的图像来生成类间图像,然后将混合图像输入到模型中,训练模型输出混合比 。同时文章中还强调并论证了mixup方法更适用于声音信号这一观点,因为声音是一种波形,并且多个声音数据的混合仍然算作一个声音。然而,图像不是一种波形,混合多个图像数据在视觉上没有意义。又论证了图像之所以work,是因为某种角度上CNN将输入数据作为波形进行处理。在这种情况下,两个图像的混合就是两个波形的混合,合成的波形对网络来说是仍然是有意义的,具体图像融合过程如下图所示。

mixup:图像融合过程

此外文章也通过实验验证了,mixup(BC-learning)方法在包括GAN等多个任务上的结果都取得了明显的提高。Mixup GAN的实验结果如下图所示:

mixup GAN

通过上面的介绍也大致解释了第三个问题,为什幺mixup在此场景音频分类任务上被广泛应用。首先:mixup的确无论在面对图像和音频都很好得提高了结果;其次:mixup方法实现简单,几行代码即很大程度上增强数据信息;最后:mixup这种通过波形混合的方式来进行数据增强更适用于音频信号。关于mixup方法对于音频增强得源码参见: bc_learning_sound ;对于图像数据增强得源码可以参见: bc_learning_imagemixup-cifar10

 

其中重点部分代码如下:

 

def mixup_data(x, y, alpha=1.0, use_cuda=True):
    '''Returns mixed inputs, pairs of targets, and lambda'''
    if alpha > 0:
        lam = np.random.beta(alpha, alpha)
    else:
        lam = 1
    batch_size = x.size()[0]
    if use_cuda:
        index = torch.randperm(batch_size).cuda()
    else:
        index = torch.randperm(batch_size)
    mixed_x = lam * x + (1 - lam) * x[index, :]
    y_a, y_b = y, y[index]
    return mixed_x, y_a, y_b, lam

def mixup_criterion(criterion, pred, y_a, y_b, lam):
    return lam * criterion(pred, y_a) + (1 - lam) * criterion(pred, y_b)

 

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注