Pytorch阅读文档之reshape,view,flatten, transpose函数
程序员文章站
2022-06-13 15:19:22
...
Pytorch阅读文档之reshape,view,flatten函数
flatten函数
之前写过相关的文章,链接再此,对比总结会写在最后,看官别着急吼。
torch.reshape()函数
#reshape(*shape) → Tensor
#参数:
#shape (tuple of python:ints or int...) – 想要转换的形状
#返回具有与self相同的数据和元素数量但具有指定形状的张量。
#如果shape与当前形状兼容,则此方法返回一个视图。
#有关何时可以返回视图,请参见torch.Tensor.view()。view之后再说,先看reshape
torch.reshape(input, shape) → Tensor
#返回具有与input相同的数据和元素数量,但具有指定形状的张量。如果可能,返回的张量将是input视图。否则,它将是copy的版本。连续输入和具有兼容步幅的输入可以在不复制的情况下进行重塑,但是您不应该依赖复制与查看行为。
#某个尺寸可能为-1,在这种情况下,它是根据剩余尺寸和输入的元素数推断出来的。(后面会有栗子)
#参数:input (Tensor) – 原始的shape
#shape (tuple of python:ints) – 需要的shape
>>> a = torch.arange(4.)
>>> torch.reshape(a, (2, 2))
tensor([[ 0., 1.],
[ 2., 3.]])
>>> b = torch.tensor([[0, 1], [2, 3]])
#只有一个-1的话,就是直接展开
>>> torch.reshape(b, (-1,))
tensor([ 0, 1, 2, 3])
#给定一个的时候,另外一个就能就算出来
>>> torch.reshape(b, (-1, 2))
tensor([[0, 1],
[2, 3]])
>>> b = torch.tensor([[[0, 1], [2, 3]], [[0, 1], [2, 3]], [[0, 1], [2, 3]]])
>>> torch.reshape(b, (-1, 2, -1))
RuntimeError: only one dimension can be inferred
>>> torch.reshape(b, (2, 2, -1))
tensor([[[0, 1, 2],
[3, 0, 1]],
[[2, 3, 0],
[1, 2, 3]]])
torch.Tensor.view()函数
#view(*shape) → Tensor
#返回一个新张量,其数据与self张量相同,但shape是不同。 返回的张量共享相同的数据,并且必须具有相同数量的元素,但可能具有不同的大小。一个张量可以被view,new view的尺寸必须与其原始尺寸和stride兼容,也就是说每个新视图尺寸必须是原始尺寸的子空间,或者只能跨越原始的d,d+1,...,d+k这些要满足以下的连续性条件,stride[i]=stride[i+1]×size[i+1] 对于任意的i=0,...,k-1
#一个tensor必须是连续的,才能被contiguous()查看。
>>> x = torch.randn(4, 4)
>>> x.size()
torch.Size([4, 4])
>>> y = x.view(16)
>>> y.size()
torch.Size([16])
>>> z = x.view(-1, 8) # the size -1 的位置是可以推断出来
>>> z.size()
torch.Size([2, 8])
>>> a = torch.randn(1, 2, 3, 4)
>>> a.size()
torch.Size([1, 2, 3, 4])
>>> b = a.transpose(1, 2) # 交换第二维度和第三维度,改变了内存的位置
>>> b.size()
torch.Size([1, 3, 2, 4])
>>> c = a.view(1, 3, 2, 4) # 不改变内存中的位置
>>> c.size()
torch.Size([1, 3, 2, 4])
>>> torch.equal(b, c) #所以不是一个
False
>>> torch.equal(a, c) #还是不是一个,不清楚官方给这个栗子想说明什么
False
#顺便说一下contiguous()
#返回一个包含与self张量相同数据的连续张量。如果self张量是连续的,则此函数返回self张量。其实就是返回一个结果
#torch.transpose(input, dim0, dim1) → Tensor
#返回张量,该张量是输入的转置版本。
#给定的尺寸dim0和dim1被交换。
#生成的张量与输入张量共享其基础存储,因此更改其中一个的内容将更改另一个的内容。
>>> x = torch.randn(2, 3)
>>> x
tensor([[ 1.0028, -0.9893, 0.5809],
[-0.1669, 0.7299, 0.4942]])
#第一维度和第二维度转换
>>> torch.transpose(x, 0, 1)
tensor([[ 1.0028, -0.1669],
[-0.9893, 0.7299],
[ 0.5809, 0.4942]])
上一篇: es6的新特性(let、const、模板字符串和解构赋值)
下一篇: 【Python数据类型介绍】