在 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.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。如果有人能提供更好的解决方案(最好不拆分),我会给他或她接受的答案标记。
我的想法是将 2nd dim 转置为 1st dim,reshape 有一个可选的布尔参数来处理未知维度。哈克但似乎工作。
nn.Transpose({1, 2})
nn.Reshape(d, -1, 真)
nn.Transpose({1, 2})
我正在用 torch nn 写一个神经网络。
作为其中的一部分,我必须将尺寸为 a x b x c
的 3D 张量转换为尺寸为 a x b*c
.
代码如下:
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.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。如果有人能提供更好的解决方案(最好不拆分),我会给他或她接受的答案标记。
我的想法是将 2nd dim 转置为 1st dim,reshape 有一个可选的布尔参数来处理未知维度。哈克但似乎工作。
nn.Transpose({1, 2})
nn.Reshape(d, -1, 真)
nn.Transpose({1, 2})