✅ 이 세 가지 방법 모두 NumPy 배열을 PyTorch 텐서로 변환하지만, 데이터 복사 방식에서 가장 큰 차이를 보이며, 이에 따라 효율성, 메모리 사용량, 데이터 독립성이 달라집니다. 🧠
1. torch.tensor()
- 동작 방식: NumPy 배열의 데이터를 복사하여 완전히 새로운 텐서를 생성합니다. 🆕
- 장점:
- 데이터 독립성: 원본 NumPy 배열을 수정해도 새로 생성된 텐서에는 영향을 주지 않으며, 반대로 텐서를 수정해도 원본 NumPy 배열은 그대로 유지됩니다. 🛡️
- 유연성: CPU뿐만 아니라 GPU 등 원하는 장치에 텐서를 직접 생성할 수 있습니다.
- 단점:
- 비효율적: 데이터를 복사하기 때문에 메모리 사용량이 늘어나고, 특히 큰 배열의 경우 처리 속도가 느려질 수 있습니다. 🐢
2. torch.from_numpy()
- 동작 방식: NumPy 배열과 동일한 메모리 공간을 공유하는 텐서를 생성합니다. 🤝
- 장점:
- 매우 효율적: 데이터를 복사하지 않으므로 메모리 사용이 적고 생성 속도가 매우 빠릅니다. 🚀
- 단점:
- 데이터 연동: 원본 NumPy 배열을 수정하면 텐서의 값도 변경되고, 텐서를 수정하면 NumPy 배열의 값도 변경됩니다. (둘이 같은 데이터를 가리키기 때문) 🔗
- CPU 전용: 이 함수는 CPU에 있는 NumPy 배열에만 사용할 수 있습니다. GPU에 있는 배열에는 사용할 수 없습니다. 💻
3. torch.as_tensor()
- 동작 방식: torch.from_numpy()와 유사하게, 가능하다면 메모리를 공유하려 시도합니다. 하지만 입력이 NumPy 배열이 아니거나, dtype 또는 device가 다를 경우 데이터를 복사하여 텐서를 생성하기도 합니다. 💡
- 장점:
- 효율성: NumPy 배열이 CPU에 있을 때는 from_numpy()처럼 메모리 공유를 통해 효율적입니다.
- 유연성: from_numpy()보다 더 다양한 입력 타입을 처리할 수 있으며, 데이터 복사를 꼭 피해야 할 상황이 아니라면 여러 경우에 유용합니다.
- 단점:
- 예측 가능성: torch.tensor()처럼 항상 복사를 보장하는 것이 아니기 때문에, 데이터를 독립적으로 유지해야 하는 상황에서는 주의가 필요할 수 있습니다. (항상 메모리를 공유하는 것은 아님) 🤔
🚀 요약 비교
| 기능 / 방법 | torch.tensor() | torch.from_numpy() | torch.as_tensor() (NumPy CPU 입력 시) |
| 데이터 복사 | 항상 복사 | 메모리 공유 | 메모리 공유 (가능한 경우) |
| 데이터 독립성 | 높음 | 낮음 | 낮음 |
| 효율성 (속도/메모리) | 낮음 | 매우 높음 | 높음 |
| NumPy 배열 장치 | CPU/GPU 무관 (새 생성) | CPU만 가능 | CPU만 가능 |
| 주요 용도 | 독립적인 텐서 생성 | 빠른 CPU 데이터 변환 | 효율적이고 유연한 변환 |
Sheets로 내보내기
🎨 쉬운 비유
이 세 가지 방법은 선물 포장에 비유할 수 있어요. 🎁
- torch.tensor(): 새 상품을 구매해서 포장하는 것. 상품 자체는 원래 있던 것과 완전히 분리되어 있습니다.
- torch.from_numpy(): 선물 가게에서 포장 서비스를 받는 것. 선물(NumPy 배열) 자체는 그대로 두고, 포장지만 씌우는 거라 선물과 포장지가 서로에게 영향을 줄 수 있습니다 (내용물이나 포장재를 바꿀 수 있음).
- torch.as_tensor(): 스마트한 선물 준비. 만약 원래 있던 물건(NumPy 배열)이 이미 원하는 포장 상태(CPU, 동일 dtype)라면 그냥 그대로 사용하고, 아니라면 새로 포장(복사)해주는 방식입니다.
어떤 방법을 선택할지는 데이터를 독립적으로 유지할 필요가 있는지 또는 메모리와 속도 효율성이 얼마나 중요한지에 따라 결정됩니다.
'AI 엔지니어준비' 카테고리의 다른 글
| ❓ reshape 메소드에서 -1에 대해서 (0) | 2025.09.08 |
|---|---|
| ❓ torch.matmul이 데이터 타입이 달라 오류를 발생시키는가? (0) | 2025.09.08 |
| ❓ 딥러닝 모델의 성능을 향상시키기 위해 조정하는 하이퍼파라미터의 종류 (0) | 2025.09.08 |
| ❓ 딥러닝과 머신러닝의 관계? (0) | 2025.09.08 |
| ❓ 은닉 상태(Hidden State)란? (0) | 2025.09.05 |