在torch/nn中,如何使用nn.View(-1):setNumInputDims(2)函数处理4维小批量张量?

我正在使用torch的nn库编写神经网络。

我的任务之一是将一个大小为 a x b x c 的三维张量转换成一个大小为 a x b*c 的二维张量。

这里是代码:

input = torch.Tensor(a, b, c)  -- 任意三维张量
net = nn.Sequential()
net:add(nn.View(-1):setNumInputDims(2))
net:forward(input)

现在我想修改我的网络以便能够处理输入数据的小批量。因此,我需要将一个大小为 d x a x b x c 的四维张量转换成一个大小为 d x a x b*c 的三维张量,其中 d 是小批量中的元素数。 d 已知,但其他维度未知。

当我将一个四维张量输入网络时,结果是一个大小为 d*a x b*c 的二维张量。如何修改网络才能得到我想要的三维张量呢?

我尝试了不同的组合,例如 nn.View(-1).setNumInputDims(3)nn.View(d, -1).setNumInputDims(2)nn.View(d, -1).setNumInputDims(3),但都没有得到我想要的张量。

点赞
用户4415923
用户4415923

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 张量。

附注:如果有人能够提供更好的解决方案(最好不用拆分),我将给予他或她已接受的答案标记。

2015-11-22 17:49:01
用户6293129
用户6293129

我的想法是将第二维转置为第一维,并且 reshape 函数有一个可选的布尔参数来处理未知维度。虽然有些 hacky 但似乎可行。

nn.Transpose({1, 2})
nn.Reshape(d, -1, true)
nn.Transpose({1, 2})
2016-05-04 22:50:03