ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PyTorch의 view()와 reshape() 비교
    Pytorch 2025. 3. 6. 12:52
    728x90

    PyTorch에서 텐서의 크기를 변경하는 두 가지 주요 방법은 view()reshape()이다. 두 함수 모두 기존 텐서의 크기를 변경할 수 있지만, 내부적으로 동작 방식에 차이가 있다. 본 글에서는 두 함수의 차이점과 언제 각각을 사용해야 하는지 설명한다.


    1. view() 함수

    view()는 기존 텐서의 메모리 공유를 유지하면서 크기를 변경한다. 즉, 원본 텐서와 새로운 텐서는 같은 메모리를 가리키므로, 하나를 변경하면 다른 하나에도 영향을 미친다. 하지만 view()를 사용하려면 텐서가 연속적인(Contiguous) 메모리 레이아웃을 가져야 한다.

    예제 코드:

    import torch
    
    tensor = torch.arange(6).reshape(2, 3)
    view_tensor = tensor.view(3, 2)
    
    print("Original Tensor:")
    print(tensor)
    print("\nView Tensor:")
    print(view_tensor)
    
    # 값 변경 확인
    view_tensor[0, 0] = 99
    print("\nAfter modification:")
    print(tensor)
    print(view_tensor)

    출력 결과:

    Original Tensor:
     tensor([[0, 1, 2],
            [3, 4, 5]])
    
    View Tensor:
     tensor([[0, 1],
            [2, 3],
            [4, 5]])
    
    After modification:
     tensor([[99, 1, 2],
            [3, 4, 5]])
    
     tensor([[99, 1],
            [2, 3],
            [4, 5]])

    위 예제에서 view_tensor[0, 0] = 99를 설정하자 원본 tensor의 값도 함께 변경되는 것을 확인할 수 있다. 이는 view()가 기존 메모리를 공유하기 때문이다.


    2. reshape() 함수

    reshape()view()처럼 텐서의 크기를 변경하지만, 메모리 연속성이 보장되지 않을 경우 새로운 메모리를 할당하여 데이터를 복사한다. 즉, 경우에 따라 원본과 다른 메모리 공간을 가질 수 있다.

    예제 코드:

    import torch
    
    tensor = torch.arange(6).reshape(2, 3)
    reshape_tensor = tensor.reshape(3, 2)
    
    print("Original Tensor:")
    print(tensor)
    print("\nReshape Tensor:")
    print(reshape_tensor)
    
    # 값 변경 확인
    reshape_tensor[0, 0] = 99
    print("\nAfter modification:")
    print(tensor)
    print(reshape_tensor)

    출력 결과:

    Original Tensor:
     tensor([[0, 1, 2],
            [3, 4, 5]])
    
    Reshape Tensor:
     tensor([[0, 1],
            [2, 3],
            [4, 5]])
    
    After modification:
     tensor([[0, 1, 2],
            [3, 4, 5]])
    
     tensor([[99, 1],
            [2, 3],
            [4, 5]])

    위 결과를 보면 reshape_tensor를 변경해도 tensor는 그대로 유지된다. 이는 reshape()가 내부적으로 데이터를 복사하여 새로운 메모리를 할당했기 때문이다.


    3. view()reshape()의 차이점 정리

    비교 항목view()reshape()

    메모리 공유 여부 기존 텐서와 메모리 공유 연속적이면 공유, 아니면 새 메모리 할당
    연속적 메모리 필요 여부 필요 필요하지 않음
    성능 빠름 경우에 따라 다름
    • view()는 메모리를 공유하므로 빠르고 효율적이지만, 텐서가 연속적인(Contiguous) 메모리 레이아웃을 가져야 한다.
    • reshape()는 연속적인 메모리를 요구하지 않으며, 필요할 경우 새로운 메모리를 할당하여 데이터를 복사할 수도 있다.

    4. 언제 view()reshape()를 사용할까?

    • 메모리를 공유하면서 크기만 변경하고 싶다면 view()를 사용한다.
    • 메모리 연속성이 보장되지 않거나, 크기 변경이 실패할 경우 reshape()를 사용하면 자동으로 새로운 메모리를 할당하여 해결할 수 있다.

    실제 사용에서는 view()를 먼저 시도하고, 연속적이지 않다는 오류(RuntimeError: view size is not compatible with input tensor's size and stride 등)가 발생하면 reshape()로 변경하는 것이 일반적이다.


    5. 결론

    PyTorch에서 텐서의 크기를 변경할 때 view()reshape()는 비슷한 기능을 제공하지만, 내부적으로 메모리 관리 방식이 다르다. 성능을 고려한다면 view()를 우선적으로 사용하고, 연속적이지 않은 텐서에서는 reshape()를 활용하는 것이 바람직하다. 이를 이해하고 적절히 활용하면 보다 최적화된 텐서 연산을 수행할 수 있다.

    728x90

    'Pytorch' 카테고리의 다른 글

    PyTorch를 활용한 신경망 모델 정의  (0) 2025.03.10
    PyTorch 모델 학습 및 평가 코드 이해하기  (0) 2025.03.10
Designed by Tistory.