contiguous tensor를 반드시 넣어주어야 하는 경우?

반드시 contiguous tensor를 input으로 넣어주어야 되는 경우가 있을까요?

코드를 작성하다 보면, 보통은 view로 tensor를 조작하고 contiguous를 부르지 않는 경우가 많은데, 간혹 tensor를 반드시 contiguous하게 바꿔주어야 하는경우가 있는걸로 알고 있습니다. 대표적인 경우가 view인데 (view를 가져온 다음 다시 한 번 view를 부를때), 이 외에도 반드시 contiguous하게 바꿔주어야 하는 경우가 있을까요?

PyTorch에서, contiguous tensor는 요소들이 선형적이고 연속적인 방식으로 메모리에 저장되는 텐서를 얘기하는데요. 텐서 내의 요소들의 메모리 주소가 간격이나 불연속성 없이 순차적으로 증가한다는 것을 의미합니다.

reshape, index 및 slicing과 같은 작업을 하려면 Contiguous tensor 형태로 메모리에 연속적으로 저장되어야 하기 때문에 중요하다고 할 수 있습니다. Tensor가 연속적으로 저장되지 않으면 이러한 연산은 예상치 못한 결과를 초래하거나 오류를 발생시킬 수 있는 것이구요.

예를 들어, 연속되지 않은 텐서가 있는데 reshape 함수를 사용하여 차원을 변경하려고 하면 다음과 같은 오류가 발생할 수 있습니다:

import torch

# Define a non-contiguous tensor
tensor = torch.tensor([[1, 2, 3], [4, 5, 6]], stride=[3, 1])

try:
    reshaped_tensor = tensor.reshape(6, 1)
except Exception as e:
    print(e)

아래와 같은 에러가 발생할 수 있습니다.

Reshaping a tensor which is not contiguous is not supported.

이를 해결하기 위해 Tensor의 .continuous() 를 호출하시면 됩니다. 이걸 호출하면 메모리에 지속적으로 저장이 보장되는 새로운 텐서를 반환하게 됩니다.

reshaped_tensor = tensor.contiguous().reshape(6, 1)

답변이 도움 되시길 바랍니다.

1개의 좋아요