在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个值-So
v.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)