torch.Tensor.contiguous - PyTorch 1.11.0 documentation

Untitled

연속적인 메모리 Tensor를 반환한다!

특정 연산은 이를 해주지 않으면 에러가 난다

Example

>>> a = torch.randn(2, 3, 6)
>>> a
tensor([[[ 1.7584e+00,  9.2055e-01,  4.6850e-01,  6.4279e-01, -3.6610e-01,
           1.9589e+00],
         [ 9.8600e-01,  3.4744e-01, -5.7159e-01, -2.3593e-01, -1.6692e+00,
          -3.6157e-04],
         [ 1.7516e+00, -1.1490e+00, -7.9862e-01,  6.8282e-01, -5.8972e-01,
          -4.4164e-01]],

        [[ 1.0348e+00, -7.5774e-01, -7.2701e-01,  1.0653e+00, -4.8248e-01,
          -2.7340e-01],
         [-6.7566e-02,  1.6268e+00, -7.1940e-01,  2.4111e-01,  7.3485e-01,
           2.8317e-01],
         [-7.0272e-01, -3.9150e-01, -1.3037e+00, -9.7168e-01,  4.4148e-01,
           6.2360e-01]]])
>>> a.shape
torch.Size([2, 3, 6])
>>> a.stride()
(18, 6, 1)

Untitled

이러한 모양의 텐서를 생성하고, shape와 stide속성을 확인하면

>>> a.shape
torch.Size([2, 3, 6])
>>> a.stride()
(18, 6, 1)

stride가 (18, 6, 1)이라는 것은

0차원에서 다음 원소를 가져올때는 18개의 원소를 뛰어넘어야하고

1차원에서 다음원소를 가져올때는 6개, 2차원에선 1개를 뛰어넘어야한다는 것이다.

Untitled

이렇게 그림으로보면 잘 이해가 간다. 말이되는 소리다

그러나 메모리에 연속적으로 값이 들어있지않다면?

>>> a = a.transpose(0,1)
>>> a.shape
torch.Size([3, 2, 6])

Untitled

>>> a.stride()
(6, 18, 1)
>>> a.is_contiguous()
False

같은 사이즈의 텐서 b를 만들어본다

>>> b = torch.randn(3,2,6)
>>> b.stride()
(12, 6, 1)
>>> b.is_contiguous()
True