pytorch中张量torch.Size([])和torch.Size([1])的形状差异

Ami*_*ogi 4 pytorch tensor

我是pytorch的新手。在玩张量时,我观察到了两种类型的张量-

tensor(58)
tensor([57.3895])
Run Code Online (Sandbox Code Playgroud)

我打印了它们的形状,输出分别是 -

torch.Size([])
torch.Size([1])
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?

pro*_*sti 6

您可以使用具有单个标量值的张量,如下所示:

import torch

t = torch.tensor(1)
print(t, t.shape) # tensor(1) torch.Size([])

t = torch.tensor([1])
print(t, t.shape) # tensor([1]) torch.Size([1])

t = torch.tensor([[1]])
print(t, t.shape) # tensor([[1]]) torch.Size([1, 1])

t = torch.tensor([[[1]]])
print(t, t.shape) # tensor([[[1]]]) torch.Size([1, 1, 1])

t = torch.unsqueeze(t, 0)
print(t, t.shape) # tensor([[[[1]]]]) torch.Size([1, 1, 1, 1])

t = torch.unsqueeze(t, 0)
print(t, t.shape) # tensor([[[[[1]]]]]) torch.Size([1, 1, 1, 1, 1])

t = torch.unsqueeze(t, 0)
print(t, t.shape) # tensor([[[[[[1]]]]]]) torch.Size([1, 1, 1, 1, 1, 1])

#squize dimension with id 0
t = torch.squeeze(t,dim=0)
print(t, t.shape) # tensor([[[[[1]]]]]) torch.Size([1, 1, 1, 1, 1])

#back to beginning.
t = torch.squeeze(t)
print(t, t.shape) # tensor(1) torch.Size([])

print(type(t)) # <class 'torch.Tensor'>
print(type(t.data)) # <class 'torch.Tensor'>
Run Code Online (Sandbox Code Playgroud)

张量确实有大小或形状。这是一样的。这实际上是一个类torch.Size。您可以写信help(torch.Size)获取更多信息。任何时候你写t.shape,或者t.size()你都会得到那个尺寸信息。

张量的想法是它们可以对其内部数据具有不同的兼容大小维度,包括torch.Size([]).

任何时候你解压缩一个张量,它都会添加另一个维度 1。任何时候你压缩一个张量,它都会删除 1 的维度,或者一般情况下所有维度都是 1。


Szy*_*zke 5

第一个有0大小维度,第二个有1维度,PyTorch 试图使两者兼容(0大小可以被视为类似float或类似,尽管我还没有真正遇到明确需要它的情况,除了@javadr在他的回答中显示的内容以下)。

通常您会使用list它来初始化它,请参阅此处了解更多信息。