PyTorch之Tensor常用操作
注:主要内容是翻译自PyTorch的官方API文档,再加上一些自己的理解。
Tensor 之 view 方法
view(*shape) → Tensor
- 返回的是一个有着相同数据但形状不同的Tensor。
- 对于一个viewed的tensor,新的view size 必须与原始的size和stride兼容,比如每一个新的维度必须要么是原始维度的一个子空间,要么仅仅跨越原始维度
d
,
d
+
1
,
.
.
.
,
d
+
k
d,d+1,...,d+k
d,d+1,...,d+k, 以致于可以满足contiguity-like condition使
∀
i
=
d
,
d
+
1
,
.
.
.
,
d
+
k
−
1
\forall i=d,d+1,...,d+k-1
∀i=d,d+1,...,d+k−1,
s t r i d e [ i ] = s t r i d e [ i + 1 ] × s i z e [ i + 1 ] stride[i]=stride[i+1] \times size[i+1] stride[i]=stride[i+1]×size[i+1] - 否则的话,便不要用view(), 转而用reshape().
Parameters
shape (torch.Size or int…) – the desired size
Example
tensor = torch.FloatTensor([[[1,1,1],[2,2,2],[3,3,3],[4,4,4]], [[5,5,5],[6,6,6],[7,7,7],[8,8,8]]]) # 32-bit floating point
tensor = tensor.view(2, -1, 4)
其实现结果如下图所示:
>>> 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) # -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) # Swaps 2nd and 3rd dimension
>>> b.size()
torch.Size([1, 3, 2, 4])
>>> c = a.view(1, 3, 2, 4) # Does not change tensor layout in memory
>>> c.size()
torch.Size([1, 3, 2, 4])
>>> torch.equal(b, c)
False