为您推荐:
精华内容
最热下载
问答
  • 5星
    708.46MB gelunbu321 2021-02-24 14:04:47
  • 5星
    27.92MB ECHOSON 2021-06-16 19:47:43
  • 5星
    9.13MB weixin_44510615 2021-06-27 16:54:33
  • 5星
    12.18MB qq_44872173 2021-03-04 10:29:40
  • 5星
    20.89MB herosunly 2020-12-03 15:01:19
  • 5星
    38.01MB weixin_44510615 2021-07-08 11:02:17
  • 5星
    570.7MB ECHOSON 2021-05-24 10:21:12
  • 5星
    17.02MB zdxxinlang 2021-01-13 10:24:46
  • 5星
    923.93MB weixin_37932346 2021-04-23 20:19:48
  • 5星
    203.91MB weixin_37932346 2021-04-24 01:17:07
  • 1.50.机器学习训练中常见的问题和挑战 ...Datawhale干货 作者:奥雷利安·杰龙 由于我们的主要任务是选择一种学习算法,并对某些数据进行训练,...训练数据的数量不足 要教一个牙牙学语的小朋友什么是苹果,你只需要指着苹

    1.50.机器学习训练中常见的问题和挑战

    转载博文:https://blog.csdn.net/Datawhale/article/details/109006583
    Datawhale干货
    作者:奥雷利安·杰龙

    由于我们的主要任务是选择一种学习算法,并对某些数据进行训练,所以最可能出现的两个问题不外乎是“坏算法”和“坏数据”,本文主要从坏数据出发,带大家了解目前机器学习面临的常见问题和挑战,从而更好地学习机器学习理论。
    在这里插入图片描述

    1.50.1.训练数据的数量不足

    要教一个牙牙学语的小朋友什么是苹果,你只需要指着苹果说“苹果”(可能需要重复这个过程几次)就行了,然后孩子就能够识别各种颜色和形状的苹果了,简直是天才!

    机器学习还没达到这一步,大部分机器学习算法需要大量的数据才能正常工作。即使是最简单的问题,很可能也需要成千上万个示例,而对于诸如图像或语音识别等复杂问题,则可能需要数百万个示例(除非你可以重用现有模型的某些部分)。

    1.50.1.1.数据的不合理有效性

    在2001年发表的一篇著名论文中,微软研究员Michele Banko和Eric Brill表明,给定足够的数据,截然不同的机器学习算法(包括相当简单的算法)在自然语言歧义消除这个复杂问题上注8,表现几乎完全一致(如下图所示)。

    数据与算法的重要性注
    正如作者所说:“这些结果表明,我们可能会重新思考如何在二者之间做权衡—将钱和时间花在算法的开发上,还是花在语料库的建设上。”

    对复杂问题而言,数据比算法更重要,这一想法被Peter Norvig等人进一步推广,于2009年发表论文“The Unreasonable Effectiveness of Data”注10。不过需要指出的是,中小型数据集依然非常普遍,获得额外的训练数据并不总是一件轻而易举或物美价廉的事情,所以暂时先不要抛弃算法。

    1.50.2.训练数据不具代表性

    为了很好地实现泛化,至关重要的一点是对于将要泛化的新示例来说,训练数据一定要非常有代表性。无论你使用的是基于实例的学习还是基于模型的学习,都是如此。

    例如,前面用来训练线性模型的国家数据集并不具备完全的代表性,有部分国家的数据缺失。下图显示了补充缺失国家信息之后的数据表现。
    在这里插入图片描述更具代表性的训练样本

    如果你用这个数据集训练线性模型,将会得到图中的实线,而虚线表示旧模型。正如你所见,添加部分缺失的国家信息不仅显著地改变了模型,也更清楚地说明这种简单的线性模型可能永远不会那么准确。看起来,某些非常富裕的国家并不比中等富裕的国家更幸福(事实上,看起来甚至是不幸福),反之,一些贫穷的国家也似乎比许多富裕的国家更加幸福。

    使用不具代表性的训练集训练出来的模型不可能做出准确的预估,尤其是针对那些特别贫穷或特别富裕的国家。

    针对你想要泛化的案例使用具有代表性的训练集,这一点至关重要。不过说起来容易,做起来难:如果样本集太小,将会出现采样噪声(即非代表性数据被选中);而即便是非常大的样本数据,如果采样方式欠妥,也同样可能导致非代表性数据集,这就是所谓的采样偏差。

    1.50.2.1.关于采样偏差的一个示例

    最著名的采样偏差的示例发生在1936年美国总统大选期间,兰登对决罗斯福。Literary Digest当时举行了一次大范围的民意调查,向约1000万人发送邮件,并得到了240万个回复,因此做出了高度自信的预言—兰登将获得57%的选票。结果恰恰相反,罗斯福赢得了62%的选票。问题就在于Literary Digest的采样方式:

    首先,为了获取发送民意调查的地址,Literary Digest采用了电话簿、杂志订阅名单、俱乐部会员名单等类似名簿。而所有这些名单上的人往往对富人有更大的偏好,也就更有可能支持共和党(即兰登)。

    其次,收到民意调查邮件的人中,不到25%的人给出了回复。这再次引入了采样偏差,那些不怎么关心政治的人、不喜欢Literary Digest的人以及其他的一些关键群体直接被排除在外了。这是一种特殊类型的采样偏差,叫作无反应偏差。

    再举一个示例,假设你想创建一个系统用来识别funk音乐视频。构建训练集的方法之一是直接在YouTube上搜索“funk music”,然后使用搜索结果的视频。但是,这其实基于一个假设—YouTube的搜索引擎返回的视频结果是所有能够代表funk音乐的视频。而实际的搜索结果可能会更偏向于当前流行的音乐人(如果你住在巴西,你会得到很多关于“funk carioca”的视频,这听起来跟James Brown完全不是一回事)。另一方面,你还能怎样获得一个大的训练集?

    1.50.3.低质量数据

    显然,如果训练集满是错误、异常值和噪声(例如,低质量的测量产生的数据),系统将更难检测到底层模式,更不太可能表现良好。所以花时间来清理训练数据是非常值得的投入。事实上,大多数数据科学家都会花费很大一部分时间来做这项工作。例如:

    如果某些实例明显是异常情况,那么直接将其丢弃,或者尝试手动修复错误,都会大有帮助。
    如果某些实例缺少部分特征(例如,5%的顾客没有指定年龄),你必须决定是整体忽略这些特征、忽略这部分有缺失的实例、将缺失的值补充完整(例如,填写年龄值的中位数),还是训练一个带这个特征的模型,再训练一个不带这个特征的模型。

    1.50.4.无关特征

    正如我们常说的:垃圾入,垃圾出。只有训练数据里包含足够多的相关特征以及较少的无关特征,系统才能够完成学习。一个成功的机器学习项目,其关键部分是提取出一组好的用来训练的特征集。这个过程叫作特征工程,包括以下几点:
    特征选择(从现有特征中选择最有用的特征进行训练)。
    特征提取(将现有特征进行整合,产生更有用的特征—正如前文提到的,降维算法可以提供帮助)。
    通过收集新数据创建新特征。

    现在我们已经看了不少“坏数据”的示例,再来看几个“坏算法”的示例。

    1.50.5.过拟合训练数据

    假设你正在国外旅游,被出租车司机敲诈,你很可能会说,那个国家的所有出租车司机都是强盗。过度概括是我们人类常做的事情,不幸的是,如果我们不小心,机器很可能也会陷入同样的陷阱。在机器学习中,这称为过拟合,也就是指模型在训练数据上表现良好,但是泛化时却不尽如人意。下图显示了一个训练数据过拟合的高阶多项式生活满意度模型。虽然它在训练数据上的表现比简单的线性模型要好得多,但是你真的敢相信它的预测吗?
    在这里插入图片描述

    过拟合训练数据
    虽然诸如深度神经网络这类的复杂模型可以检测到数据中的微小模式,但是如果训练集本身是有噪声的,或者数据集太小(引入了采样噪声),那么很可能会导致模型检测噪声本身的模式。很显然,这些模式不能泛化至新的实例。举例来说,假设你给生活满意度模型提供了更多其他的属性,包括一些不具信息的属性(例如国家名)。在这种情况下,一个复杂模型可能会检测到这样的事实模式:训练数据中,名字中带有字母w的国家,如新西兰(New Zealand,生活满意度为7.3)、挪威(Norway,生活满意度为7.4)、瑞典(Sweden,生活满意度为7.2)和瑞士(Switzerland,生活满意度为7.5),生活满意度均大于7。当把这个w满意度规则泛化到卢旺达(Rwanda)或津巴布韦(Zim-babwe)时,你对结果有多大的自信?显然,训练数据中的这个模式仅仅是偶然产生的,但是模型无法判断这个模式是真实的还是噪声产生的结果。

    当模型相对于训练数据的数量和噪度都过于复杂时,会发生过拟合。可能的解决方案如下。

    简化模型:可以选择较少参数的模型(例如,选择线性模型而不是高阶多项式模型)也可以减少训练数据中的属性数量,或者是约束模型。

    收集更多的训练数据。

    减少训练数据中的噪声(例如,修复数据错误和消除异常值)。

    通过约束模型使其更简单,并降低过拟合的风险,这个过程称为正则化。例如,我们前面定义的线性模型有两个参数:θ0和θ1。因此,该算法在拟合训练数据时,调整模型的自由度就等于2,它可以调整线的高度(θ0)和斜率(θ1)。如果我们强行让θ1 = 0,那么算法的自由度将会降为1,并且拟合数据将变得更为艰难—它能做的全部就只是将线上移或下移来尽量接近训练实例,最后极有可能停留在平均值附近。这确实太简单了!如果我们允许算法修改θ1,但是我们强制它只能是很小的值,那么算法的自由度将位于1和2之间,这个模型将会比自由度为2的模型稍微简单一些,同时又比自由度为1的模型略微复杂一些。你需要在完美匹配数据和保持模型简单之间找到合适的平衡点,从而确保模型能够较好地泛化。

    下图显示了三个模型。点线表示的是在以圆圈表示的国家上训练的原始模型(没有正方形表示的国家),虚线是我们在所有国家(圆圈和方形)上训练的第二个模型,实线是用与第一个模型相同的数据训练的模型,但是有一个正则化约束。可以看到,正则化强制了模型的斜率较小:该模型与训练数据(圆圈)的拟合不如第一个模型,但它实际上更好地泛化了它没有在训练时看到的新实例(方形)。

    在学习时,应用正则化的程度可以通过一个超参数来控制。超参数是学习算法(不是模型)的参数。因此,它不受算法本身的影响。超参数必须在训练之前设置好,并且在训练期间保持不变。如果将正则化超参数设置为非常大的值,会得到一个几乎平坦的模型(斜率接近零)。学习算法虽然肯定不会过拟合训练数据,但是也更加不可能找到一个好的解决方案。调整超参数是构建机器学习系统非常重要的组成部分。
    在这里插入图片描述
    正则化降低了过拟合的风险

    1.50.6.欠拟合训练数据

    你可能已经猜到了,欠拟合和过拟合正好相反。它的产生通常是因为对于底层的数据结构来说,你的模型太过简单。例如,用线性模型来描述生活满意度就属于欠拟合。现实情况远比模型复杂得多,所以即便是对于用来训练的示例,该模型产生的预测都一定是不准确的。

    解决这个问题的主要方式有:
    选择一个带有更多参数、更强大的模型。
    给学习算法提供更好的特征集(特征工程)。
    减少模型中的约束(例如,减少正则化超参数)。

    1.50.7.全局总结

    现在我们对机器学习已经有了一定了解。我们暂且退后一步,纵观一下全局:

    机器学习是关于如何让机器可以更好地处理某些特定任务的理论,它从数据中学习,而无须清晰地编码规则。
    机器学习系统有很多类型:有监督和无监督,批量的和在线的,基于实例的和基于模型的,等等。
    在一个机器学习项目中,你从训练集中采集数据,然后将数据交给学习算法来计算。如果算法是基于模型的,它会调整一些参数来将模型适配于训练集(即对训练集本身做出很好的预测),然后算法就可以对新的场景做出合理的预测。如果算法是基于实例的,它会记住这些示例,并根据相似度度量将它们与所学的实例进行比较,从而泛化这些新实例。
    如果训练集的数据太少或数据代表性不够,包含太多噪声或者被一些无关特征污染(垃圾进,垃圾出),那么系统将无法很好地工作。最后,你的模型既不能太简单(会导致欠拟合),也不能太复杂(会导致过拟合)。

    本文内容节选自《机器学习实战:基于Scikit-Learn、Keras和TensorFlow(原书第2版)》一书,由奥雷利安·杰龙所著,是国外AI“四大名著”之一。本书分为两部分。第一部分是机器学习基础;第二部分是神经网络和深度学习,是一本理论结合实践的经典书籍。全文内容经出版社授权分享。

    展开全文
    toto1297488504 2021-02-21 16:53:14
  • 【神经网络】Pytorch构建自己的训练数据集 ​ 最近参加了一个比赛,需要对给定的图像数据进行分类,之前使用Pytorch进行神经网络模型的构建与训练过程中,都是使用的Pytorch内置的数据集,直接下载使用就好,而且...

    【神经网络】Pytorch构建自己的训练数据集

    ​ 最近参加了一个比赛,需要对给定的图像数据进行分类,之前使用Pytorch进行神经网络模型的构建与训练过程中,都是使用的Pytorch内置的数据集,直接下载使用就好,而且下载下来的数据已经是Pytorch可以直接用于训练的Dataset类型,十分方便。但是如何使用Pytorch对自己的数据集进行训练,以及如何将数据集转换成Pytorch可以用于训练的Dataset数据类型,着实进行了一系列的摸索与尝试,特此进行记录。

    ​ 如果要重写Pytorch的Dataset类与DataLoader类,首先需要获取到自己的数据集,我的数据是存放在 “./data” 文件夹下面,其中 “./data/image/train/” 文件夹下面存放的是用于训练的图像数据,对应的图像标签存放在 “./data/train.labels.csv” 文件中,其中的数据存放格式是 “train_0.jpg 0” ,而 “./data/image/test/” 文件夹下面存放的是测试图像,不含标签,因此训练过程的验证集选择从训练图像中进行按照比例划分,选择使用sklearn中的对应函数,可以按照比例的进行随机划分。

    ​ 因此重写Pytorch的两个类,首先要将对应的图像与标签读取到,图像与标签进行匹配配对,然后进行后续的操作。

    一、导入包:

    import numpy as np
    from sklearn.model_selection import train_test_split  # 将数据分为测试集和训练集
    import os  # 打开读取文件
    import cv2  # opencv读取图像
    from matplotlib import pyplot as plt  # 测试图像是否读入进行绘制图像
    import torch
    from torch.autograd import Variable
    from torchvision import transforms
    from torch.utils.data import Dataset, DataLoader
    from PIL import Image
    

    二、读取图像文件夹:

    def read_directory(directory_name, array_of_img, length, imgPath):
        # 参数为文件夹名称,图像数组,读取的文件长度,图像地址数组
        direct = os.listdir(r"./" + directory_name)
        # 乱序读取进来的数据集,对读取进来的数据集按照标号进行排序
        direct.sort(key=lambda x: int(x[6:-4]))
        # 如果输入-1,将其转换为长度加一,即将数据全部读入
        if length == -1:
            length = len(direct) + 1
        for filename in direct[0: length]:
            print("读取图像:" + filename)  # 测试是否按序读入
            iPath = "./" + directory_name + filename  # 读取当前图像的地址
            imgPath.append(iPath)  # 追加进图像地址数组中去
            img = cv2.imread(directory_name + "/" + filename)
            # 调整图像大小
            # img = cv2.resize(img, (32, 32))
            # 使用cv2.imread()接口读图像,读进来的是BGR格式以及【0~255】,所以需要将img转换为RGB格式正常显示
            img = img[:, :, [2, 1, 0]]
            # # 转为一维数组
            # img = np.array(img).flatten()
            # # print(img)
            array_of_img.append(img)
    

    ​ 注释已经基本上写的十分详细了,对代码进行简要的说明:

    (1)读取到图像数据之后,将图像本身的数据与图像的地址数据分别存放在传入的列表"array_of_img"和"imgPath"中;

    (2)读取图像数据之后,不知道Python读取进来的数据顺序是什么,但是有序的文件夹中的图像名称,读取进来之后就变成乱序了,因此使用正则表达式对图像的编号进行排序,保证其可以和对应的图像编号相对应;

    (3)训练数据集中含有近八万张图像,如果每次测试都将图像全部读取进来,时间开销巨大,因此设置参数"length",对读取文件夹中的图像列表进行切片,可以在训练中读取较少的图像用于测试。如果想要读取全部的参数,可以传入参数"-1",但是Python的切片操作"[0:-1]“得到的列表不包含最后一个数据,因此对”-1"进行转换,设置为文件夹图像数据长度+1,就可以实现图像的全部读取进来;

    (4)使用cv2.imread()接口读图像,读进来的是BGR格式以及[0~255],如果对图像进行绘制的话,显示的颜色失真,所以需要将img转换为RGB格式正常显示。

    三、显示图像:

    def show_pic(images, length):
        i = 0
        plt.figure(figsize=(length, length))
        for img in images[0: length * length]:
            plt.subplot(length, length, i + 1)
            plt.imshow(img)
            # 关闭x,y轴显示
            plt.xticks([])
            plt.yticks([])
            i += 1
    
        plt.show()
    

    ​ 如果想要测试是否成功的读取到图像,可以选择性的调用这个函数对图像进行绘制,参数为图像本身的数据数组以及想要每行显示的图像数量(共绘制length*length个图像)。

    四、读取图像对应标签:

    def read_tag(tag_path, tags, length):
        # 参数为标签文件路径,标签数组,读取长度
        # 读取数据的标签
        with open(tag_path) as file:
            for line in list(file)[0:length]:
                # 读取前多少张图片的标签
                a = str(line).split("\t")
                b = a[1]  # 得到数字值
                tag = int(b[0])  # 去掉换行符
                tags.append(tag)
    

    ​ 同读取图像文件夹类似,需要对读取的标签数据进行格式检查,得到整型的图像标签,我的标签每行数据格式如"train_0.jpg 0",因此这里的处理方法要根据自己的数据格式进行相应的调整。

    五、分类图像数据集

    #  对数据进行处理与加载
    def data_load(img_path, tag_path, length, test_rate):
        # 获取数据与数据标签,并将数据分为训练集和测试集
        # 参数为图像文件夹,标签地址,length为读取的数据集长度,size为训练集测试集的区分比例
    
        images = []  # 图像数组
        tags = []  # 标签数组
        imPath = []  # 图像地址数组
        read_directory(img_path, images, length, imPath)
        read_tag(tag_path, tags, length)
    
        # 测试图像读取是否正常
        # show_pic(images, 10)
    
        # 转换为numpy数组
        images = np.array(images)
        tags = np.array(tags)
    
        # 返回处理得到的数据,有 X_train, X_test, y_train, y_test 四部分
        return train_test_split(images, tags, test_size=test_rate)
    

    ​ 如果使用的SkLearn等工具包对数据进行训练,可以直接对原始数据进行训练,则可以利用此函数读取相应的数据,并根据测试集的比例,随机将训练集划分为训练集与验证集。

    六、生成文本文件:

    def create_txt(img_path, tag_path, length, test_rate):
        # 生成训练集,验证集的数据地址与对应标签存储的数据对
        images = []  # 图像数组
        imagePath = []  # 图像地址数组
        tags = []  # 训练标签数组
    
        # 读取指定数量的图像,图像地址,以及对应的训练标签
        read_directory(img_path, images, length, imagePath)
        read_tag(tag_path, tags, length)
    
        # 根据比例随机划分训练集与测试集对应的图像地址和对应的标签
        X_train, X_test, y_train, y_test = train_test_split(imagePath, tags, test_size=test_rate)
    
        # w+意思是:
        # 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。
        # 如果该文件不存在,创建新文件
        train = open('./data/train.txt', 'w+')
        test = open('./data/test.txt', 'w+')
    
        for i in range(len(X_train)):  # 生成训练文档
            name = X_train[i] + ' ' + str(int(y_train[i])) + '\n'
            train.write(name)
        for i in range(len(X_test)):  # 生成测试文档
            name = X_test[i] + ' ' + str(int(y_test[i])) + '\n'
            test.write(name)
    
        train.close()
        test.close()
    

    ​ 因为Pytorch中读取到的数据与标签类似于一个二元组,相互绑定,那么使用此函数将图像的地址与图像的标签进行绑定,生成一个txt文档,用于之后重写Dataset类,并且使用Sklearn的 “train_test_split()” 函数将数据根据比例随机划分为训练集与验证集,构建的txt文档格式为:"./data/image/train/train_3.jpg 0",用于之后的处理。

    (注意使用的Python解释器,如果使用的是服务器上的解释器,生成的txt文档会在服务器的对应地址处,而本地没有这个txt文档,当初排查了好久。。。。。。)

    七、重写Dataset类:

    def default_loader(path):
        return Image.open(path).convert('RGB')
    
    
    class MyDataset(Dataset):
        # 使用__init__()初始化一些需要传入的参数及数据集的调用
        def __init__(self, txt, resize, target_transform=None, loader=default_loader):
            super(MyDataset, self).__init__()
            # 对继承自父类的属性进行初始化
            fh = open(txt, 'r')
            imgs = []
            # 按照传入的路径和txt文本参数,以只读的方式打开这个文本
            for line in fh:  # 迭代该列表,按行循环txt文本中的内容
                line = line.strip('\n')
                line = line.rstrip('\n')
                # 删除本行string字符串末尾的指定字符,默认为空白符,包括空格、换行符、回车符、制表符
                words = line.split()
                # 用split将该行分割成列表,split的默认参数是空格,所以不传递任何参数时分割空格
                imgs.append((words[0], int(words[1])))
                # 把txt里的内容读入imgs列表保存
            self.imgs = imgs
            # 重新定义图像大小
            self.transform = transforms.Compose([transforms.Resize(size=(resize, resize)), transforms.ToTensor()])
            self.target_transform = target_transform
            self.loader = loader
    
        # 使用__getitem__()对数据进行预处理并返回想要的信息
        def __getitem__(self, index):
            fn, label = self.imgs[index]
            # fn是图片path
            img = self.loader(fn)
            # 按照路径读取图片
            if self.transform is not None:
                img = self.transform(img)
                # 数据标签转换为Tensor
            return img, label
            # return回哪些内容,那么在训练时循环读取每个batch时,就能获得哪些内容
    
        # 使用__len__()初始化一些需要传入的参数及数据集的调用
        def __len__(self):
            return len(self.imgs)
    

    ​ 除了注释中的说明外,因为不同的神经网络模型对于图像大小要求不一样,因此构建数据集时传入参数 “resize”,将图像进行大小调整为 “resize*resize” 大小的图像,用于模型训练。

    八、创建DataLoader:

    def MyDataLoader(img_path, tag_path, length, test_rate, Resize, batch_size):
        # 制作适用于torch的数据
        create_txt(img_path, tag_path, length, test_rate)
        train_data = MyDataset(txt='./data/train.txt', resize=Resize)
        test_data = MyDataset(txt='./data/test.txt', resize=Resize)
        train_loader = DataLoader(dataset=train_data, batch_size=batch_size, shuffle=True)
        test_loader = DataLoader(dataset=test_data, batch_size=batch_size, shuffle=False)
        return train_loader, test_loader
    

    ​ 首先构建图像与标签对应的文本数据,之后创建对应的dataset,然后构建成DataLoader用于Pytorch的模型训练。

    九、测试:

    def main():
        img_path = "data/image/train/"
        tag_path = "data/train.labels.csv"
        data_length = 10
        test_rate = 0.3
        batch_size = 2
        Resize = 64
    
        train_loader, test_loader = MyDataLoader(img_path, tag_path, data_length, test_rate, Resize, batch_size)
        for X, y in train_loader:
            print("Shape of X [N, C, H, W]: ", X.shape)
            print("Shape of y: ", y.shape, y.dtype)
            break
    
    
    if __name__ == "__main__":
        main()
    

    ​ 输出为:

    读取图像:train_0.jpg
    读取图像:train_1.jpg
    读取图像:train_2.jpg
    读取图像:train_3.jpg
    读取图像:train_4.jpg
    读取图像:train_5.jpg
    读取图像:train_6.jpg
    读取图像:train_7.jpg
    读取图像:train_8.jpg
    读取图像:train_9.jpg
    Shape of X [N, C, H, W]: torch.Size([2, 3, 64, 64])
    Shape of y: torch.Size([2]) torch.int64

    ​ 整理不易,点赞支持~

    展开全文
    ISASUKEI 2021-11-29 15:12:18
  • 训练神经网络模型之前,需要先获取训练数据集和测试数据集,本文介绍的获取数据集(get_data_train_test)的方法包括以下步骤: 1 在数据集文件夹中,不同类别图像分别放在以各自类别名称命名的文件夹中; 2 获取...

    训练神经网络模型之前,需要先获取训练数据集和测试数据集,本文介绍的获取数据集(get_data_train_test)的方法包括以下步骤:
    1 在数据集文件夹中,不同类别图像分别放在以各自类别名称命名的文件夹中;
    2 获取所有图像路径以及分类;
    3 将分类转为字典格式;
    4 将所有图像路径打乱;
    5 将所有图像路径切分为训练部分和测试部分;
    6 获取x部分
    6.1 获取图像;
    6.2 图像尺寸调整;
    6.3 图像降维;
    6.4 图像像素值取反;
    6.5 图像像素值归一化;
    7 获取y部分
    7.1 获取图像的类别名称;
    7.2 找到类别名称对应的id;
    7.3 列表推到;

    import os
    import random
    import math
    import sys
    import cv2
    import numpy as np
    from PIL import Image
    
    #数据集路径
    DATASET_TRAIN_TEST_DIR = 'D:/word/data_train_test'
    DATASET_TEST_DIR = 'D:/word/data_test'
    #随机种子
    RANDOM_SEED = 0
    #验证集数量
    NUM_TEST = 20
    #分类数量
    NUM_CLASS = 10
    
    #获取所有文件以及分类
    def get_filenames_and_classes(dataset_dir):
    	#数据目录
    	directories = []
    	#分类名称
    	class_names = []
    	for filename in os.listdir(dataset_dir):
    		#合并文件路径
    		path = os.path.join(dataset_dir, filename)
    		#判断该路径是否为目录
    		if os.path.isdir(path):
    			#加入数据目录
    			directories.append(path)
    			#加入类别名称
    			class_names.append(filename)
    
    	photo_filenames = []
    	#循环每个分类的文件夹
    	for directory in directories:
    		for filename in os.listdir(directory):
    			path = os.path.join(directory, filename)
    			#把图片加入图片列表
    			photo_filenames.append(path)
    
    	return photo_filenames, class_names
    
    def get_xs(filenames):
    	xs = []
    	for i in range(len(filenames)):
    		image = Image.open(filenames[i]).convert('L')
    		blank = Image.new('L',[28,28],(255))
    		max_length = np.max(image.size)
    		w = int(image.size[0]*28/max_length)
    		h = int(image.size[1]*28/max_length)
    		#图像尺寸不超过28*28
    		image = image.resize((w,h), Image.NEAREST)
    		#图像尺寸调整为28*28
    		blank.paste(image, ((28-w)//2, (28-h)//2))
    		#图像尺寸调整为1*784
    		x = blank.resize((1,784))
    		#图像转换为数组
    		x = np.array(x)
    		#图像降维,如[[1],[2],[3]]变为[1,2,3]
    		x = x.squeeze()
    		#图像像素值取反
    		x = np.full(784, 255) - x
    		#图像像素值归一化
    		max = np.max(x)
    		x = x / np.full(784, max)
    		#获取多幅图像数据
    		xs.append(x)
    	return xs
    
    def get_ys(filenames, class_names_to_ids):
    	ys = []
    	for i in range(len(filenames)):
    		#获得图片的类别名称
    		class_name = os.path.basename(os.path.dirname(filenames[i]))
    		#找到类别名称对应的id
    		class_id = class_names_to_ids[class_name]
    		#列表推到
    		y=[1 if id==class_id else 0 for id in range(NUM_CLASS)]
    		ys.append(y)
    	return ys
    
    def get_data_train_test():
    	#获得所有图片路径以及分类
    	photo_filenames, class_names = get_filenames_and_classes(DATASET_TRAIN_TEST_DIR)
    
    	#把分类转为字典格式,类似于{'A':0, 'B':1, 'C':2}
    	class_names_to_ids = dict(zip(class_names, range(len(class_names))))
    
    	#把数据切分为训练集和测试集
    	random.seed(RANDOM_SEED)
    	random.shuffle(photo_filenames)
    	training_filenames = photo_filenames[NUM_TEST:]
    	testing_filenames = photo_filenames[:NUM_TEST]
    	train_xs = get_xs(training_filenames)
    	train_ys = get_ys(training_filenames, class_names_to_ids)
    	test_xs = get_xs(testing_filenames)
    	test_ys = get_ys(testing_filenames, class_names_to_ids)
    
    	return train_xs, train_ys, test_xs, test_ys
    
    def get_data_test():
    	filenames = []
    	for filename in os.listdir(DATASET_TEST_DIR):
    		#合并文件路径
    		path = os.path.join(DATASET_TEST_DIR, filename)
    		filenames.append(path)
    	xs = get_xs(filenames)
    	return xs
    
    
    展开全文
    wxsy024680 2021-03-22 09:22:07
  • 之后,上述不同数据扩充方式被应用在原始信号中以扩充训练数据的多样性,值得一提的是,Spec-Aug[5]在该过程中没有被应用在时域的信号层,而是被用来在频域的特征层进行扩充。 通过上述方式获得了原始数据20倍左右...

    本文联合撰写:

    腾讯:吕志强,颜京豪,胡鹏飞,康健,阿敏巴雅尔

    导语|在刚刚结束的NIST OPENASR评测中,TEG AI语音联合清华大学,刷新世界小语种语音识别比赛6项第一。从2000年开始,NIST组织的RT(英文语音识别),LRE(语音语种识别),SRE(语音说话人识别),OPENKWS(语音关键词识别)等比赛一直是语音届的标杆竞赛,其组织比赛方向也可以看出目前学术和工业界的语音研究发展方向。长期以来,NIST组织的语音比赛受到了来自世界一线的研究单位支持与参与。而2020年新增的OPENASR比赛,则更加关注小语种语音技术。

    工业级语音识别系统通常需要上万小时,甚至十万小时以上规模的语音标注数据,才能在某些特定场景(如干净朗读,新闻)达到90%以上的识别率。但是在世界范围内存在7000多个语种,仅中国境内就存在200多个语种,汉语的使用人群只有90%,余下绝大多数语种都是小语种。

    据统计,世界范围内,小于百万人群使用的小语种占据世界所有语种的80%(如图1),对于甚至Google这样的互联网公司,目前在其语音识别产品中,也仅仅覆盖了世界所有语种的4%。

    巧媳妇难为无米之炊,小语种语音识别以其难以获取,难以标注,难以评估,已经成为世界性的研究难题。而NIST今年放出了这个任务,也足见小语种目前已经成为学界和业界的下一个前沿风口。

    图1. 世界不同人群数量语种的数量和占比,小于百万人群使用的小语种占据世界所有语种的80% 

    目前,小语种识别受到越来越多关注。著名的Babel项目给自己设定的目标即是“在7天时间为一种新语言构造一个语音识别系统”。该项目于2011年启动,参与单位包括世界各地CMU、UC Berkeley ICSI实验室、IBM Watson研究中心、BBN公司等著名机构。Babel项目不仅取得了丰硕的科研成果,同时对研究者开放了超过20种语言的数据包,有力促进了小语种研究。

    小语种语音数据难以获取不仅表现在语音上,更表现在语料,发音词典,标注资源上。对于许多小语种,姑且不说上万小时语音数据,就连100小时标注数据的获取也举步维艰。为此, 世界语音学术领域的权威组织NIST在2020年底,举办了OPENASR比赛。

    旨在低资源语种限制下,评估一下当前SOTA(最前沿技术)在10小时门槛下的语音识别性能,比赛要求参赛队伍在给定数据一周后,在限定的关门时间内完成语音识别转写任务,比赛分为受限条件(Constrained condition)和非受限条件(Unconstrained condition)两个赛道,前者只能使用组委会提供的10小时标注语音识别数据,后者可以使用组委会提供10小时受限数据之外的数据。

    比赛语种包括Amharic,Somali,Guarani,Javanese,Cantonese,Mongolian等十个语种;本次报名团队达到20个左右。我们联合清华大学参加了所有语种的受限条件,同时我们又参与了Cantonese,Mongolian两个非限定条件赛道。最后结果来看,获得Javanese,Guarani,Cantonese,Mongolian等四种语言受限条件第1名;Cantonese,Mongolian两种语言非受限条件第1名,LeaderBoard如下。

    图2. 比赛leaderboard(受限条件前5名+非受限条件前3名, 队名TNT)

    本文将以万字长文讲述我们如何利用如此低资源训练数据迅速打造小语种语音识别系统的技术框架,主要包括以下在比赛中使用到的如下技术创新:

    • 多语种声学预训练;

    • multi-band(多带宽)识别模型;

    • 端到端(e2e)系统的改进,e2e系统和hybrid-HMM系统融合;

    • 多种前,后端处理手段提高数据的可靠性和多样性;

    一. 受限系统

    由于受限系统只提供10小时训练数据,我们采取的主要方案还是语音领域使用较多的Hybrid HMM架构。采用CNN-TDNN-F-A作为声学模型的主干网络,在此之上进行lattice无关的最大交叉熵区分度训练(LF-MMI)[1];而CNN-TDNN-F-A和Dan Povey提出的TDNN-F(factorized TDNN)[3] 不同在于,在CNN和TDNN-F联合建模后又加入了Self-attention模块[2] ,藉此在输入信息里学习更多的位置相关信息。

    由于数据受限,我们选择了融合多种数据扩充方法以增加性能,包括常用的速度和响度pertube[4], Spec-Aug[5],Wav-Aug[6]以及混响和噪声Aug[7]。这些17-20年由不同机构提出的常用语音数据扩充方法可以有效避免再输入信号做增强时对主体信号的伤害,在极低资源场景都被认为是非常有效的方法。

    除此之外,系统的多样性对于最终系统融合至关重要。对于每个语言,我们均在多种不同方式训练得到的单系统上进行融合。

    1.1 系统概述

    由于缺乏有效的声学资源,NN-HMM方式的hybrid声学建模被证明比目前学界前沿的e2e建模在低资源场景更加有效,所以在受限条件下,该系统框架被贯彻使用。如图3所示,系统框架包括数据清洗和预处理,数据增强,声学,词典和语言模型训练,解码以及系统后处理融合5大部分;通常,我们将语音信息拆分成声学模型和语言模型,词典模型三部分,对声学的部分,我们此次比赛中多进行多语言共享或借用学习,再对语言模型,词典模型等和语言相关的独立部分,进行单独建模。

    图3. 语音识别系统概述,整个系统可以大概分为数据清洗和预处理,数据增强,声学,词典和语言模型训练,解码和系统融合5大部分

    首先,在原始训练数据上,采用常规GMM-HMM迭代式训练,得到高精度桢对齐系统(mono-phone->tri-phone->lda-mllt->sat自适应),由于该过程比较经典,具体步骤不再赘述。

    为了使得训练更加高效,我们看到原始训练存在一定比例的标注错误,因此在得到SAT-GMM-HMM系统后,我们首先使用该GMM搭建目标朗读抄本和垃圾音并联的错音,漏音清洗模型(data clean up),再利用在Cross Entropy(CE)准则上训练的NN-HMM得到的精细化NN模型进行二次data clean up,得到在原始纯净训练数据上的数据清洗边界,该边界也贯穿在后续对扩充数据的清洗过程和使用中,用于最后的Lattice Free MMI (LF-MMI)区分度准则声学模型[1]。

    之后,上述不同数据扩充方式被应用在原始信号中以扩充训练数据的多样性,值得一提的是,Spec-Aug[5]在该过程中没有被应用在时域的信号层,而是被用来在频域的特征层进行扩充。

    通过上述方式获得了原始数据20倍左右的扩充训练数据,有效缓解了数据不足的问题。在此基础上提取高精度mfcc和pitch特征,整合更低速率的i-vector特征进行说话人信息拼接,训练不同的说话人自适应声学模型,最终系统得益于对不同声学模型得到的lattice后进行的融合。

    1.2 跨语种特征和预训练

    目前对于多语种共享特征,常用的可共享特征包括瓶颈(Bottle Neck, BN)特征和后验概率特征(Posterior Feature, PF)。通常首先构造一个音素分类器,该分类器的中间层输出具有显著的发音区分性。一般中间层比其它层具有较少的节点数,因此称为瓶颈层,相应的输出称为瓶颈特征。

    同时,该分类器的输出为输入语音帧对应的音素后验概率,同样具有明显的发音区分性,称为后验概率特征。但不幸的是,在10小时这个量级上,10种语言总共只有100小时。和之前我们在NIST OPENKWS评测中得到的结论不同,在这个规模和量级下,多语言瓶颈特征对于系统提升不大。

    我们使用多任务学习的方式,通过共享同一个网络或网络的一部分对多个语言任务进行同时学习。基于这一学习方式,参与共享的网络在参数更新时可利用多个任务的误差信息,从而实现不同任务之间的信息共享。应用到小语种识别上,可以将包括小语种在内的多个语言作为不同任务,这些任务共享网络特征提取层,输出层则互相独立。

    如下多语言共享的模型结构。该方法仅仅利用高精度mfcc特征(Multi-lang MFCC hires),就可以使得WER从0.515降低到0.487(和组委会保持一致,WER和CER的单位均使用小数表示,如WER 0.515意味着51.5%的词错误率)。

    预训练在图像和NLP领域自从18年被提出后,至今方兴未艾,已经成为图像和NLP领域最炙手可热的SOTA算法。而语音领域的预训练至今一直没有较大突破。究其原因主要还是语音和图像,NLP不同,跨越语种的认知在大多数人类中都很难做到,更何况机器智能。

    因此,语音想要和图像一样做到可以在不同语言和场景上泛化,难度上会更大一个级别。在本次比赛中,我们首次在系统中尝试了利用相同场景的组委会提供电话信道跨语种数据进行预训练,获得了显著的系统效果提升。

    图4. 预训练跨语种Tera提取器

    在本次受限场景中我们探索了近期提出的Tera模型(Transformer Encoder Representation from Alternation)[20],如图4所示。我们通过在组委会提供的电话信道数据中,训练跨语种Tera Transformer以获取Tera跨语种特征提取器。通过该方式迁移到下游的每个受限语种带标注语音的识别任务上,获得768 dim的预训练特征表示。

    在次基础上,训练CNN-TDNNF-F-A,DFSMN,TDNN-F-BLSTM等声学模型。单系统实验结果证明,使用语音跨语种预训练特征可以从无监督数据中获得良好的和语种无关的信息表示,并获得更快的收敛速度。但目前在受限场景赛道的预训练,由于数据量依然较少,故提升比较有限。但欣喜的是,该方法可以和多语种高精度MFCC特征所获得的声学模型在系统lattice结果融合时,提供非常好的互补。

    N.O.

    SYSTEM

    WER

    CER

    1

    Multi-lang MFCC hires

    0.487

    0.456

    2

    Multi-lang MFCC hires+pitch

    0.485

    0.444

    3

    Tera

    0.510

    0.476

    4

    1+2+3 Fusion

    0.458

    0.424

    表. 1 不同特征的预训练迁移到下游任务在单系统DEV集合Ground Truth VAD的结果

    1.3 声学模型

    我们提出将CNN-TDNN-F-A作为系统的声学模型主干网络,它主要包括若干卷积层(CNN),Factorized Time Delay Neural Network(TDNN-F)层[3]和Self-Attention层[2]。CNN通过使用local filters, max-pooling和weight sharing[11],在语音任务上可以在语谱图中获得在更广阔时频域视野下,对语音频率和时间变化的刻画,由于Very deep CNN单独建模的声学模型在计算复杂度和性能上存在瓶颈。

    如今在语音识别任务中已经使用得不多或作为互补系统使用,而更为有效和经济的CNN-TDNN建模[12]则使用更加广泛。此次我们将CNN-TDNN换为CNN-TDNN-F,F即Factorized,后者乃语音hybrid系统中Dan Povey提出的创新性工作,类似于SVD分解的TDNN。

    但为了克服SVD分解简化网络时,反传更新带来的矩阵不稳定性而导致的训练错误,TDNN-F在训练开始时就随机初始化,SVD分解后,其中一个矩阵在迭代中始终限制为半正定的,这种每轮mini-batch算完后的半正定约束,不仅不会损失任何建模能力,也符合SVD的前提假设,在2018-20年的hybrid系统中几乎是SOTA的标配。

    而Self-attention自注意力机制自从2018年Transformer的提出后,在机器学习任务中被广为使用,其原理主要还是通过多头注意力机制,学习输入语谱不同位置和频率的关系表示,故本文则不赘述。我们通过将Self-Attention Network(SAN)层作为CNN-TDNN-F输出后的注意力表示,但会更多的限定时间区域[2],这样使得该系统更加适合语音识别任务。

    图5. CNN-TDNNN-F-A网络结构

    图5表示了我们在hybrid系统中获得最优性能的单系统CNN-TDNN-F-A的声学模型网络表示,由6层CNN加11层TDNN-F(隐层维数768,factorized瓶颈层维数120,160或256)以及SAN层(20个注意力头,8维key,16维value)组成,我们通过经验发现,在SAN层再后接两个TDNN-F可以有效提升系统性能。

    除此之外,我们也训练了TDNN-F[3],TDNN-F-BLSTM(p),DFSMN[18] 三套系统,作为互补融合系统。这些声学模型同样通过LF-MMI进行区分度训练[1]。Batch size选取为128或64,Epochs设为6轮(Kaldi的epochs和常用端到端模型训练的epochs略有不同),初始学习率为0.0005,终止学习率为0.00005。最终的结果看来,通过系统融合虽然获得WER 0.02-0.03个绝对点的提升,达到了最优的性能结果。但起决定性作用的声学模型依然是CNN-TDNN-F-A。

    1.4 说话人自适应

    本次参赛系统的特征选取上,除了常规的hi-res MFCC以外,在带调语言(tonal langauge)上我们添加了常规的3维pitch特征[31],即带pitch音发声概率(POV-prob), 平均对数pitch减值(mean-subtracted-log-pitch), delta-of-raw-pitch(原始差分pitch)。通常这些信息在带调语言,如Cantonese,Vietnamese上可以更好地贴合说话人的发音特性。

    在说话人自适应上,除了在SAT-GMM-HMM的过程中使用传统的fMLLR(cMLLR)变换声学特征以获得更准确的帧对齐信息外,传统fMLLR类算法或者需要两至三遍识别(第一遍结果做supervision,第二遍结果生成变换矩阵,最后识别),目前我们还是选用了更为方便的1-pass ivector方案,该方案基于对角UBM[14] 矩阵得到的说话人识别定长i-vector特征(本系统设为100维)。

    其实,使用i-vector之类的做声学模型输入并不是传统的speaker adaptive training。最多是起到了告诉模型speaker间相似性的作用,其实我们将这个过程叫做speaker awared training更合适。使用该方法对主体声学特征进行拼接,为了更好地适应后续的声学CNN结构,100维的i-vector特征通过 Linear Discriminant Analysis(LDA)映射到了200维;实验结果表明,在10个限定语种上,使用带pitch特征的i-vector 说话人训练,对WER有0.01-0.03个绝对点的提升。

    1.5 语言模型 2-pass&direction 

    此次OPENASR对于语言模型依赖的训练语料并无限制,但网上可获取的训练语料通常偏重新闻。所以,在常规解码中,我们还是采用从IARPA Babel项目中的”training”部分(如Cantonese则采用IARPA-babel101b-v0.4c-build)和OPENASR比赛标注脚本中训练得到的N-gram语言模型用于第1遍解码。在此次比赛的10个小语种里,除了索马里语我们采用LDC-2018T1作为语言模型训练外部语料外,其他9种语言均可以在对应的IARPA Babel包中获得对应数据。

    在一遍识别结果后,我们采用基于TDNN-LSTM的NN语言模型[15] 进行词图(lattice)重打分,循环神经网络语言模型通过下述公式作为常规CE目标的线性估计:

    z 代表神经网络没有经过soft-max的原始结果,j 代表正确单词的序列下标。事实上,上述公式是常规CE准则的下界,用来使得模型在推理过程中可以自规范化(self-normalize),以节省运算时间。对于单词的特征表示,除了对常用的高频词采用one-hot表示外,letter n-gram特征也被用于生成单词的embedding表示,这使得我们可以利用子词(sub-word)信息以更好地表示数据里的相对稀缺词语。最后,我们采用裁剪词图重打分算法(pruned lattice-rescoring)得到的语言模型概率和1-pass解码得到的n-gram语言模型概率进行权重融合。

    在语言模型重打分过程中,我们采用了正序和倒序文本进行两边打分。在每一遍打分中,对解码路径弧是否保留或删除的估计得分取决于lattice里的历史和未来两部分信息[21]。最终,基于RNN类的语言模型打分设定为0.5。不同于其他的系统报告,我们发现在OPENASR 任务中,该权重值只要设定的不是特别极端,对于最终的系统结果影响比较有限。

    1.6 数据前处理

    数据质量对于训练过程非常重要,主要体现在去除标注中出现的各类删除(del),添加(add)和替换(sub)错误,防止训练数据“过脏”(over-dirty);而数据鲁棒则对于数据的多样性非常重要,用于在低资源场景对数据进行扩充,提高系统的泛化性,防止系统过拟合。在我们的工作中,这两者都体现到了系统中。

    1)数据清洗

    数据清洗旨在通过一个脚本词状态和garbage状态(常用词汇)并联的n-gram biased ASR系统对训练数据进行识别,此biased ASR同样也通过修改解码路径grammar图,支持说话重复和不流利现象,非语言词汇的微小增删等现象。

    • step 1. 利用reference脚本中的文字,BUILD BIASED 语言模型,注意这里top n word的选取关于GARBAGE MODEL的鲁棒性,最小LM状态数则根据需求做调整,设置越小,表明需要越biased lm;discounting_constant 是一个0-1的数,表明语言模型回退概率,趋近于0表明搭建更biased语言模型;

    • step 2. 对脚本做group,同一个group共享一个biased 语言模型解码图;biased 语言模型解码,生成lattcie;

    • step 3. lattice 时间对齐,之后和reference脚本进行对齐,生成插入,删除,替换错误;

    • step 4. 处理静音,决定是否分句或者保留,也会考虑修改reference去match在这些non-scored 字符段,譬如在不流利时,重复时,会考虑直接修改reference脚本;

    • step 5. taint marker,生成 confidence term measure(ctm)

    • step 6. 根据step 5的结果切分(句子太短时可以不考虑)

    • step 7. 准备清洗后数据的新segment,尤其是在边缘处进行低通滤波平滑,以应对切分时的边缘畸变;

    • step 8. 去掉文音不匹配的地段,重新切分数据;

    本系统数据清洗采用两遍策略,第一遍采用训练桢对齐系统的SAT-GMM-HMM系统,得到第一遍清洗后的帧边界用于训练NN-HMM的CE准确模型,获得更加准确的清洗位置和帧对齐信息,最后使用上述信息和数据扩充信号,进行LF-MMI区分度训练。

    通过在DEV集上进行实验我们发现,上述数据清洗操作,对于某些语言的效果明显,如Cantonese,Tibetan,在单系统Cantonese上,data-clean up对系统WER 从0.501降低到0.487。但是,对于某些诸如Mongolian,Pashto类的拼写式语言,则提升比较有限。这可能在于汉藏语系的这些语言由于是表义文字,对于标注错误非常脆弱;但相反,对于拼写式语言,如Arabic,Pashto和Mongolian,标注错误只是局部影响一些sub-word,不会严重影响识别器的整体结果。

    除此之外,在搭建biased LM时,我们会选择更biased到当前脚本词的偏重系数;使得清洗系统不至于删除过多的正确标注。

    2)数据扩充

    由于本任务主要还是处理低资源场景下的任务,数据增强通常在该任务下被证明是有效的。比赛中为了更好地利用所提供的训练数据,比赛规定在受限场景中也可以利用外部的噪声和混响等数据。为此,我们采用了几种近年来比较流行的数据增强方法提高训练数据的鲁棒性,使得模型在不同测试集上具有更好的一致性和泛化性。

    • 变速(speed)和变响(volume)扩充:在[4]中,直接在原始信号上利用sox做变速和变音量扩充被证明是非常有效的。通常我们采用常规的3个变速,变响版本,9,1.0和1.1;

    • 混响(reverb)和噪声(noise)扩充:由于DEV场景和训练数据在声学场景上会有差异,噪声上也不尽相同,但音乐类的干扰几乎没有,故我们在这部分的扩充中,只采用了reverb和noise两种方式[7]。对于稳定噪声我们选用MUSAN数据集里的内容,对于非稳定类噪声,本系统只考虑电话对话中常出现的babble noise,选用其他相同语言的其他人讲话进行模拟和叠加,信噪比通常随机选取在10dB以上。在混响上,我们采用模拟的不同房间的RIRs(从1到30),涵盖了小,中,大三种房间。由于评测场景以房间内外手机对话居多,混响的选取上我们比较保守,会把Signal To Noise Ratio(SRR)控制得比较大;

    Wav-Aug: 近期提出的Wav-Aug算法[5]也是一类时域的数据扩充算法,它提供了上述扩充外的其他3种数据扩充方式:

    1)pitch 修改常用于处理pitch在不同场景的变化问题;

    2)频带消除滤波(band reject filtering)用于提升频谱鲁棒性;

    3)时域遮罩(time masking)用于提升时域的鲁棒性;

    Spec-Aug: Spec-Aug也是2019年Google提出的数据扩充方案[4],与前三者直接在信号级进行扩充不同的是,Spec-Aug在hybrid HMM系统中常作为特征提取后,声学NN模型前的一个中间处理层。在实现中,我们采用了在时间和频率两个维度的折叠和弯曲声学特征,对频域的特定频带和时域的特定区域进行遮罩(masking)两个主要操作。

    从Dev集的实验来看,四种aug方式对识别结果的影响不同。其中speed pertube效果最为明显,且具有很强的互补性。我们在参赛系统中随机选取了这些数据增强方法,直到所有数据被扩充了20倍,扩充数据的清洗边界和对齐信息由他们对应的干净语音获得,再叠加到扩展数据中去。

    1.7 预处理,解码和后处理

    不同于DEV集,我们在拿到EVAL集后,发现有两个特点:一是比赛并没有提供“segments”文件,意味着参赛系统中必须自己实现语音活动检测(Speech Activity Detection, SAD)模块;二是数据既有8k又有16k,意味着单纯靠8k窄带识别系统并没有完整地利用高频信息;

    但在受限条件上,训练数据并没有提供大于8k的,故本节主要描述一下我们在ASR前的SAD模块,解码参数,后处理,以及系统融合的工作。

    1)端点检测(SAD)

    在识别阶段,SAD的地位类似图像的检测任务,是一个可以去除和语音无关,保留语音有效内容的重要模块。同时作为一个前置的轻量级模块,SAD也可以减轻后端解码负担,提升解码速度;在SAD算法中,我们集成了并联CRNN+RNN[16]的和基于传统能量加pitch的输出语音概率,使得系统Valid Activity Detection(VAD)序列输出更加稳定;同时,在VAD序列上我们也添加了一阶dilation-erosion后处理,以及最后类似ETSI标准里的VAD logic hold-over算法,避免了局部帧结果对整体SAD产生的影响;

    并联CRNN+RNN的VAD系统

    在DEV集中,我们发现SAD在本ASR系统中的有效性和重要性。在单系统(CNN-TDNN-F-A chain model)上,Cantonese任务上测得,使用单纯基于能量的SAD只能得到0.501的WER,而采用本方法的VAD系统可以进一步提升到0.483,而人工标注VAD的理想结果(Oracle)是0.456,其中的GAP高达0.05(5个WER百分点)

    2)解码(Decode)

    在参赛系统中,我们采用了常规的hybrid-HMM里常用的基于WFST HCLG的静态解码图算法。第一阶段采用n-gram解码,解码beam为15, lattice  beam为8。解码出lattice后,使用两层TDNN-LSTM语言模型对lattice进行如1.5节中描述的重打分。

    3)系统融合

    通过不同特征(跨语种声学特征,预训练),数据扩充(变速,响度,混响,噪声, Wav&Spec Aug)和声学模型网络结构(CNN-TDNN-F-A, TDNN-LSTM(p),TDNN-F,DFSMN)所得到的系统,通常通过在1-best结果上ROVER可以实现融合的目的。在本系统中我们采用了性能更加出色的lattice融合[30]。Lattice融合不同于ROVER算法在1-best结果上进行投票和重打分,而是考虑到lattice上的更多候选词和弧上对应的解码分数,由于增加了不同信息源的解码结果,lattice融合可以获得比各个单系统和ROVER融合更好的性能。

    4)结果后处理

    从lattice融合后的lattice最优路径得到1-best结果后,我们通过置信度对输出单词进行过滤,对于识别结果置信度不高的单词输出进行丢弃。该方法虽然简单,但可以有效降低系统的输出插入错误,尤其是在Babel常见的口语场景,存在大量的重复修正,有声停顿和说话无意义错误(miscues)。

    1.8 受限系统评估集结果

    比赛的测试数据只在比赛前一周放出,要求各个参赛队伍在规定时间内提交结果,最终我们在受限场景各个语言通过nist官方打分得到的WER如表1所示,由于比赛参照指标只有WER,其他指标均作为参考,故本文沿用这个规定。

    从结果可以看出,箭头左侧的系统均为单系统(数据清洗,前后处理,声学模型CNN-TDNN-F-A chain model,2-pass&way 语言模型重打分),检测右侧为多系统融合的结果。可以看到箭头右侧的系统可以带来3-7%个点的绝对WER下降。但遗憾的是,我们没有成功地在比赛关门时间提交Mongolian的系统融合结果,所以被组委会mark为带*号的结果的“0.449”;

    表.1 受限场景下DEV和EVAL集的结果(箭头左侧:单系统;箭头右侧:预训练+多声学模型+数据扩充和清洗+系统融合)

    在受限场景我们没有使用端到端ASR系统。因为在初步的实验中,我们尝试后发现WER高达100%以上,遂放弃了这个方案。但是在随后的非受限系统上,我们发现了端到端系统和hybrid-HMM系统具有很强的互补性;

    我们力求在方案中实现目前工业界采用的从前端到后端行之有效的一整套方案。以上系统证明,我们对于一些带调语种(如Cantonese,Vietnamese)在10小时这个极其挑战性的场景上,可以达到0.60以上的识别率;对于一些拼写式语言,如阿尔泰系,闪含类语系的语言,虽然在WER上只能达到0.40(识别率0.60)左右,但是却并不影响该类语系中,母语掌握着对内容的把控和理解,因为CER可以达到0.30左右(相当于超过0.70的识别成功率);而对于Kurdish,Javanese或者Tamil这样的语言,由于我们并没有进行深入的发音,语法和语言的研究,WER普遍在0.60左右,可以看到,在10小时这个快速冷启动任务上,这些语种依旧任重道远。

    由于比赛语种众多,时间有限,我们没有在所有语种上穷举和细微比较各个方式带来的提升。但初步在Cantonese的实验结果,让我们欣喜得看到这些对低资源语种搭建语音识别系统方法的互补性。

    . 非受限系统

    对于非受限系统,由于时间和精力所限,我们只参加了Cantonese和Mongolian两种语言。系统主体声学,词典和语言模型和受限系统基本保持一致,但是在该场景下,由于可以用到在公开渠道获取的16khz语音识别数据,于是在本节我们着重讲述端到端语音识别训练,混合带宽识别模型,对于语言相关问题的优化以及端到端和hybrid-hmm系统混合四部分额外的技术细节。

    2.1 语音预训练

    在非受限场景,由于可以用到其他外部数据。但我们发现使用过多信道不匹配的外部数据,尤其是非对话类新闻数据,反而在预训练上对性能是有损的。由于1.1节所述,语音预训练是语言不相关的。在我们的实验中,不同于受限条件,所有LDC官方提供的25个IARPA babel训练数据均用于训练跨语种特征以表示编码层,用于迁移到不同的下游任务;

    2.2 端到端系统

    我们在比赛中使用的e2e系统基于近期google在2020年底提出的conformer模型。作为transformer模型的一种,conformer也同样由编码器和解码器两部分组成,但编码器不同的是,conformer模型由一个卷积下采样层和若干个conformer模块组成,每个conformer模块类似transformer模块,但其构成分为四部分:前向模块(FNN),自注意力模块(SAN),卷积模块(CNN)和最后一个FNN,解码器则和transformer保持一致。我们在汉语小规模的ai shell测试集上显示,conformer模型和spec aug结合,可以超越transformer,cnn+transformer和常见的端到端CTC, LAS,和RNN-T等模型。

    表2. 不同端到端系统在ai shell dev和测试集上我们测得的表现(使用ai shell训练数据)

    在此基础上我们做了如下修改:

    • Rpe+XL transformer: 使用了相对位置编码(修复了识别语句过长时带来的重复和网络不稳定现象);

    • Fl: 使用focal loss解决训练对话中出现token不均衡的问题;

    • Ss: 使用schedule sampling解决训练和推理不一致问题;

    如图6所示,我们改进后的conformer block如下,我们对原始文章中的encoder BLOCK进行了简化,发现性能基本没有变化。其次,摒弃了编码器的绝对位置编码,而采用了相对位置编码(Rpe)下的Transormer-XL结构。编码器和解码器层数为12和6,编码器和解码器的维数为2048,其中attention模块有4个头,每个头256个单元。

    图. 6  改进的conformer端到端系统

    2.3 混合带宽训练

    在Cantonese和Mongolian两个语种上,我们均可以从各类公开渠道获取到各类语音识别16khz采样率的标注数据。不幸的是,大部分OPENASR的测试场景都是8khz采样率下的PSTN信道场景。对于这类场景,公开渠道的获取率为0。为此,为了能够利用16khz数据,我们首先在0-4khz,4-8khz挖掘不同的声学频带刻度的滤波器组[22],使得两者尽量不混叠。

    对于16hz采样率的语音识别数据,我们分别从这两个区域的频带刻度中提取滤波器对应的频谱特征,而对于8khz采样率的语音识别数据,则在高频带区域采用Spectral Band Replication(SBR)进行填充,采用相同方法在两个频带区域进行特征提取。在EVAL集识别阶段,由于宽窄带数据并存,我们对所有数据均升采样并做SBR到16khz,利用上述multi-band混合带宽识别器进行识别,如图所示。

    图. 7 混合带宽识别模型

    对于Cantonese非受限场景,我们选取了Speech Ocean和Huiting Tech两个公司的数据2000小时[23][24]以及140小时IARPA Babel包里的窄带数据;而对于Cyrillic Mongolian非受限场景,我们只能获取Mozilla的Common Voice项目中发布的10h语音,和IARPA Babel包里的50h语音。尽管如此,我们坚信国内的Inner Mongolian语只是发音变异和书写差异,但同样可以对Cyrillic Mongolian的识别起到帮助作用。

    所以,我们引入了Speech Ocean的500h听写数据和清华大学M2ASR项目的100h听写数据,旨在通过训练Traditional(回鹘)到Cyrillic (西里尔) Mongolian 的变异转换系统,使得两者可以兼容,具体非受限数据的引入情况描述见表3:

    表. 3 非受限数据来源情况

    为保证测试统一,所有语音识别数据的发音词典均由IARPA Babel提供,如图8所示,我们提交的系统是一套三路融合方案。为了保证Babel数据的原始性,第一路采用Babel窄带对应语种数据训练得到的chain model(LF-MMI),第二路则使用所有8k+16k混合带宽数据按照上述方法进行混合带宽滤波器提取和声学模型训练,随后在SBR后的Babel对应语种数据上进行权重迁移学习;第三路则使用所有8k+16k混合带宽数据按照上述方法进行改进的conformer e2e模型训练,随后在SBR后的Babel对应语种数据上进行相同的权重迁移学习,在解码阶段对输入语音生成对齐的CTM(NIST格式,可以理解为带时间戳和置信度的ASR输出结果)结果。

    由于第一路和第二路均采用hybrid-hmm系统,这类架构对对于输入语音生成lattice后进行重打分操作,故结果可以使用lattice combine进行融合[30],融合后得到的lattice经过时间对齐生成CTM结果,再和第三路e2e系统的CTM结果进行ROVER融合[10];从最后的实验结果来看,这三路系统有很强的互补性。

    图. 8  三路模型和解码融合策略(一路窄带模型,一路宽窄带hybrid-HMM模型,一路宽窄带e2e模型)

    2.4 非受限语言模型

    对于非受限场景,通过网络爬取可以很轻易获取大量文本数据。但是,我们发现这些爬取数据并没有太大作用,主要还是源于和测试对话内容环境差异。对于非受限场景的语言模型,我们采用了数据选取的方法,从大量的单语文本数据中获取与测试集和训练集相似的样例,以此来提高语言模型性能或训练解码的效率。

    首先,我们采用了UER-Bert来作为我们的模型,并将评测方给到的官方训练数据以及爬取的大量单语数据作为预训练数据,并考虑到该数据选取任务不涉及句子间上下文,故放弃NSP(Next Sentence Prediction)目标,只进行MLM(Masked Language Model)模型的预训练。

    其次,从大量单语数据中随机选取与官方训练集同等量级的单语数据作为负样例,将官方训练集作为正样例训练,基于已训练好的预训练模型进一步训练领域分类模型,通过若干次迭代,可使模型性能收敛。

    最后,利用训练好的分类模型对整个单语数据进行分类,筛选出与官方数据相似的数据。数据选取模型结构及流程如图9所示:

    图. 9 非受限语言模型脚本的选取和训练

    2.5 针对语言的优化

    Cantonese属于汉藏语系的一个分支,由于Cantonese的口语对话的写法至今仍然比较稀缺和不规范,我们通过网络爬取获得额外的文本数据,并且通过训练正规化模型取修改训练数据中常见的简写,错写等问题。

    由于比赛评价结果采用WER,但端到端系统由于采用character建模,需要在输出结果前进行一次文本切分处理,且hybird系统中训练语言模型也需要Cantonese分词文本数据。我们使用所有爬取文本和Babel提供的分词文本数据,在自研Bert跨语种预训练UER(https://github.com/dbiir/UER-py)框架下,训练了一套分词模型。

    首先利用Mandarin和Cantonese单语文本数据训练多语言编码器,该编码器具备同时编码Cantonese和Mandarin的能力;然后在该预训练模型基础上,利用Mandarin分词数据训练一个分词系统,最后利用Babel Cantonese训练集里文本分词数据对该分词模型进行finetune,得到最终的Cantonese分词模型。

    该分词模型不仅对e2e的结果进行Babel词典矫正,同时可以指导系统做出更好的语言模型。如下图所示,我们对外网爬取的文本数据和Babel Cantonese 本身的文本进行分词,并进行错写和简写修复,训练两个Cantonese n-gram语言模型,最终的模型由二者插值得到。

    图. 10 分词模型在语言模型训练中的应用

    Mongolian是一个典型的黏着语系(agglutinative)语言,它非常依赖于词根和词缀去在不同的领域和语境下表达意思。首先,我们先找到不在词典里的语音识别抄本中词汇,确定是否属于词的前缀或者后缀。

    举例如下,在"Алтайг- Алтайгаас"这个case中, "Алтайг" 是“Алтайгаас”的前缀,但"Алтайгаас"在发音词典里是找不到的。通过该方法,寻找外部Mongolian的发音词典和对应音标和Babel的映射,我们扩充了30多个常用词汇进入到发音词典中去。有效减少了声学训练OOV的概率。

    众所周知,Mongolian语族的西里尔(发音归类为Halh)和回鹘语(发音归类为Chakhar),虽然写法不同,但是彼此之间可以互相听懂大概意思。此次OPENASR的比赛数据为Halh Mongolian。但我们使用了600h外部Chakhar Mongolian籍此希望解决Halh Mongolian数据稀缺的问题。

    尽管Halh Mongolian通过西里尔(Cyrillic)形式进行书写,Chakhar Mongolian通过回鹘(Traditional)形式进行书写。除了文本之外,两者在音素种类,发音特性上也不尽相同。所以,在声学模型训练上,我们首先在非受限数据上训练Chakhar Mongolian声学模型,再在比赛的Halh Mongolian数据上替换soft-max输出层,进行迁移学习。初步实验来看,这种口音迁移方法对于10h 下的Halh Mongolian有显著提升,WER相对基线下降相对15%左右。

    图. 10 Cyrillic (左侧)和 Traditional (右侧)两种书写形式

    对于语言模型,我们通过训练Traditional Mongolian到Cyrillic Mongolian的seq2seq模型映射,来解决Cyrillic Mongolian数据不足的问题,我们首先通过正向和反向爬取的方式获取了相对高质量的少量Traditional Mongolian与Cyrillic Mongolian的映射词对来作为训练数据,并以该数据来训练初始GNMT模型。

    在此模型基础上,我们又通过反向翻译、预训练、微调以及增加残差连接等方式进一步提高模型性能,结果显示语言转换的CER为7.5%。尽管如此,由于Mongolian的控制符问题始终为一个没有解决的规范化问题,在转换后的Cyrillic文字中,依然存在很多错误。在我们的实验中,通过seq2seq转换得到的语言模型,可以在Mongolian非受限场景提供0.02-0.05的绝对WER下降;

    图. 11 Traditional Mongolian到Cyrillic Mongolian转换系统的构建

    2.6 系统融合

    对于2.3版本的三路系统结果,我们进行了不同系统的增强实验,系统1,2为hybrid-HMM的chain model,其中前者为8k模型,后者为混入非受限数据的混合带宽(multi-band)模型,可以看到外部数据和高频带信息的引入,WER可以从0.431降低到0.410。同时,在非受限场景下的e2e混合带宽模型可以在单系统上可以达到最好的性能0.386。

    系统1,2在lattice combine后可以获得0.404的WER结果,有1-2%的绝对提升,说明非受限数据和Babel存在较强互补,1-2融合后生成1-best和3的1-best在ROVER上的融合结果可以看到,端到端系统和hybrid-HMM的互补性最高,使得整体WER从0.386降低到0.370。

    通过识别结果后处理,WER可以进一步从0.370降低到0.361。

    表. 4 系统融合结果

    2.7 非受限系统评估集结果

    在非受限场景上的比赛结果见表5,可以看到通过NIST官方打分系统的结果,比我们内侧的结果要好一些(WER从0.361到0.335),经过检查,原来是因为我们将输出的非语言现象,如miscues, 停顿,呼吸,咳嗽等的输出都算做了插入错误,而比赛官方则对这些现象不予统计。

    表. 5  非受限场景比赛结果

    可以看到,通过引入外部数据,在Cantonese等语种上我们可以实现7%-8%的WER下降,虽然WER仍然未突破0.300,但从CER来看已经在0.300以下了(0.264)。实际上,汉藏语系,如Mandarian, Cantonese等语言,对于系统评价更加看重和依赖CER,而WER则非常受限于分词的结果,分词导致错误会严重低估系统真实性能,如下图中的例子:

    图. 12 Cantonese WER错误但CER正确的结果举例

    在比赛关门时间我们没有及时提交非受限Mongolian系统,所以0.406其实没有经过系统融合,预估如果提交和Cantonese一样的系统方案,WER可能会低于0.400。同样的,对于闪含语系,阿尔泰语系来说,同一个单词的不同前后缀都算作正确,该类语言对于单词拼写并没有特别严格的规范,也不影响母语人群对意思的理解。所以我们也认为,WER体系会低估该类语言的评估结果。

    展望未来

    小语种和方言有所不同。小语种本质上是一门独立的语言,有独立且完备的发音体系、书写方式及语法现象。对于方言(Dialect)的界定则不像小语种那么清晰,一般认为是因地理差异形成的语言变体。比方言再低一个层次的语言变化称为口音(Accent)。我们在本次OPENASR中尝试的一些小语种语音识别技术,同样可用于改进在低资源环境下,对方言和口音的识别。该技术在腾讯出海内容智能交流,不同语言之间的信息理解,语音内容的翻译上都会产生巨大价值。相信在小语种语音技术的推动下,未来人类的巴别塔之路,将变得不再遥远。

    致谢

    感谢腾讯犀牛鸟基金和TEG AI开源协同项目对本次评测的支持。

    感谢大型中文预训练框架UER的支持(https://github.com/dbiir/UER-py)

    感谢AI LAB的Jimzheng, Cweng,TEG AI语音开源协同专家damonju,对本次评测中的指导和帮助。

    参考文献

    [1] D. Povey, V. Peddinti, D. Galvez, P. Ghahremani, V. Manohar, X. Na,Y.Wang, and S. Khudanpur, “Purely sequence-trained neural networksfor ASR based on lattice-free MMI,” in Interspeech. San Francisco, CA,USA: ISCA, Sep 2016, pp. 2751–2755.

    [2] D. Povey, H. Hadian, P. Ghahremani et al., “A time-restricted self attention layer for ASR,” in proc. ICASSP. Calgary, AB, Canada: IEEE,Apr. 2018, pp. 5874–5878.

    [3] D. Povey, G. Cheng, Y. Wang, K. Li, H. Xu, M. Yarmohammadi, and S. Khudanpur, “Semi-orthogonal low-rank matrix factorization for deepneural networks.” in Interspeech, 2018, pp. 3743–3747.

    [4] T. Ko, V. Peddinti, D. Povey, and S. Khudanpur, “Audio augmentationfor speech recognition,” in INTERSPEECH. Dresden, Germany: ISCA,Sep 2015, pp. 3586–3589.

    [5] D. S. Park, W. Chan, Y. Zhang et al., “SpecAugment: A simple data augmentation method for automatic speech recognition,” in proc.interspeech, Graz, Austria, Sep. 2019, pp. 2613–2617.

    [6] E. Kharitonov, M. Rivi`ere, G. Synnaeve, L. Wolf, P. Mazar´e, M. Douze,and E. Dupoux, “Data augmenting contrastive learning of speechrepresentations in the time domain,” CoRR, vol. abs/2007.00991, 2020.

    [7] Tom Ko, Vijayaditya Peddinti, Daniel Povey, Michael L. Seltzer and Sanjeev Khudanpur, A study on data augmentation of reverberant speech for robust speech recognition, ICASSP 2017

    [8] A. Stolcke, “SRILM - an extensible language modeling toolkit,” in proc.ICSLP - interspeech, Denver, Colorado, USA, Sep. 2002.

    [9] https://www.iarpa.gov/index.php/research-programs/babel

    [10] J. G. Fiscus, “A post-processing system to yield reduced word error rates:Recognizer output voting error reduction (rover),” in 1997 IEEEWorkshop on Automatic Speech Recognition and Understanding Proceedings. IEEE, 1997, pp. 347–354.

    [11] O. Abdel-Hamid, A. Mohamed, H. Jiang, and G. Penn, “Applyingconvolutional neural networks concepts to hybrid NN-HMM model for

    speech recognition,” in ICASSP. Kyoto, Japan: IEEE, Mar 2012, pp. 4277–4280.

    [12] A. Georgescu, H. Cucu, and C. Burileanu, “Kaldi-based DNN architectures for speech recognition in romanian,” in SpeD. Timisoara,Romania: IEEE, Oct 2019, pp. 1–6.

    [13] A. Vaswani, N. Shazeer, N. Parmar et al., “Attention is all you need,” in Advances in Neural Information Processing Systems 30: NIPS, LongBeach, CA, USA, Dec. 2017, pp. 5998–6008.

    [14] G. Saon, H. Soltau, D. Nahamoo, and M. Picheny, “Speaker adaptation of neural network acoustic models using i-vectors,” in 2013 IEEEWorkshop on Automatic Speech Recognition and Understanding. IEEE, 2013, pp. 55–59.

    [15] X. Liu, Y. Wang, X. Chen, M. J. Gales, and P. C. Woodland, “Efficientlattice rescoring using recurrent neural network language models,” in2014 IEEE International Conference on Acoustics, Speech and SignalProcessing (ICASSP). IEEE, 2014, pp. 4908–4912.

    [16] G.-B. Wang and W.-Q. Zhang, “A fusion model for robust voice activitydetection,” in 2019 IEEE International Symposium on Signal Processingand Information Technology (ISSPIT). IEEE, 2019, pp. 1–5.

    [17] The JHU ASR system for VOiCES from a Distance challenge 2019", Yiming Wang, David Snyder, Hainan Xu, Vimal Manohar, Phani Shankar Nidadavolu, Daniel Povey, Sanjeev Khudanpur, Interspeech 2019

    [18] Zhang S, Liu C, Jiang H, et al. Non-recurrent Neural Structure for Long-Term Dependency[J]. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2017, 25(4): 871-884

    [19] Haşim Sak, Andrew Senior, Françoise Beaufays, Long Short-TermMemory Based Recurrent Neural Network Architectures for LargeVocabulary Speech Recognition, INTERSPEECH, 2014

    [20] Andy T. Liu, Shang-Wen Li and Hung-yi Lee. TERA: Self-SupervisedLearning of Transformer Encoder Representation for Speech. ArXiv,2007.06028

    [21] H. Xu, T. Chen, D. Gao, Y. Wang, K. Li, N. Goel, Y. Carmiel, D. Povey,and S. Khudanpur, “A pruned rnnlm lattice-rescoring algorithm for automatic speech recognition,” in 2018 IEEE International Conference onAcoustics, Speech and Signal Processing (ICASSP). IEEE, 2018, pp. 5929–5933.

    [22] Jinyu Li, Dong Yu, Jui-Ting Huang, Tifan Gong. Improving widebandspeech recognition using mixed-bandwidth training data in CD-DNN-HMM, IEEE Workshop on SLT, 2012

    [23] http://www.speechocean.com/datacenter/details/709.html

    [24] http://www.huitingtech.com/en/dataInfo.action?id=1005

    [25] https://pontoon.mozilla.org/mn/common-voice/project-info/

    [26] http://www.speechocean.com

    [27] Dong wang, et al. M2ASR: Ambitions and first year progress. O-COCOSDA. 2017

    [28] Gulati A, Qin J, Chiu C C, et al. Conformer: Convolution-augmented Transformer for Speech Recognition[J]. arXiv preprint arXiv:2005.08100,2020.

    [29] Zhou P, Fan R, Chen W, et al. Improving Generalization of Transformerfor Speech Recognition with Parallel Schedule Sampling and RelativePositional Embedding[J]. arXiv preprint arXiv:1911.00203, 2019.

    [30] Xu, H., Povey, D., Mangu, L., & Zhu, J. (2010, March). An improvedconsensus-like method for Minimum Bayes Risk decoding and lattice combination. In 2010 IEEE International Conference on Acoustics, Speech and Signal Processing (pp. 4938-4941). IEEE.

    [31] Pegah Ghahremani, et al, A pitch extraction algorithm tuned for automatic speech recognition,ICASSP 2014.

    展开全文
    Tencent_TEG 2021-01-11 18:00:00
  • jILRvRTrc 2020-12-22 17:45:00
  • qq_41672428 2021-01-14 21:48:15
  • tyler_download 2020-12-29 17:21:49
  • qq_18757813 2021-04-27 20:00:31
  • Yangxin0407 2021-05-18 13:55:45
  • weixin_40163266 2021-02-23 01:05:05
  • kxh123456 2021-03-08 14:52:07
  • qq_43711697 2020-12-18 21:49:45
  • weixin_42475780 2021-11-02 21:13:05
  • yasin_huang 2021-01-02 19:30:52
  • lishan132 2021-11-19 19:40:54
  • u013171226 2021-03-24 16:02:09
  • lioe_1995 2021-03-12 19:26:47
  • qq_36071362 2021-11-29 19:06:39
  • qq_37003230 2021-11-09 17:46:50
  • Cxk___ 2021-01-30 15:35:59
  • qq_40962125 2021-11-24 14:17:27
  • weixin_43759518 2021-02-20 12:11:01
  • qq_48639918 2021-08-23 11:36:41
  • qq_40927867 2021-04-01 13:44:44
  • weixin_42498206 2021-01-27 07:55:57
  • weixin_40802676 2021-04-03 10:31:27
  • qq_30121457 2021-01-10 22:14:33
  • hhhhhhhhhhwwwwwwwwww 2021-12-13 14:34:31
  • red_stone1 2021-05-31 18:40:42
  • weixin_44766799 2021-11-01 10:25:05

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 732,431
精华内容 292,972
关键字:

如何训练数据