如何从[1,4,256]cuda.FloatTensor变成[1,1,256]?

How to take shape [1,1,256] from [1,4,256] cuda.FloatTensor?

我有一批来自 GRU 的输出隐藏向量。它的形状是 [1,4,256]

( 0 ,.,.) = 
-0.9944  1.0000  0.0000  ...  -1.0000  0.0000 -1.0000
-1.0000  1.0000  0.0000  ...  -1.0000  0.0000 -1.0000
-1.0000  1.0000  0.0000  ...  -1.0000  0.0000 -1.0000
-1.0000  1.0000  0.0000  ...  -1.0000  0.0000 -1.0000
[torch.cuda.FloatTensor of size (1,4,256) (GPU 0)]

我需要 [1,1,256] 的形状传递给另一个模型。我怎么能接受呢?通过这条线我只能有 [1,256]

的形状
decoder_hidden = encoder_hidden[:, index]

调整大小并包装新的 FloatTensor 无效。

可以使用张量的view()方法。

decoder_hidden_new = decoder_hidden.view((1, 1, 256))

您可以 unsqueeze() 在维度 1 中实现此目的。

encoder_hidden = torch.randn(1, 4, 256)
print(encoder_hidden.size())

for idx in range(encoder_hidden.size(1)):
    decoder_hidden = encoder_hidden[:, idx, :].unsqueeze(1)
    print(decoder_hidden.size())

它打印:

torch.Size([1, 4, 256])
torch.Size([1, 1, 256])
torch.Size([1, 1, 256])
torch.Size([1, 1, 256])
torch.Size([1, 1, 256])

这里有更多方法可以做到这一点。详情在下方评论:

# random tensor
In [53]: t.shape
Out[53]: torch.Size([1, 4, 256])

# the four slices
In [54]: slice_1 = t[:, 0, :]
In [55]: slice_2 = t[:, 1, :]
In [56]: slice_3 = t[:, 2, :]
In [57]: slice_4 = t[:, 3, :]

In [58]: slice_1.shape
Out[58]: torch.Size([1, 256])

# using `torch.np.newaxis`
In [59]: slice_1 = slice_1[torch.np.newaxis, ...]

In [60]: slice_1.shape
Out[60]: torch.Size([1, 1, 256])

# simply using `np.newaxis`
In [61]: slice_2 = slice_2[np.newaxis, ...]

In [62]: slice_2.shape
Out[62]: torch.Size([1, 1, 256])

# or even simply, use `None` which is an alias to `np.newaxis`
In [63]: slice_3 = slice_3[None, ...]

In [64]: slice_3.shape
Out[64]: torch.Size([1, 1, 256])