个人网站做支付接口,网站公司用什么软件做网站,微信小程序制作个人版,软件制作小程序开发在深度学习中#xff0c;张量的维度变换是很重要的操作。在pytorch中#xff0c;有四个用于维度变换的函数#xff0c;view, reshape, transpose, permute。其中view, reshape都用于改变张量的形状#xff0c;transpose, permute都用于重新排列张量的维度#xff0c;但它们…在深度学习中张量的维度变换是很重要的操作。在pytorch中有四个用于维度变换的函数view, reshape, transpose, permute。其中view, reshape都用于改变张量的形状transpose, permute都用于重新排列张量的维度但它们的功能和使用场景有所不同下面将进行详细介绍并给出测试验证代码经过全面的了解我们才能知道如何正确的使用这四个函数。 这里写目录标题 1. torch.Tensor.view2. torch.reshape3. torch.transpose4. torch.permute5. torch.transpose与torch.permute的性质与原理 1. torch.Tensor.view
文档Doc
view 方法返回一个新的张量具有与原始张量相同的数据但改变了形状。所以view返回的是原始数据的一个新尺寸的视图这也就是为什么叫做view。import torch
# 创建一个2x6的张量
x torch.tensor([[1, 2, 3, 4, 5, 6],[7, 8, 9, 10, 11, 12]])
# 将其调整为3x4的形状
y x.view(3, 4)
print(x shape: , x.shape)
print(y shape: , y.shape)
# 判断新旧张量是否数据是相同的
print(x.data_ptr() y.data_ptr())输出x shape: torch.Size([2, 6])
y shape: torch.Size([3, 4])
Trueview 要求原始张量是连续的即在内存中是按顺序存储的否则会抛出错误。import torch
# 创建一个2x6的张量
x torch.tensor([[1, 2, 3, 4, 5, 6],[7, 8, 9, 10, 11, 12]])
# 将向量转置此时x不再是连续的
x x.T
# 在不连续的张量上进行view将会报错
y x.view(3, 4)报错输出RuntimeError: view size is not compatible with input tensors size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.如果张量不是连续的可以使用 contiguous 方法先将其转换为连续的。
2. torch.reshape
文档Doc
reshape不要求原始张量是连续的如果原始张量是连续的那么实现的功能和view一样如果原始张量不是连续的那么reshape就是tensor.contigous().view()也就是会重新开辟一块内存空间拷贝原始张量使其连续在连续张量上view 和 reshape 性能相同。在非连续张量上reshape 可能会稍慢一些因为它可能需要创建新的连续张量。import torch
# 创建一个2x6的张量
x torch.tensor([[1, 2, 3, 4, 5, 6],[7, 8, 9, 10, 11, 12]])
# 将向量转置此时x不再是连续的
x x.T
# 在不连续的张量上可以进行reshape
y x.reshape(3, 4)
print(x shape: , x.shape)
print(y shape: , y.shape)
# 但reshape返回的是新的内存中的张量
print(x.data_ptr() y.data_ptr())输出x shape: torch.Size([6, 2])
y shape: torch.Size([3, 4])
False3. torch.transpose
Doc
功能仅用于交换两个维度。它接受两个维度参数分别表示要交换的维度。不改变数据不会改变数据本身只是改变数据的视图即不复制数据。生成的新张量也通常不是连续的。它只是交换两个维度的顺序不改变数据在内存中的实际存储顺序。对原始张量是不是连续的没有要求import torch
# 创建一个3x4的张量
x torch.tensor([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])
print(x.is_contiguous())
# 交换第一个和第二个维度
y torch.transpose(x, 0, 1)
print(y.is_contiguous())
print(x shape: , x.shape)
print(y shape: , y.shape)
print(x.data_ptr() y.data_ptr())输出True
False
x shape: torch.Size([3, 4])
y shape: torch.Size([4, 3])
True4. torch.permute
Doc
可以重新排列任意数量的维度适用于复杂的维度变换。接受一个shape元组作为参数不改变数据不会改变数据本身只是改变数据的视图即不复制数据生成的新张量通常不是连续的。因为它仅改变维度顺序不改变数据在内存中的实际顺序。对原始张量是不是连续的没有要求 import torch# 创建一个3x4x5的张量x torch.randn(3, 4, 5)# 将其第一个和第二个维度交换y torch.permute(x, (1, 0, 2))print(y.is_contiguous())print(x.data_ptr() y.data_ptr())print(y.size()) # 输出torch.Size([4, 3, 5])输出False
True
torch.Size([4, 3, 5])5. torch.transpose与torch.permute的性质与原理
这两者的功能和各方面的性质基本是相同的只是一个只能交换两个维度一个能进行更复杂的维度排列。他们的原理是transpose 和 permute 通过改变张量的 strides步幅来重新排列维度。strides 定义了在内存中沿着每个维度移动的步长。它们不改变张量的数据只是改变了访问数据的方式。因此这些操作可以应用于任何张量无论它们是否连续。