【Dual-Path-RNN-Pytorch源码分析】Segmentation

请参考Dual-Path-RNN-Pytorch的网络架构图。 这里我们单独把Segmentation部分拿来分析。 (文件:model_rnn.py

到达Segmentation时,输入的张量维度为[B,N,L], 其中B为Batch Size, N为特征维度, L为特征长度。


主体函数

函数主体如下,输入首先做padding

segmentation

padding

padding函数如下:
padding
该函数主要做两件事

  1. 将最后一维(特征长度)对齐,即如果长度要与P(hop size)的整数倍对齐
  2. 将对齐后张量前后各补长度为P的0

其中gap = K - (P + L % K) % K看着有点云里雾里,它的作用就是计算L的长度与P的奇数倍的差距(gap);如果有gap,就在最后补上,这样做的好处在下一小节再说。

假设输入长度(改为1维图像便于理解)为深蓝色,那么蓝色部分即为补全的gap;对齐后整个长度为**(2n+1)K**,然后两边各有长度为P的padding
在这里插入图片描述

Segmentation

padding后的输入张量最后一维是 (2n+3)P
然后对该张量分别取input[:, :, :- P]和input[:, :, P:],这样每个分割出来的最后一维长度都是 (2n+2)P(n+1)K,
这样将K再单独抽取一维出来,令l=n+1,
i n p u t 1. s h a p e = [ B , N , l , K ] i n p u t 2. s h a p e = [ B , N , l , K ] input1.shape=[B,N,l,K] \newline input2.shape=[B,N,l,K] input1.shape=[B,N,l,K]input2.shape=[B,N,l,K]
这样抽取是什么意义?
论文文献
根据paper中的介绍,这里是分离出chunk,每一个K长度为一个chunk;

再将两部分chunk做合并,即==[B,N,2l,K] ==,这又是什么意思?

原因是这两部分的chunk是差了P取的,所以合并的时候每个chunk变成了2l,但是前后保持了P的hopping。

转置

最后将最后两维转置,目的应该是方便后续的处理.即[B,N,K,2l]
将S=2l,
shape = ==[B,N,K,S] ==

论文配图

我觉得论文里的配图还是挺清晰的,放在这里也同时希望方便大家理解
论文配图

源码部分

下面把源码部分抽取出来,单独测试,

def padding(input, K):
    '''
       padding the audio times
       K: chunks of length
       P: hop size
       input: [B, N, L]
    '''
    B, N, L = input.shape
    P = K // 2

    gap = K - (P + L % K) % K
    print(f'gap={K} - ({P}+{L}%{K})%{K}={gap}')
    if gap > 0:
        pad = torch.Tensor(torch.zeros(B, N, gap)).type(input.type())
        input = torch.cat([input, pad], dim=2)

    _pad = torch.Tensor(torch.zeros(B, N, P)).type(input.type())
    input = torch.cat([_pad, input, _pad], dim=2)

    return input, gap


def Segmentation(input, K):
    '''
       the segmentation stage splits
       K: chunks of length
       P: hop size
       input: [B, N, L]
       output: [B, N, K, S]
    '''
    B, N, L = input.shape
    P = K // 2
    input, gap = padding(input, K)
    print('after padding: input.shape ',input.shape)
    # [B, N, K, S]
    input1 = input[:, :, :-P].contiguous().view(B, N, -1, K)
    print('input[:, :, :-P] shape ', input[:, :, :-P].shape)
    print('input1.shape ',input1.shape)
    input2 = input[:, :, P:].contiguous().view(B, N, -1, K)
    print('input[:, :, P:] shape ', input[:, :, P:].shape)
    print('input2.shape ',input2.shape)
    input = torch.cat([input1, input2], dim=3).view(
        B, N, -1, K).transpose(2, 3)
    print()

    return input.contiguous(), gap


input = torch.linspace(1, 800, 1200).view(1, 10, 120)

K = 200

output, gap = Segmentation(input, K)

print(output.shape, gap)

结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Dual-path RNN (双通道循环神经网络) 是一种深度学习模型,用于处理序列数据,具有两个独立的循环神经网络路径。这种结构允许模型同时学习两个不同方面的特征,然后将它们整合在一起进行最终的预测。 在实现 Dual-path RNN 的代码中,我们首先需要定义两个循环神经网络模块,分别代表两个不同的路径。这些模块通常使用 LSTM(长短期记忆)或 GRU(门控循环单元)等结构,以实现对序列数据的有效建模。 然后,我们需要定义一个整合层,用于将两个路径上的特征进行整合。这个整合层可以是简单的拼接操作,也可以是更为复杂的注意力机制,以便模型能够更好地融合两个路径上的信息。 接下来,我们需要定义模型的前向传播过程。在这个过程中,输入数据会分别经过两个独立的路径,然后传入整合层,最终得到模型的输出。在训练过程中,我们通常会利用反向传播算法来更新模型参数,以最小化预测输出与真实数值之间的差距。 最后,我们需要定义模型的损失函数和优化器,以便在训练过程中能够衡量模型的性能并不断优化模型参数。常见的损失函数可以是均方差损失(mean squared error)或交叉熵损失(cross-entropy loss),而优化器则可以选择 Adam、SGD 等方法。 综上所述,实现 Dual-path RNN 的代码需要定义两个独立的循环神经网络路径、整合层以及模型的前向传播过程、损失函数和优化器。通过有效地组织这些代码,我们可以构建一个能够同时学习多个方面特征的深度学习模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值