Torch:NN处理文本和数字输入

Pet*_*erK 3 neural-network torch conv-neural-network

我有以下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)
}
Run Code Online (Sandbox Code Playgroud)

第2部分:

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

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

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
}
Run Code Online (Sandbox Code Playgroud)

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

我看过各种容器,但似乎没有什么是我需要的.具体来说,我已经看过nn.Parallel但是从文档来看,它看起来完全不同(两个不同模块的输入相同).第一个问题是输入应该是什么样的网络(因为每个部分采用不同类型的Tensor,我认为一个简单的表(数组)会很好,第一个元素是2D张量,第二个是1D张量)以及如何将其输出插入另一个网络,以便我像往常一样使用前进/后退呼叫.

有什么方法可以做到这一点吗?

谢谢!

mbr*_*non 5

你需要的是nn.ParallelTablenn.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)
Run Code Online (Sandbox Code Playgroud)

(一个):

parallel将采用2个张量的表(在您的情况下,文本和数字),将第一张量转发到part1第二张量,part2并将结果输出到另一张2张张量的表中.

(B):

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

(C):

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