본문 바로가기
프로그래밍/Python

Python expand() 및 repeat()

by 허구의 2025. 7. 12.
728x90

 

PyTorch에서 모델 학습이나 텐서 조작을 하다 보면 "데이터를 특정 방향으로 늘려야" 하는 상황이 자주 발생합니다. 이럴 때 사용하는 대표적인 함수가 expand()repeat()입니다.

두 함수 모두 텐서의 크기를 확장하는 데 쓰이지만, 내부 동작 방식은 매우 다릅니다. 본 글에서는 expand vs repeat의 차이와 각각의 쓰임새, 예제, 그리고 주의해야 할 점을 설명합니다.

 

expand()란?

expand()는 텐서의 **메모리를 복사하지 않고** 브로드캐스팅 방식으로 차원을 확장하는 함수입니다. 즉, 원래 데이터를 공유한 채로 여러 위치에서 참조만 하도록 만듭니다.

import torch

x = torch.tensor([1, 2, 3])         # shape: [3]
x = x.unsqueeze(0)                  # shape: [1, 3]

y = x.expand(4, 3)                  # shape: [4, 3]
print(y)

 

출력 결과:

tensor([[1, 2, 3],
        [1, 2, 3],
        [1, 2, 3],
        [1, 2, 3]])

 

중요: expand()는 실제 메모리를 복사하지 않습니다. 따라서 연산 효율이 좋고, 메모리 사용량도 증가하지 않습니다.

 

repeat()란?

 

repeat()은 텐서의 데이터를 **실제로 복사해서** 원하는 만큼 반복하여 확장하는 함수입니다. 따라서 메모리 사용량이 늘어나지만, 복제된 데이터를 수정할 수 있습니다.

x = torch.tensor([1, 2, 3])         # shape: [3]

y = x.repeat(4, 1)                   # shape: [4, 3]
print(y)

 

출력 결과:

tensor([[1, 2, 3],
        [1, 2, 3],
        [1, 2, 3],
        [1, 2, 3]])

 

모양은 expand()와 동일해 보이지만, 내부적으로는 **4개의 복사본이 실제로 존재**합니다.

 

또한, expend에서는 1차원이 필요해서 unsqueeze를 사용한 반면 repeat은 모든 차원에서 사용이 가능합니다. 

x = torch.randn(2, 3)
x.expand(4, 3)  # 오류 발생: 차원이 1이 아니라 확장 불가

 

 

PyTorch에서 expand()repeat()는 둘 다 텐서의 크기를 확장하는 데 쓰이지만, 동작 방식과 메모리 사용 방식이 완전히 다릅니다. 따라서 성능, 메모리 사용, 복사 여부 등 상황에 따라 적절히 선택해야 합니다.

많은 경우 expand()를 먼저 시도하고, inplace 수정이 필요하거나 완전한 복사가 필요한 경우 repeat()로 바꾸는 것이 좋습니다.

 

감사합니다!

728x90