DPTNet和Sepformer原理是十分相似的,关键在于
1.两者在Decoder有区别,
2.中间的主要的Sepformer中的transformer构造不同。
整体:
由于都是借鉴的是DPRNN的数据处理过程,都是Encoder+Separation+Decoder。
Encoder:
先通过一维卷积,再激活一下。
Decoder:
基于TasNet,也就是mask方法,所以运用混合声源与mask网络相乘,然后用线性层网络Linear分析出有多少个声源,最后重叠相加,(这是代码的表现)
正常来说,应该是用转置卷积层,处理每一个层,然后用mask相乘,得到单个声源的信号。
分离网络:
先分块,然后LN归一化,放入两个改进过的transformer中:(如下)
然后就是最难解释的地方了:
这里overlap-add后的两个结果再经过一维卷积有什么用呢?得到了两个值,相乘后再激活,就是mask掩码?
看代码的话,感觉知道他怎么做的,但是不知道这样做为什么?
反正看代码,感觉比看论文好一些。
对于分割块部分的操作:
分两个步骤,没有单独的代码,放到卷积层里面,捎带着就给分离出来了
1.先把[N*L]在中间加入一个维度的信息,变成[N,1,L]。
2.然后通过卷积层,定义相应的参数(主要是卷积通道和步长之类的),把1——>2P,把L——>S。
下面是我对于代码里面的解释:
mixture_w=F.relu(self.conv1d_U(mixture))#[B,N,L]
DPTNet也是经过分割的,然后得出是[B,N,L]
代码里面的 图解里面的
B N
N 2P
L S