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()로 바꾸는 것이 좋습니다.
감사합니다!
'프로그래밍 > Python' 카테고리의 다른 글
| Python 함수 위 @ - 데코레이터 란 (8) | 2025.07.15 |
|---|---|
| Python *args, **kwargs 의미 (20) | 2025.07.14 |
| Python squeeze 및 unsqueeze 함수 - view와의 차이 (4) | 2025.07.12 |
| Python reshape 함수 - view, flatten과의 차이 (20) | 2025.07.11 |
| Python ArgumentParser 정리 (16) | 2025.07.10 |