【问题标题】:Different filters for 2d convolution用于 2d 卷积的不同滤波器
【发布时间】:2020-03-16 07:16:01
【问题描述】:

我有一个形状 (B(atch), F(features), N(odes), T(timestamps)) 的输入。现在,如果我使用形状为 (1,2) 的内核应用 2d 卷积,我将总共有 (F_out, F_in, 1,2) 权重来学习哪个是好的。我想扩展它,以便对于输入中的每个节点,我都有自己的形状为 (1,2) 的过滤器。你们中有人知道我应该从哪里开始吗?到目前为止,我遍历了所有 N 并将过滤器应用于其各自的输入。不幸的是,这种方法非常缓慢。

【问题讨论】:

    标签: conv-neural-network pytorch convolution


    【解决方案1】:

    您正在寻找“分组卷积”。
    nn.Conv2d 的文档关于 groups 参数:

    groups=2,该操作相当于有两个卷积层并排,每个看到一半的输入通道,并产生一半的输出通道,然后将两者连接起来。

    在您的情况下,您需要 groups= 节点数。

    在您的情况下并不是那么简单,因为您想要“合并”特征和节点,并且在“特征”+“节点”维度上只有 1d 分组卷积。
    此外,您需要在“节点”和“特征”之间进行置换,以便根据节点对特征进行分组。

    b = 10;
    inf = 8;
    outf = 13;
    n = 3;
    t = 50;
    
    x = torch.rand((b, inf, n, t))  # input tensor
    gconv = nn.Conv1d(inf, outf, kernel_size=(2), groups=n) #grouped conv
    
    x_ready = x.permute(0, 2, 1, 3).view(b, inf*n, t)  
    y_grouped = gconv(x_ready)
    # "fix" y
    y = y_grouped.view(n, n, outf, t).permute(0, 2, 1, 3)  # now y is b-outf-n-t
    

    【讨论】:

    • 我认为我不太了解您的解决方案。让我们举一个简单的例子,2 个节点,每个节点有 2 个特征,2 个时间戳和一个大小为 1x2 的内核,其中填充了一个。正如您从图像中看到的,两个时间戳被卷积为一个,但没有预期的从节点 1 到节点 2 的信息。现在我希望每个节点都有自己的过滤器,所以特征 1,2 将与一个过滤器相乘,2,4 与另一个相乘,另一个通道也是如此,但结果仍应相加。链接:图片ibb.co/gZBFH3m
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多