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

In torch / nn, how to use nn.View(-1):setNumInputDims(2) with a minibatch 4D tensor?

我正在用 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),但其中 none 创建了我想要的格式的张量。

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。如果有人能提供更好的解决方案(最好不拆分),我会给他或她接受的答案标记。

我的想法是将 2nd dim 转置为 1st dim,reshape 有一个可选的布尔参数来处理未知维度。哈克但似乎工作。
nn.Transpose({1, 2})
nn.Reshape(d, -1, 真)
nn.Transpose({1, 2})