在torch / nn中,如何使用nn.View(-1):setNumInputDims(2)与minibatch 4D张量?

时间:2015-11-20 20:30:09

标签: lua neural-network torch

我正在用火炬nn写一个神经网络。

作为其中的一部分,我必须将尺寸为a x b x c的3D张量转换为尺寸为a x b*c的2D张量。

以下是代码:

input = torch.Tensor(a, b, c)  -- Arbitrary 3D tensor
net = nn.Sequential()
net:add(nn.View(-1):setNumInputDims(2))
net:forward(input)

现在我想修改我的网络,以便它可以处理小批量作为输入。因此,我想将尺寸为d x a x b x c的4D张量转换为尺寸为d x a x b*c的3D张量,其中d是我的小批量中的元素数量。 d提前知道,但其他维度不是。

当我将4D张量馈入上面的网络时,我得到了一个2D张量d*a x b*c。如何修改网络以便根据需要创建3D张量?

我尝试了不同的组合,例如nn.View(-1).setNumInputDims(3)nn.View(d, -1).setNumInputDims(2)nn.View(d, -1).setNumInputDims(3),但没有一个组合创建了我想要的格式。

2 个答案:

答案 0 :(得分:1)

在这种情况下,

nn似乎非常有限。我能找到解决问题的最好方法是创建一个类似并行的网络。 nn.Concatnn.Select

local net = nn.Concat(1)
for i=1, d do
  local subNet = nn.Sequential()
  subNet:add(nn.Select(1, i))
  subNet:add(nn.View(-1):setNumInputDims(2))
  subNet:add(nn.Replicate(1, 1))
  net:add(subNet)
end

注意:在这种情况下,您确实需要nn.Replicate,否则它也会创建d*a x b*c张量。

P.S。如果有人能提供更好的解决方案(最好没有分裂),我会给他或她接受的答案标记。

答案 1 :(得分:0)

我的想法是将第二个dim转换为第一个dim,并且reshape有一个可选的布尔参数来处理未知维度。哈基,但似乎工作。
    nn.Transpose({1,2})
    nn.Reshape(d,-1,true)
    nn.Transpose({1,2})