我正在用火炬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)
,但没有一个组合创建了我想要的格式。
答案 0 :(得分:1)
nn
似乎非常有限。我能找到解决问题的最好方法是创建一个类似并行的网络。 nn.Concat
和nn.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})