Torch:神经网络处理文本和数字输入
Torch: NN handling text and numeric input
我有以下神经网络架构:
第 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 class class化.
我查看了各种容器,但似乎没有什么是我需要的。具体来说,我查看了 nn.Parallel,但从文档看来它做了完全不同的事情(两个不同模块的相同输入)。第一个问题是网络的输入应该是什么样的(因为每个部分都采用不同类型的张量,我认为一个简单的 table (数组)就可以了,它的第一个元素是一个二维张量和第二个一维张量)以及如何将其输出插入另一个网络,以便我可以像往常一样使用 forward/backward 调用。
有什么办法吗?
谢谢!
你需要的是nn.ParallelTable and 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 个张量的 table(在您的情况下,文本和数字),将第一个张量转发到 part1
,将第二个张量转发到 part2
,然后将两个结果输出到另一个 table of 2 张量中。
(乙):
以下 nn.JoinTable
将此 table 作为输入并将 2 个张量连接成一个张量。根据张量的形状,您可能需要使用处理串联维度的参数(1
在我的示例中)。
(C):
最后,您可以添加网络的第三部分,将连接的张量作为输入。
我有以下神经网络架构:
第 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 class class化.
我查看了各种容器,但似乎没有什么是我需要的。具体来说,我查看了 nn.Parallel,但从文档看来它做了完全不同的事情(两个不同模块的相同输入)。第一个问题是网络的输入应该是什么样的(因为每个部分都采用不同类型的张量,我认为一个简单的 table (数组)就可以了,它的第一个元素是一个二维张量和第二个一维张量)以及如何将其输出插入另一个网络,以便我可以像往常一样使用 forward/backward 调用。
有什么办法吗?
谢谢!
你需要的是nn.ParallelTable and 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 个张量的 table(在您的情况下,文本和数字),将第一个张量转发到 part1
,将第二个张量转发到 part2
,然后将两个结果输出到另一个 table of 2 张量中。
(乙):
以下 nn.JoinTable
将此 table 作为输入并将 2 个张量连接成一个张量。根据张量的形状,您可能需要使用处理串联维度的参数(1
在我的示例中)。
(C):
最后,您可以添加网络的第三部分,将连接的张量作为输入。