x = x.contiguous().view(x.size(0), -1)解释

x = x.contiguous().view(x.size(0), -1)

其中:
①.contiguous():
调用view之前最好先contiguous,也就是x.contiguous().view(),因为view需要tensor的内存是整块的,view只能用在contiguous的variable上。
此方法返回张量的副本x,其中元素存储在连续的内存块中。如果张量已经是连续的,则此方法不会创建副本,而只是返回原始张量。
②.view(x.size(0), -1)::
其实在torch里面,view函数就相当于numpy的reshape,执行的操作就是对tensor进行维度转换,此方法将张量重塑x为二维形状,其中第一维是x.size(0)(即第一维的大小),第二维是从其余元素推断出来的,第二个维度中的-1是一个占位符,它告诉 PyTorch 根据张量中的元素总数推断第二个维度的大小。
实例:

import torch
x = torch.rand(2, 3, 4, 5) # 随机生成4 * 3 * 17 * 17 的数组
print("x.shape ==",x.shape) # 输出x的维度
print(x)

结果:
在这里插入图片描述
增加代码:

x = x.view(x.size(0),-1)
print(x)

结果:
在这里插入图片描述
view(xxx,-1)
即,这边的这里-1表示一个不确定的数,就是你如果不确定你想要reshape成几行,但是你很肯定要reshape成xxx列。
上述例子中,

x = x.view(x.size(0),-1) 等价于  x = x.view(x.size(0),60) 

③x = x.contiguous().view(x.size(0), -1):
这行代码用于将张量重塑x为二维形状,同时确保张量中的元素存储在连续的内存块中。
综上所述,这行代码将张量重塑x为二维形状,同时确保元素存储在连续的内存块中。这通常用作将张量传递到需要二维输入的神经网络层(例如全连接层)之前的预处理步骤。
实例:
假设我们有一个4维的张量x,其形状为(2, 3, 4, 5),即有2个4维向量,每个向量包含3个3维向量,每个3维向量包含4个2维向量,每个3维向量包含4个2维,每个2维向量包含5个元素。

可以使用以下代码来实现这个转换:

x = x.contiguous().view(x.size(0), -1)

在这里,contiguous()方法将x张量中的元素复制到一个连续的块中,以确保后续操作的有效性。然后,view()方法将张量x重塑为一个2维矩阵,第一维大小为2,第二维大小为3x4x5=60(因为我们在第二个维度上使用了-1,所以它被自动推断为60)。
执行完这行代码后,x将变成一个2维张量,形状为(2, 60)。这个变换不会改变张量中的元素,只是重新组织它们的形状。

参考CSDN:
torch中x = x.view(…, -1)的解释
pytorch中的contiguous()

猜你喜欢

转载自blog.csdn.net/qq_45104603/article/details/129987842
x