在pytorch视图中-1是什么意思?
正如问题所说,在pytorch视图中-1是什么意思?,pytorch,reshape,dimensions,Pytorch,Reshape,Dimensions,正如问题所说,-1在pytorch视图中做什么 >a=torch.arange(1,17) >>>a 张量([1,2,3,4,5,6,7,8,9,10,。, 11., 12., 13., 14., 15., 16.]) >>>a.视图(1,-1) 张量([[1,2,3,4,5,6,7,8,9,10,。, 11., 12., 13., 14., 15., 16.]]) >>>a.视图(-1,1) 张量([[1.]], [ 2.], [ 3.], [ 4.], [ 5.]
-1
在pytorch视图中做什么
>a=torch.arange(1,17)
>>>a
张量([1,2,3,4,5,6,7,8,9,10,。,
11., 12., 13., 14., 15., 16.])
>>>a.视图(1,-1)
张量([[1,2,3,4,5,6,7,8,9,10,。,
11., 12., 13., 14., 15., 16.]])
>>>a.视图(-1,1)
张量([[1.]],
[ 2.],
[ 3.],
[ 4.],
[ 5.],
[ 6.],
[ 7.],
[ 8.],
[ 9.],
[ 10.],
[ 11.],
[ 12.],
[ 13.],
[ 14.],
[ 15.],
[ 16.]])
它(-1
)是否生成附加维度?
它的行为是否与numpy重塑
-1
相同?我想这类似于:
新形状应与原始形状兼容。如果是整数,则结果将是该长度的一维数组。一个形状标注可以是-1。在这种情况下,该值是从数组的长度和剩余维度推断出来的
如果你有
a=torch.arange(1,18)
你可以用不同的方式查看它,比如a.view(-1,6)
,a.view(-1,9)
,a.view(3,-1)
等等。是的,它的行为确实像numpy.reforme()中的-1
,即,将推断此维度的实际值,以便视图中的图元数量与原始图元数量匹配
例如:
import torch
x = torch.arange(6)
print(x.view(3, -1)) # inferred size will be 2 as 6 / 3 = 2
# tensor([[ 0., 1.],
# [ 2., 3.],
# [ 4., 5.]])
print(x.view(-1, 6)) # inferred size will be 1 as 6 / 6 = 1
# tensor([[ 0., 1., 2., 3., 4., 5.]])
print(x.view(1, -1, 2)) # inferred size will be 3 as 6 / (1 * 2) = 3
# tensor([[[ 0., 1.],
# [ 2., 3.],
# [ 4., 5.]]])
# print(x.view(-1, 5)) # throw error as there's no int N so that 5 * N = 6
# RuntimeError: invalid argument 2: size '[-1 x 5]' is invalid for input with 6 elements
print(x.view(-1, -1, 3)) # throw error as only one dimension can be inferred
# RuntimeError: invalid argument 1: only one dimension can be inferred
:
-例如,如果你有
>>> a = torch.rand(4,4)
>>> a.size()
torch.size([4,4])
>>> y = x.view(16)
>>> y.size()
torch.size([16])
>>> z = x.view(-1,8) # -1 is generally inferred as 2 i.e (2,8)
>>> z.size()
torch.size([2,8])
我喜欢本杰明给出的答案
是的,它的行为与numpy.reforme()中的-1类似,也就是说,将推断此维度的实际值,以便视图中的元素数与原始元素数匹配
但我认为奇怪的case-edge情况对你来说可能不是直观的(或者至少对我来说不是),是用一个-1调用它,即tensor.view(-1)
。
我的猜测是,它的工作方式与以往完全相同,只是因为您要查看一个数字,所以它假设您需要一个维度。tensor.view(-1,Dnew)
它将产生两个维度/索引的张量,但会确保第一个维度根据张量的原始维度具有正确的大小。假设您有(D1,D2)
您有Dnew=D1*D2
,那么新维度将是1
对于带有代码的真实示例,您可以运行:
import torch
x = torch.randn(1, 5)
x = x.view(-1)
print(x.size())
x = torch.randn(2, 4)
x = x.view(-1, 8)
print(x.size())
x = torch.randn(2, 4)
x = x.view(-1)
print(x.size())
x = torch.randn(2, 4, 3)
x = x.view(-1)
print(x.size())
输出:
torch.Size([5])
torch.Size([1, 8])
torch.Size([8])
torch.Size([24])
历史/背景
我觉得这是一个很好的例子(展平层就是这个常见的代码):
连续的。在此视图中,x.view(-1)
是一个奇怪的扁平层,但缺少挤压(即添加维度1)。添加或删除此压缩通常对代码的实际运行非常重要。据我所知(我不支持…),给定的维度-1将适用于其他维度。因此a.view(-1,1)
将生成维度为17x1
的向量,因为有17个值-Sov.view(1,-1)
将生成1x17
向量。如果我们自己有-1呢?e、 g.我面前有这样一个:正确[:k]。视图(-1)
。在这种特殊情况下,它会做什么?@CharlieParker:这会使张量变平(类似于),即返回一个包含所有元素的一维张量。例如,在我的答案中的命令之后运行x.view(-1)
将返回张量([0,1,2,3,4,5.])
,即一个尺寸为6的单维张量。如果我们自己有-1呢?e、 g.我面前有这样一个:正确[:k]。视图(-1)
。在这种特殊情况下它会做什么?如果我们自己有-1呢?e、 g.我面前有这样一个:正确[:k]。视图(-1)
。在这种特殊情况下它会做什么?如果我们自己有-1呢?e、 g.我面前有这样一个:正确[:k]。视图(-1)
。在这种特殊情况下,它会起什么作用?
torch.Size([5])
torch.Size([1, 8])
torch.Size([8])
torch.Size([24])
class Flatten(nn.Module):
def forward(self, input):
# input.size(0) usually denotes the batch size so we want to keep that
return input.view(input.size(0), -1)