深入理解TDNN(Time Delay Neural Network)——兼谈x-vector网络结构

news2024/9/22 1:41:33

概述

  • TDNN(Time Delay Neural Network,时延神经网络)是用于处理序列数据的,比如:一段语音、一段文本
  • 将TDNN和统计池化(Statistics Pooling)结合起来,正如x-vector的网络结构,可以处理任意长度的序列
  • TDNN出自Phoneme recognition using time-delay neural networks
  • x-vector出自X-Vectors: Robust DNN Embeddings for Speaker Recognition
  • 此外,TDNN还演化成了ECAPA-TDNN,而ECAPA-TDNN则是当前说话人识别领域,在VoxCeleb1数据集的三个测试集VoxCeleb1 (cleaned)、VoxCeleb1-H (cleaned)、VoxCeleb1-E (cleaned)上的最强模型,因此学习TDNN还是很有必要的

x-vector的网络结构

  • x-vector是用于文本无关的说话人识别的,因此需要处理任意长度的序列,其网络结构如下图所示:
    在这里插入图片描述
  • 上图的迷惑性其实非常大,有必要好好讲解一下,现在我给出从frame1到frame4层(frame5与frame4本质上是一样的,只不过卷积核数量不同)的可视化结果
    在这里插入图片描述
  • 输入:每个特征图表示一帧,特征图的通道数为24,表示一帧的特征数(原文是24维fbank特征),特征图的分辨率是1,在这里需要明确:语音是1维数据,因此特征图并不是二维图,而是一个值,24个特征图堆叠起来构成24维fbank特征
  • frame1
    • frame1的特征图经过1维卷积得到,卷积核大小 i n c h a n n e l s × k e r n e l s i z e × o u t c h a n n e l s = 24 × 5 × 512 inchannels \times kernelsize \times outchannels=24\times5\times512 inchannels×kernelsize×outchannels=24×5×512
    • frame1的每个特征图下面连接的5条线,表示卷积核。这5条线不是5根细线,而是5根麻花线,每根麻花线由 i n c h a n n e l s = 24 inchannels=24 inchannels=24根细线组成,每根细线连接一个特征。每根细线的权重都是一样的,每根麻花线的权重不一样
      在这里插入图片描述
    • k e r n e l s i z e = 5 kernelsize=5 kernelsize=5,对应闭区间 [ t − 2 , t + 2 ] [t-2,t+2] [t2,t+2]一共5帧的上下文,也可以表示为 { t − 2 , t − 1 , t , t + 1 , t + 2 } \left \{ t-2,t-1,t,t+1,t+2 \right \} {t2,t1,t,t+1,t+2},之所以表格说frame1的输入是120,是因为将5帧上下文的特征都计算进去了 5 × 24 = 120 5\times24=120 5×24=120
    • o u t c h a n n e l s = 512 outchannels=512 outchannels=512,表示卷积核的厚度是512,可以理解为5根麻花线堆叠了512次,每次堆叠都得到新的5根麻花线,都符合“每根细线的权重都是一样的,每根麻花线的权重不一样”。5根麻花线同时运算,得到一个值,从而frame1的每个特征图其实也是一个值,且通道数为512,对应表格中的frame1的输出是512
  • frame2
    • frame2的特征图经过1维膨胀卷积得到,卷积核大小 i n c h a n n e l s × k e r n e l s i z e × o u t c h a n n e l s = 512 × 3 × 512 inchannels \times kernelsize \times outchannels=512\times3\times512 inchannels×kernelsize×outchannels=512×3×512
    • 不要被膨胀卷积吓到了,膨胀卷积的 k e r n e l s i z e = 3 kernelsize=3 kernelsize=3,表示3根麻花线中,第2根麻花线连接第t帧,第1根麻花线连接第t-2帧,第3根麻花线连接第t+2帧,对应表格中的 { t − 2 , t , t + 2 } \left \{ t-2,t,t+2 \right \} {t2,t,t+2}共3帧的上下文,这就是膨胀卷积和标准卷积的不同之处,隔帧连接
    • 在PyTorch中,1维卷积的api为
      t o r c h . n n . C o n v 1 d ( i n c h a n n e l s , o u t c h a n n e l s , k e r n e l s i z e , s t r i d e = 1 , p a d d i n g = 0 , d i l a t i o n = 1 , g r o u p s = 1 , b i a s = T r u e , p a d d i n g m o d e = ′ z e r o s ′ , d e v i c e = N o n e , d t y p e = N o n e ) torch.nn.Conv1d(inchannels, outchannels, kernelsize, stride=1, padding=0, dilation=1, groups=1, bias=True, paddingmode='zeros', device=None, dtype=None) torch.nn.Conv1d(inchannels,outchannels,kernelsize,stride=1,padding=0,dilation=1,groups=1,bias=True,paddingmode=zeros,device=None,dtype=None)
      其中, d i l a t i o n = 1 dilation=1 dilation=1表示标准卷积,frame2的膨胀卷积需要设置 d i l a t i o n = 2 dilation=2 dilation=2
    • 在这里我们也发现一点:TDNN其实是卷积的前身,后世提出的膨胀卷积,在TDNN里已经有了雏形,只不过TDNN是用于1维数据的
  • frame3、frame4没有引进新的运算。frame3需要设置 d i l a t i o n = 3 dilation=3 dilation=3,而frame4的卷积核大小 i n c h a n n e l s × k e r n e l s i z e × o u t c h a n n e l s = 512 × 1 × 512 inchannels \times kernelsize \times outchannels=512\times1\times512 inchannels×kernelsize×outchannels=512×1×512,因为 k e r n e l s i z e = 1 kernelsize=1 kernelsize=1,所以与MLP(dense layer)没有本质区别,卷积核通过在每一帧上移动,实现全连接,因此可以看到有些代码实现用 k e r n e l s i z e = 1 kernelsize=1 kernelsize=1的卷积替代全连接
  • 从frame1到frame5,每次卷积的步长 s t r i d e stride stride都等于1,从而对每一帧都有对应的输出,也就是说,对于任意长度的帧序列,frame5的输出也是一个同等长度的序列,长度记为 T T T,而由于frame5的 o u t c h a n n e l s = 1500 outchannels=1500 outchannels=1500,所以表格中统计池化的输入是 1500 × T 1500 \times T 1500×T
  • 统计池化的原理颇为简单,本质是在序列长度 T T T这一维度求均值和标准差,然后将均值和标准差串联(concatenate)起来,所以池化后,序列长度 T T T这一维度消失了,得到了 1500 1500 1500个均值和 1500 1500 1500个标准差,串联起来就是长度为 3000 3000 3000的向量
  • segment6、segment7和Softmax都是标准的MLP,不再赘述
  • 最后segment6输出的 512 512 512长度的向量,被称为x-vector,用于训练一个PLDA模型,进行说话人识别,可以计算一下,提取x-vector所需的参数
    f r a m e 1 + f r a m e 2 + f r a m e 3 + f r a m e 4 + f r a m e 5 + s e g m e n t 6 = 120 × 512 + 1536 × 512 + 1536 × 512 + 512 × 512 + 512 × 1500 + 3000 × 512 = 420 , 0448 \begin{aligned} &frame1+frame2+frame3+frame4+frame5+segment6 \\ =&120 \times 512 + 1536 \times 512 + 1536 \times 512 + 512 \times 512 + 512 \times 1500 + 3000 \times 512 \\ =&420,0448 \end{aligned} ==frame1+frame2+frame3+frame4+frame5+segment6120×512+1536×512+1536×512+512×512+512×1500+3000×512420,0448
  • 参数量并不能代表计算量,因为输入网络的是任意长度的帧序列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

x86_64架构的VINS-fusion-GPU部署

x86_64架构的VINS-fusion-GPU部署 1. 环境配置(Ubuntu 18.04) (0)CUDA 10.2 安装 由于笔记本的GPU太老(GeForce 840M),只能使用较低版本的 CUDA,但是也能有个好处就是能够同时兼顾…

Linux TCP 拥塞正反馈 bad case

前置知识,TCP thin stream,参见: 该文档中搜索 tcp_thin_linear_timeoutsTCP-thin-stream 看图说话: 参见 tcp_retransmit_timer 函数,着重看下面段落: if (sk->sk_state TCP_ESTABLISHED &&am…

视觉SLAM学习路线

导师让我了解SLAM,SLAM原本是比较小众的方向,最近自动驾驶火起来,做这个SLAM的人也多了,反过来也会推动机器人感知的发展。希望未来学成的时候,能赶上机器人大规模普及,就业一片蓝海。学SLAM方向跟motion p…

RabbitMQ延迟列队的使用

目录 1. 延迟队列使用场景 2. RabbitMQ中的延迟队列实现思路 3. 实现示例 3。运行项目测试 1. 延迟队列使用场景 延迟队列一般可用于具有时间限制的任务,例如:限时优惠,超时的订单处理等。 对于这种场景,传统的处理方式是任…

Ceph: ceph基础知识

ceph基础知识 一、基础概念 ceph官方文档 http://docs.ceph.org.cn/ ceph中文开源社区 http://ceph.org.cn/ 1、概述 Ceph是可靠的、可扩展的、统一的、开源分布式的存储系统。 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 C…

Python基础知识(一)

目录 输入输出函数 输入函数:input() 输出函数:print() 算术运算符 关系运算符 逻辑运算符 变量 1.命名规则 2.变量类型 3.动态类型特性 输入输出函数 输入函数:input() name input("请输入:") print(nam…

第二证券|北向资金全年净买入约900亿元 哪些行业和个股成“香饽饽”

2022年A股收官。回顾这一年,面临复杂严峻的国内外环境,A股商场推动完善多元融资支撑机制,加大了对实体经济的金融支撑力度,为中国经济V形复苏做出了奉献。这一年,A股IPO融资规划创出历史新高,存量上市公司打…

驱动的并发和竞争

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、什么是并发?并发并行并发并行模式二、什么是竞争三、如何解决竞争1、原子操作整形原子操作:原子位操作2.自旋锁3.信号量4.互斥锁5.如…

mysql批量更新方法

mysql批量更新方法 实验mysql版本为5.7.20 隔离级别为rr,加锁场景的问题在mysql8.0.18中为复现 方法一 replace into 批量更新 原理:replace into table (col1,col2) values (x1,x2), 操作本质是对重复的记录先delete 后insert 缺点:1、如…

特斯拉Model S及Model X 2023上半年交付,1月6日公布售价

特斯拉Model S及Model X终于快要交付了。 2022年12月30日,广州国际车展盛大开幕。众多车企带来了旗舰车型,让观众直呼太过瘾,其中,人流量爆火的莫过于特斯拉展台。此次,特斯拉携旗下S3XY家族重磅出击,全新车…

【C++基础】08:模板

模板 OVERVIEW模板一、函数模板1.func template基本使用:2.func template案例:数组排序3.函数与函数模板的区别&调用规则:4.func template的局限性:二、类模板1.类模板基本使用:2.类模板与函数模板的区别&#xff…

AOA估计中的MUSIC算法(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 随着阵列信号处理技术的不断发展,到达角估计(Angle Of Arrival)的研究在移动通信系统中具有重要意义。通过分析经典MUSIC算法,…

golang 自定义命令行flag包简单使用

一、为什么需要使用golang自定义命令行 不恰当的比喻,当我们写了一个服务代码后,按照简单的思维,我们会在业务代码中将要连接的数据库 用户名、主机名、端口号、密码写死。 那么也就意味着我们启动该服务后都只能固定连接某一个数据库&#x…

etcd快速入门

etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。 etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。 etcd作为服务发现系统,有以下的特点: 1.简单&#…

分享67个PHP源码,总有一款适合您

链接:https://pan.baidu.com/s/1MzKN0bLDRv0i290R2erMHQ?pwdbo2i 提取码:bo2i PHP源码 分享67个PHP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载…

寒假每日一题W1D3——上课睡觉

题目描述 有 N 堆石子,每堆的石子数量分别为 a1,a2,…,aN。 你可以对石子堆进行合并操作,将两个相邻的石子堆合并为一个石子堆,例如,如果 a[1,2,3,4,5],合并第 2,3 堆石子,则石子堆集合变为 a[1,5,4,5]。…

【学习】backdoor attacks、Adversarial Attack on Images、Adversarial Attack on Audio

文章目录一、后门攻击backdoor attacks1、data poisoning2、backdoored PLM3、defenseONION4、后门攻击:绕过ONION防御5、摘要二、Adversarial Attack on Imagesone pixel attackdifferential evolution三、Adversarial Attack on Audio一、后门攻击backdoor attacks 什么是后…

进程的终止和等待

目录 进程终止 如何获取退出码呢? 进程退出方法有哪些? 对于进程退出,内核OS做了什么? 进程等待 为什么要进行进程等待? 如何进行进程等待? 什么是阻塞和非阻塞等待? 进程终止 对于进程…

飞依诺冲刺科创板上市:上半年出现亏损,因商业秘密纠纷被起诉

近日,飞依诺科技股份有限公司(下称“飞依诺”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺上市,飞依诺计划募资11.22亿元,将用于生产基地升级项目、新产品研发与总部基地建设项目、营销网络建设…

【Linux】一文掌握Linux基本指令(下)

本章命令大致总结命令功能cat打印文件内容echo打印文件内容> 输出重定向 >>追加重定向< 输入重定向 more 查看文本内容 less等价于morehead打印文本前n行tail 打印文本后n行 |管道date时间相关cal日历sort文本排序uniq相邻文本降重zip打包压缩unzip解包tar打包/解包…