张量维度变换

①如何查看张量维度:
你可以使用shape属性或者size()方法来检查张量的形状。

import torch

# 创建一个形状为(2, 3, 4)的张量
x = torch.randn(2, 3, 4)
print(x.shape)  # 输出: torch.Size([2, 3, 4])
print(x.size())  # 输出: torch.Size([2, 3, 4])

在输出结果中,torch.Size对象表示张量的形状,可以通过索引获取各个维度的大小。例如,在上面的示例中,x.shape[0]返回值为2。

②怎么把二维扩展到四维:
可以使用PyTorch中的unsqueeze函数将一个二维张量扩展为四维张量。unsqueeze函数接受一个整数作为参数,指定在哪个维度上进行扩展,例如:

import torch

x = torch.randn(3, 4) # 二维张量
print(x.shape) # 输出: torch.Size([3, 4])

x = x.unsqueeze(0).unsqueeze(-1) # 在第0维和最后一维上进行扩展
print(x.shape) # 输出: torch.Size([1, 3, 4, 1])

在这个例子中,unsqueeze(0)将原始张量的第0维进行扩展,成为一个长度为1的新维度,因此原来的行数3会变为现在的第1维长度3。unsqueeze(-1)将新的最后一维进行扩展,成为一个长度为1的新维度,因此原来的列数4会变为现在的第2维长度4,同时扩展的维度位置也可以用负数表示,比如unsqueeze(-1)表示在倒数第一维上进行扩展。

这样就可以将一个二维张量扩展为一个四维张量。

③如何把四维张量变为三维?
可以使用PyTorch中的view方法来将四维张量变为三维张量。假设我们有一个四维张量tensor,形状为(batch_size, channels, height, width),可以使用以下代码将其变为三维张量:

new_tensor = tensor.view(batch_size, channels * height, width)

这里我们将原先的height和width维度拼接成了一个新的维度channels * height。如果想要把width和height拼接,也可以使用以下代码:

new_tensor = tensor.view(batch_size, channels, height * width)

需要注意的是,view方法并不会改变原张量的数据,而是返回一个新的张量,因此需要将结果保存到一个新的变量中。

④如何变为2维呢?
可以使用reshape函数将四维张量变为二维张量,示例代码如下:

import torch

# 创建一个4维张量
x = torch.randn(2, 3, 4, 5)

# 将4维张量变为2维张量
x_2d = x.reshape(x.size(0), -1)

print(x.shape)    # torch.Size([2, 3, 4, 5])
print(x_2d.shape) # torch.Size([2, 60])

这里使用-1作为reshape函数的第二个参数,表示将所有剩余的元素都压缩到一个维度中。在上面的示例中,x.size(0)表示张量的第一个维度大小,即2,剩下的所有元素都被压缩到了第二个维度中,即345=60。

⑤view能把height*width吗?
view() 可以用来重塑张量的形状。如果一个张量的形状为 (batch_size, channels, height, width),想要将其变为 (batch_size, height * width, channels),可以使用以下代码:

tensor = tensor.view(tensor.size(0), -1, tensor.size(1))

其中 -1 表示该维度的大小应该由其他维度自动推断出来,这里会自动计算出 height * width 的值作为该维度的大小。

⑥那么view可以把四维变二维吗?
使用view函数可以将任意维度的张量变形为指定形状的张量,因此可以将四维张量变为二维张量。对于一个四维张量,如果想要将其变为二维张量,可以使用以下代码:

new_tensor = tensor.view(tensor.size(0), -1)

其中,tensor.size(0)表示张量的第一维大小,-1表示让PyTorch自动推断第二维大小。这样就能将一个任意大小的四维张量变为二维张量了。

⑦可以看到view和reshape都能改变一个张量的形状,那么view和reshape的关系是什么样的呢?

reshape 和 view 都可以用来改变张量的形状,它们的主要区别在于当需要改变形状的维度大小无法被整除时的处理方式。

具体来说,reshape 可以在改变形状时使用 -1 参数,表示 PyTorch 应该根据其他维度推断出它的大小,以确保形状的总大小不变。而 view 函数不能使用 -1 参数,需要手动计算出目标形状中所有维度的大小。

另外,view 函数已经确定了张量的大小,因此新的形状必须和原来的形状大小相同。而 reshape 函数可以改变张量的大小,包括增加或减少张量的元素数。

总的来说,reshape 和 view 函数的功能非常相似,但 reshape 更加灵活,能够应对更多的形状变换需求,而 view 更加高效,适用于已知形状大小的情况。

猜你喜欢

转载自blog.csdn.net/qq_45104603/article/details/130072831