相关阅读
Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm=1001.2014.3001.5482
在Pytorch中,transpose是Tensor的一个重要方法,同时它也是一个torch模块中的一个函数,它们的语法如下所示。
Tensor.transpose(dim0, dim1) → Tensor
torch.transpose(input, dim0, dim1) → Tensor
input (Tensor) – the input tensor.
dim0 (int) – the first dimension to be transposed
dim1 (int) – the second dimension to be transposed
官方的解释如下:
返回一个张量,它是输入张量的转置版本,其中将给定的维度dim0和dim1交换。
如果输入是一个具有步幅的张量(常规稠密张量),那么输出张量将与输入张量共享底层存储,因此改变一个张量的内容将改变另一个张量的内容。
如果输入是一个稀疏张量,那么输出张量不与输入张量共享底层存储。
如果输入是压缩布局的稀疏张量(SparseCSR, SparseBSR, SparseCSC或SparseBSC),参数dim0和dim1必须同时是批处理维度,或者必须同时是稀疏维度(稀疏张量的批处理维度是稀疏维之前的维度)。
可以看几个例子以更好的理解:
import torch
# 创建一个张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 使用transpose操作
y = x.transpose(0, 1)
# 等价于y = x.transpose(1, 0)
print(x, y)
tensor([[1, 2, 3],
[4, 5, 6]])
tensor([[1, 4],
[2, 5],
[3, 6]])
print(id(x),id(y))
4347791776 5006922112 # 说明两个张量对象不同
print(x.storage().data_ptr(), y.storage().data_ptr())
5207345856 5207345856 # 说明两个张量对象里面保存的数据存储是共享的
print(id(x[0,0]), id(y[0,0]))
4961223520 4961223520 # 进一步说明两个张量对象里面保存的数据存储是共享的
y[0, 0] = 7
print(x, y)
tensor([[7, 2, 3],
[4, 5, 6]])
tensor([[7, 4],
[2, 5],
[3, 6]]) # 说明对新tensor的更改影响了原tensor
print(x.is_contiguous(), y.is_contiguous())
True False # 说明x是连续的,y不是连续的
以上的内容,类似于之前在关于python中列表的浅拷贝中说到的那样,对新列表内部嵌套的列表中的元素的更改会影响原列表。如下所示。 列表的浅拷贝
import copy
my_list = [1, 2, [1, 2]]
your_list = list(my_list) #工厂函数
his_list = my_list[:] #切片操作
her_list = copy.copy(my_list) #copy模块的copy函数
your_list[2][0] = 3
print(my_list)
print(your_list)
print(his_list)
print(her_list)
his_list[2][1] = 4
print(my_list)
print(your_list)
print(his_list)
print(her_list)
her_list[2].append(5)
print(my_list)
print(your_list)
print(his_list)
print(her_list)
输出
[1, 2, [3, 2]]
[1, 2, [3, 2]]
[1, 2, [3, 2]]
[1, 2, [3, 2]]
[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [3, 4, 5]]
[1, 2, [3, 4, 5]]
[1, 2, [3, 4, 5]]
[1, 2, [3, 4, 5]]
但不一样的是,在这里甚至对新列表中非嵌套的内容的修改也会导致