【问题标题】:How to implement time-distributed dense (TDD) layer in PyTorch如何在 PyTorch 中实现时间分布密集(TDD)层
【发布时间】:2021-01-20 18:33:33
【问题描述】:

在一些分析时间数据(例如音频或视频)的深度学习模型中,我们使用“时间分布密集”(TDD) 层。这将创建一个完全连接(密集)的层,该层分别应用于每个时间步。

在 Keras 中,这可以使用TimeDistributed wrapper 来完成,这实际上更通用一些。在 PyTorch 中,an open feature request 已经好几年了。

我们如何在 PyTorch 中手动实现时间分布密集

【问题讨论】:

    标签: deep-learning pytorch


    【解决方案1】:

    特别是对于时间分布密集(而不是时间分布其他任何东西),我们可以使用卷积层来破解它。

    查看您展示的 TDD 层图表。我们可以将其重新想象为一个卷积层,其中卷积核的“宽度”(在时间上)恰好为 1,并且“高度”与张量的全高相匹配。如果我们这样做,同时确保我们的内核不允许超出张量的边缘,它应该可以工作:

    self.tdd = nn.Conv2d(1, num_of_output_channels, (num_of_input_channels, 1))
    

    您可能需要重新排列张量轴。这行代码的“输入通道”实际上来自张量的“频率”轴(“图像的 y 轴”),“输出通道”确实会排列在“通道”轴上。 (输出的“y 轴”将是高度为 1 的单一维度。)

    【讨论】:

      【解决方案2】:

      正如您提到的discussion 中指出的那样:

      同时,#1935 将使线性层不需要 TimeDistributed/Bottle。

      对于 TDD 层,它会将线性层直接应用于具有时间片的输入。

      In [1]: import torch
      
      In [2]: m = torch.nn.Linear(20, 30)
      
      In [3]: input = torch.randn(128, 5, 20)
      
      In [4]: output = m(input)
      
      In [5]: print(output.size())
      torch.Size([128, 5, 30])
      

      以下是计算结果的简短说明

      In [1]: import torch                                                                                                                                                                          
      
      In [2]: m = torch.nn.Linear(2, 3, bias=False) 
         ...:  
         ...: for name, param in m.named_parameters(): 
         ...:     print(name) 
         ...:     print(param) 
         ...:                                                                                                                                                                                       
      weight
      Parameter containing:
      tensor([[-0.3713, -0.1113],
              [ 0.2938,  0.4709],
              [ 0.2791,  0.5355]], requires_grad=True)
      
      In [3]: input = torch.stack([torch.ones(3, 2), 2 * torch.ones(3, 2)], dim=0) 
         ...: print(input)                                                                                                                                                                          
      tensor([[[1., 1.],
               [1., 1.],
               [1., 1.]],
      
              [[2., 2.],
               [2., 2.],
               [2., 2.]]])
      
      In [4]: m(input)                                                                                                                                                                              
      Out[4]: 
      tensor([[[-0.4826,  0.7647,  0.8145],
               [-0.4826,  0.7647,  0.8145],
               [-0.4826,  0.7647,  0.8145]],
      
              [[-0.9652,  1.5294,  1.6291],
               [-0.9652,  1.5294,  1.6291],
               [-0.9652,  1.5294,  1.6291]]], grad_fn=<UnsafeViewBackward>)
      

      更多nn.Linear的操作细节可以看torch.matmul。请注意,您可能需要添加另一个非线性函数,如 torch.tanh() 以获得与 Keras 中的 Dense() 完全相同的层,其中它们支持关键字参数 activation='tanh' 等非线性。

      对于时间分布,例如 CNN 层,PyTorch forum 中的 sn-p 可能有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-24
        • 1970-01-01
        • 2019-08-20
        • 2010-11-06
        • 2021-03-24
        • 2022-08-08
        • 1970-01-01
        • 2021-08-03
        相关资源
        最近更新 更多