【问题标题】:Torch: NN handling text and numeric inputTorch:NN 处理文本和数字输入
【发布时间】:2015-12-14 08:10:46
【问题描述】:

我有以下 NN 架构:

第 1 部分:

nn.Sequential {
  [input -> (1) -> (2) -> (3) -> (4) -> (5) -> (6) -> (7) -> output]
  (1): nn.TemporalConvolution
  (2): nn.TemporalMaxPooling
  (3): nn.TemporalConvolution
  (4): nn.TemporalMaxPooling
  (5): nn.Reshape(14336)
  (6): nn.Dropout(0.500000)
  (7): nn.Linear(14336 -> 128)
}

第 2 部分:

nn.Sequential {
  [input -> (1) -> (2) -> (3) -> output]
  (1): nn.Linear(4 -> 8)
  (2): nn.ReLU
  (3): nn.Linear(8 -> 4)
}

我想做的是将这两部分的输出作为另一部分的输入:

nn.Sequential {
  [input -> (1) -> (2) -> (3) -> (4) -> (5) -> (6) -> output]
  (1): nn.Linear(132 -> 32)
  (2): nn.ReLU
  (3): nn.Linear(32 -> 32)
  (4): nn.ReLU
  (5): nn.Linear(32 -> 2)
  (6): nn.LogSoftMax
}

注意第 1 部分有 128 个输出,第 2 部分有 4 个,最后第 3 部分有 132 个输入。所以基本上我想要的是一个接受两种类型输入的网络(第 1 部分用于文本,第 2 部分用于数字向量)并在第三层中使用这些信息进行 2 类分类。

我查看了各种容器,但似乎没有什么是我需要的。具体来说,我查看了 nn.Parallel 但从文档看来它做了一些完全不同的事情(两个不同模块的相同输入)。第一个问题是网络的输入应该是什么样子(因为每个部分采用不同类型的张量,我认为一个简单的表(数组)就可以了,它的第一个元素是 2D 张量,第二个元素是 1D 张量) 以及如何将其输出插入另一个网络,以便我可以像往常一样使用前向/后向调用。

有没有办法做到这一点?

谢谢!

【问题讨论】:

    标签: neural-network torch conv-neural-network


    【解决方案1】:

    您需要的是nn.ParallelTable 和nn.JoinTable。

    local parallel = nn.ParallelTable()
    parallel:add(part1)
    parallel:add(part2)
    
    local net = nn.Sequential()
    net:add(parallel)                   -- (A)
    net:add(nn.JoinTable(1))            -- (B)
    net:add(part3)                      -- (C)
    

    (A):

    parallel 将获取一个包含 2 个张量的表(在您的情况下是文本和数字),将第一个张量转发到 part1,将第二个张量转发到 part2,并将两个结果输出到另一个包含 2 个张量的表中。

    (B):

    下面的nn.JoinTable 将此表作为输入,并将 2 个张量连接到一个张量中。根据张量的形状,您可能必须使用处理连接维度的参数(在我的示例中为 1)。

    (C):

    最后,您可以添加网络的第三部分,将连接的张量作为输入。

    【讨论】:

    • 太棒了,谢谢!明天试试,然后报告我的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2013-01-24
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多