PyTorch 생태계와 텐서의 흐름
텐서는 PyTorch의 혈액
섹션 제목: “텐서는 PyTorch의 혈액”딥러닝 파이프라인을 인체에 비유한다면, 텐서는 혈액과 같습니다. 데이터가 Dataset에서 출발해 DataLoader를 거쳐 Model을 통과하고 Loss까지 — 이 모든 과정에서 데이터는 텐서 형태로 흐릅니다.
PyTorch 생태계 구성요소
섹션 제목: “PyTorch 생태계 구성요소”원본 데이터 (이미지, 텍스트, CSV...) ↓ [ Dataset ] 데이터를 읽고 텐서로 변환 ↓ [ DataLoader ] 배치 단위로 묶어 공급 ↓ [ Model (nn.Module) ] 텐서 → 텐서 연산 ↓ [ Loss Function ] 예측값과 정답의 차이를 텐서로 계산 ↓ [ Optimizer ] 그레디언트로 파라미터 텐서 업데이트 ↓ 반복 학습각 단계에서 텐서가 어떤 형태로 존재하는지 살펴봅니다.
단계별 텐서의 모습
섹션 제목: “단계별 텐서의 모습”Dataset — 텐서로 변환
섹션 제목: “Dataset — 텐서로 변환”from torch.utils.data import Datasetimport torch
class SimpleDataset(Dataset): def __init__(self): # 원본 데이터: Python 리스트 self.X = [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]] self.y = [0, 1, 0]
def __len__(self): return len(self.X)
def __getitem__(self, idx): # 반환값은 텐서 x = torch.tensor(self.X[idx]) # shape: (2,) y = torch.tensor(self.y[idx]) # shape: () 스칼라 return x, y
dataset = SimpleDataset()x_sample, y_sample = dataset[0]print(x_sample.shape) # torch.Size([2])print(y_sample) # tensor(0)DataLoader — 배치 텐서로 묶기
섹션 제목: “DataLoader — 배치 텐서로 묶기”from torch.utils.data import DataLoader
loader = DataLoader(dataset, batch_size=2, shuffle=True)
for X_batch, y_batch in loader: print(X_batch.shape) # torch.Size([2, 2]) ← (배치, 특성) print(y_batch.shape) # torch.Size([2]) breakModel — 텐서 in, 텐서 out
섹션 제목: “Model — 텐서 in, 텐서 out”import torch.nn as nn
class SimpleModel(nn.Module): def __init__(self): super().__init__() self.linear = nn.Linear(2, 1) # 입력 2, 출력 1
def forward(self, x): return self.linear(x) # 텐서를 받아 텐서를 반환
model = SimpleModel()x = torch.tensor([[1.0, 2.0]]) # shape: (1, 2)output = model(x)print(output.shape) # torch.Size([1, 1])Loss — 차이를 텐서로
섹션 제목: “Loss — 차이를 텐서로”loss_fn = nn.MSELoss()
prediction = torch.tensor([[0.8]])target = torch.tensor([[1.0]])
loss = loss_fn(prediction, target)print(loss) # tensor(0.0400) ← 스칼라 텐서print(loss.shape) # torch.Size([])Optimizer — 파라미터 텐서 업데이트
섹션 제목: “Optimizer — 파라미터 텐서 업데이트”import torch.optim as optim
optimizer = optim.SGD(model.parameters(), lr=0.01)
optimizer.zero_grad() # 이전 그레디언트 초기화loss.backward() # 역전파: 각 파라미터의 그레디언트 계산optimizer.step() # 파라미터 텐서 업데이트PyTorch 설치 가이드
섹션 제목: “PyTorch 설치 가이드”pip 설치 (권장 — CPU)
섹션 제목: “pip 설치 (권장 — CPU)”pip install torch torchvision torchaudiopip 설치 (CUDA 12.1 GPU)
섹션 제목: “pip 설치 (CUDA 12.1 GPU)”pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121conda 설치
섹션 제목: “conda 설치”conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia설치 확인
섹션 제목: “설치 확인”import torch
print(torch.__version__) # 예: 2.2.0print(torch.cuda.is_available()) # GPU 사용 가능 여부print(torch.backends.mps.is_available()) # Apple Silicon 여부
# 간단한 동작 테스트x = torch.tensor([1.0, 2.0, 3.0])print(x * 2) # tensor([2., 4., 6.])첫 텐서 코드 — 선형 회귀
섹션 제목: “첫 텐서 코드 — 선형 회귀”PyTorch로 간단한 선형 회귀를 처음부터 구현하며 텐서 흐름 전체를 경험해봅니다.
import torchimport torch.nn as nnimport torch.optim as optim
# 1. 데이터 준비 — 텐서로X = torch.tensor([[1.0], [2.0], [3.0], [4.0]]) # shape: (4, 1)y = torch.tensor([[2.0], [4.0], [6.0], [8.0]]) # y = 2x
# 2. 모델 정의model = nn.Linear(1, 1) # 파라미터: weight, bias (모두 텐서)
# 3. 손실 함수와 옵티마이저loss_fn = nn.MSELoss()optimizer = optim.SGD(model.parameters(), lr=0.01)
# 4. 학습 루프 — 텐서가 계속 흐름for epoch in range(100): # 순전파 prediction = model(X) # 텐서 → 텐서 loss = loss_fn(prediction, y) # 스칼라 텐서
# 역전파 optimizer.zero_grad() loss.backward() optimizer.step()
if (epoch + 1) % 20 == 0: print(f"Epoch {epoch+1:3d} | Loss: {loss.item():.6f}")
# 5. 결과 확인with torch.no_grad(): pred = model(torch.tensor([[5.0]])) print(f"\n5에 대한 예측: {pred.item():.4f}") # ≈ 10.0 print(f"학습된 weight: {model.weight.item():.4f}") # ≈ 2.0 print(f"학습된 bias : {model.bias.item():.4f}") # ≈ 0.0예상 출력:
Epoch 20 | Loss: 0.123456Epoch 40 | Loss: 0.045678Epoch 60 | Loss: 0.016789Epoch 80 | Loss: 0.006123Epoch 100 | Loss: 0.002234
5에 대한 예측: 9.9821학습된 weight: 1.9956학습된 bias : 0.0134PyTorch 생태계 주요 라이브러리
섹션 제목: “PyTorch 생태계 주요 라이브러리”| 라이브러리 | 용도 | 텐서와의 관계 |
|---|---|---|
| torchvision | 이미지 처리, 사전학습 모델 | 이미지 → (C, H, W) 텐서 |
| torchaudio | 오디오 처리 | 오디오 → (채널, 시간) 텐서 |
| torchtext | 텍스트 처리 | 토큰 → (배치, 시퀀스) 텐서 |
| torch.nn | 신경망 레이어 | 텐서 → 텐서 변환 |
| torch.optim | 최적화 알고리즘 | 파라미터 텐서 업데이트 |
핵심 요약
섹션 제목: “핵심 요약”- PyTorch 파이프라인의 모든 단계에서 데이터는 텐서 형태로 흐른다
- Dataset → DataLoader → Model → Loss → Optimizer 순서로 텐서가 변환됨
- 설치는 pytorch.org 에서 환경에 맞는 명령어 확인
torch.no_grad()로 추론 시 메모리 절약
퀴즈를 불러오는 중...