wave-u-net:端到端(end-to-end)音源分离 1806

https://arxiv.org/pdf/1806.03185.pdf

文章目录

  • 一、ABSTRACT
  • 二、INTRODUCTION
  • 三、RELATED WORK
  • 四、WAVE-U-NET
    • 1.避免由于上采样造成aliasing artifact(扭曲 具有人工伪造的痕迹=>嗡嗡的杂音?)
    • 2.体系结构的改进
      • Difference output layer(差分输出层)
      • Prediction with proper input context & resampling(适当的上下文输入和重采样)
      • 立体声通道
      • Wave-U-Net的Learned upsampling
  • 五、总结
  • 六、问题
  • 七、代码
  • 参考博文

一、ABSTRACT

忽略了相位信息,性能依赖于频谱前端的超参数(hyper-parameters for the spectral front-end)。
Wave-u-net将u-net适应于一维时域的方法,通过重复对特征图重采样来计算和组合不同时间尺度的特征。
由(enforces source additivity)输出层、上采样、上下文感知的框架,减少输出。

二、INTRODUCTION

现有的方法:将信号(复值谱图)进行傅里叶变换(STFT)后分为振幅和相位,将振幅输入模型,将返回的估计的振幅与相位结合,逆傅里叶变换转换回时域。相位可以用Griffin-Lim算法恢复
现有方法的局限:音频帧的大小和重叠会影响STFT的输出,理想情况下,应该将每帧的大小和重叠情况加入模型训练,而且估计源时会忽略混合相位
解决:将模型直接作用于时域,但还不清楚是否有很长的时间依赖性,以及对噪声是否有效
特点:是u-net的一维适配,直接在时域分离,考虑很大的上下文;为模型提供额外的上下文输入;用线性插值后的普通卷积替换strided transposed convolution used in previous work for upsampling feature maps

三、RELATED WORK

使用adaptive front-end for spectrogram computation减轻以前的fixed spectral representaions(固定的光谱表示)问题。
只有TasNet【12】和MRCAE【4】使用了时域分离:TasNet将信号分解为一组信号和权重,在权重上创建掩码(Mask)最后根据掩码的结果重新构建权重,该模式适合实时任务;MR-CAE用两层正卷积、两层反卷积,使用不同的卷积核大小以用不同的分辨率检测音频频率,输入输出少所以利用了较少的上下文信息。
新开发了SEGAN,带有编码解码的神经网络,在编解码层之间使用features skip connections,使用跨步反卷积时纠正了生成输出中的混叠问题,没有额外输入上下文,预测差需要padding。
我们将之前工作中对特征图进行向上采样时使用的横纹置换卷积替换为线性插值,然后再进行正常卷积,以避免伪影。

四、WAVE-U-NET

下采样块在更长的时间尺度上计算特征,使用上采样块将这些特征与早期计算的特征结合生成多尺度特征,用于预测。
网络共L级,每级的分辨率是前一个的一半,估计K个源,模型返回的预测在-1到1之间,每个源音频样本返回一个预测。
Cov1D(x,y)为带有x个大小为y的卷积核的1维卷积,包括zero-padding和LeakyReLU激活(最后一个用tanh激活)。每批每隔一段时间会丢一部分feature,将分辨率减半。
上采样层在时间方向上2倍数进行上采样,使用线性插值(如下第一个二级标题)。
Concat(x)将当前高级feature与更多局部feature连接。

1.避免由于上采样造成aliasing artifact(扭曲 具有人工伪造的痕迹=>嗡嗡的杂音?)

使用带步长的反卷积作为上采样会导致aliasing,使用大小为k的filter和步长大于的1的反卷积可以被视为在每个原始值之间用x-1的zeros填充feature map。
我们怀疑是without low-pass filtering的interleaving with zeros(用0插值)将high-frequency patterns引入了feature maps,因此,对上采样层使用linear interpolation(线性插值)来确保连续性,使用normal convolution(正卷积)而不是反卷积。

2.体系结构的改进

下面介绍Wave-U-Net的改进

Difference output layer(差分输出层)

baseline模型用了k convolutional filters (最后一层用tanh 非线性激活),我们用了不同的输出层限制输出,只有大小为1的 k-1 convolutional filters 网络用于最后的特征图(tanh non-linearity)。

Prediction with proper input context & resampling(适当的上下文输入和重采样)

之前的模型是在卷积前用zero进行填充,但一个完整音频的随机位置处的边界信息会变得artificial,上下文的信息被忽略,所以不能将输出简单的连接为non-overlapping segments(非重叠的)。
解决方案:不使用隐式填充的图卷积,而是提供一个比输出大的mixture input,可以利用上下文信息,此外,重采样特征图时,特征维数减半或加倍,这样会导致再次出现artificial,因此只能在已知的邻居值之间插值并且保持最初和最后的entries,确保特征图的维度是奇数(odd dimensionality)以恢复抽取后的中间值同时保证边界值不变。

立体声通道

将输入从M改为 L x 1到 L x C 的矩阵,从第二维开始是一个特征通道,对于东通道输出,将输出分量改为K个独立的卷积层,每个卷积层卷积核filter大小为1,每一个都是C filters,对于差分(difference)输出层只用了K-1个卷积层。

Wave-U-Net的Learned upsampling

线性插值作为上采样简单无参数带有连续性,但对网络容量限制大,因此,提出learned upsampling layer,对于规定的n个时间步长的 F x n 特征映射,我们用sigmoid函数插值,这样可以实现大小为2的F filters的一维卷积,不用padding的线性插值。

五、总结

单纯的用0做padding,不利用上下文信息的采样层会导致artificial,用线性插值比较好。

六、问题

odd dimensionality到底有啥好处
concat如何工作
Difference output layer中的公式

七、代码

官方Pytorch代码

epochs
num_blocks  
filters = 128  
X = Input(shape=(None, mfcc_dim,), dtype='float32')    
def conv1d(inputs, filters, kernel_size, dilation_rate):  
    return Conv1D(filters=filters, kernel_size=kernel_size, strides=1, padding='causal', activation=None, dilation_rate=dilation_rate)(inputs)  
 
def batchnorm(inputs):  
    return BatchNormalization()(inputs)  
def activation(inputs, activation):  
    return Activation(activation)(inputs)  
  
def res_block(inputs, filters, kernel_size, dilation_rate):  
    hf = activation(batchnorm(conv1d(inputs, filters, kernel_size, dilation_rate)), 'tanh')  
    hg = activation(batchnorm(conv1d(inputs, filters, kernel_size, dilation_rate)), 'sigmoid')  
    h0 = Multiply()([hf, hg])  
      
    ha = activation(batchnorm(conv1d(h0, filters, 1, 1)), 'tanh')  
    hs = activation(batchnorm(conv1d(h0, filters, 1, 1)), 'tanh')  
      
    return Add()([ha, inputs]), hs  
  
h0 = activation(batchnorm(conv1d(X, filters, 1, 1)), 'tanh')  
shortcut = []  
for i in range(num_blocks):  
    for r in [1, 2, 4, 8, 16]:  
        h0, s = res_block(h0, filters, 7, r)  
        shortcut.append(s)  
  
h1 = activation(Add()(shortcut), 'relu')  
h1 = activation(batchnorm(conv1d(h1, filters, 1, 1)), 'relu')
h1 = batchnorm(conv1d(h1, num_class, 1, 1))
h1 = GlobalMaxPooling1D()(h1)  
Y = activation(h1, 'softmax')  
  
optimizer = Adam(lr=0.01, clipnorm=5)  
model = Model(inputs=X, outputs=Y)  
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])  
checkpointer = ModelCheckpoint(filepath='fangyan.h5', verbose=0)  
lr_decay = ReduceLROnPlateau(monitor='loss', factor=0.2, patience=1, min_lr=0.000)  


参考博文

卷积核filter和kernal、一维二维图卷积
线性插值
各种激活函数
上下采样
shortcut解决梯度发散(跳跃连接)

你可能感兴趣的:(降噪,python)