如何从[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])
我有一批来自 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])