01 텐서(Tensor) 기초 및 생성
PyTorch의 텐서(Tensor)는 다차원 배열을 다루는 핵심 단위로, NumPy와 매우 유사하지만 GPU 가속을 지원합니다.
| 생성 기법 | 사용 함수 | 설명 |
|---|---|---|
| 직접 생성 | torch.tensor() | 리스트나 배열로부터 텐서를 생성 |
| 0으로 초기화 | torch.zeros() | 모든 요소를 0으로 채운 텐서 생성 |
| 1로 초기화 | torch.ones() | 모든 요소를 1로 채운 텐서 생성 |
| 정규분포 난수 | torch.randn() | 평균 0, 표준편차 1의 난수 생성 |
import torch
# 직접 데이터 생성
x = torch.tensor([[1, 2], [3, 4]])
# 3x4 크기의 0 텐서 생성
zeros = torch.zeros(3, 4)
# 정규분포 난수 생성
randn = torch.randn(2, 2)
02 텐서 형상 변환 및 속성
텐서의 모양을 바꾸거나 속성을 확인하는 기능은 딥러닝 모델 구현에서 필수적입니다.
🔍 텐서의 3대 속성
1. shape: 텐서의 차원 크기 확인
2. dtype: 데이터 타입 확인 (float32, int64 등)
3. device: 텐서가 저장된 장치 (CPU 또는 CUDA)
x = torch.randn(3, 4)
# 1. view() vs reshape()
y = x.view(2, 6) # 메모리 공유 (연속성 필요)
z = x.reshape(12, 1) # 유연한 형상 변환 (권장)
# 2. 차원 조작
a = torch.zeros(1, 3, 1, 4)
b = a.squeeze() # 크기가 1인 모든 차원 제거
c = b.unsqueeze(0) # 0번째 인덱스에 차원 추가
03 Autograd: 자동 미분 시스템
신경망 학습의 핵심인 역전파(Backpropagation)를 자동으로 수행합니다.
미분 계산 원리
$y = f(x)$, $out = \text{mean}(y)$ 일 때,
out.backward() 호출 시 $\frac{\partial out}{\partial x}$ 가 자동으로 계산됩니다.
x = torch.tensor([2.0, 3.0], requires_grad=True)
y = x ** 2
out = y.mean()
# 역전파 수행 (미분 시작)
out.backward()
print(f"x의 미분값: {x.grad}") # tensor([2.0000, 3.0000])
04 신경망 구축 (torch.nn)
nn.Module을 상속받아 복잡한 딥러닝 아키텍처를 설계할 수 있습니다.
import torch.nn as nn
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
# 784개 입력 노드 -> 10개 출력 노드 (Linear Layer)
self.fc = nn.Linear(784, 10)
def forward(self, x):
# 순전파 과정 정의
return self.fc(x)
model = SimpleNet()
05 데이터 처리 (Dataset & DataLoader)
대량의 데이터를 미니배치(Mini-batch)로 나누어 학습 모델에 효율적으로 공급합니다.
from torch.utils.data import Dataset, DataLoader
class MyDataset(Dataset):
def __init__(self, data): self.data = data
def __len__(self): return len(self.data)
def __getitem__(self, idx): return self.data[idx]
# DataLoader: 배치 크기 설정 및 셔플(Shuffle) 지원
loader = DataLoader(dataset, batch_size=32, shuffle=True)
06 학습 루프 및 최적화 기법
손실 함수로 오차를 계산하고, 옵티마이저를 통해 파라미터를 업데이트합니다.
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()
for epoch in range(epochs):
for inputs, labels in loader:
# 1. 그래디언트 초기화 (필수)
optimizer.zero_grad()
# 2. 모델 예측 (Forward)
outputs = model(inputs)
# 3. 오차 계산 (Loss)
loss = criterion(outputs, labels)
# 4. 역전파 (Backward)
loss.backward()
# 5. 가중치 업데이트 (Step)
optimizer.step()
07 고급 기법 (GPU 가속 및 저장)
| 구분 | 코드 예시 | 비고 |
|---|---|---|
| 장치 설정 | device = 'cuda' if torch.cuda.is_available() else 'cpu' | GPU 사용 가능 여부 확인 |
| 모델 저장 | torch.save(model.state_dict(), 'model.pth') | 파라미터만 저장 (권장) |
| 모델 로드 | model.load_state_dict(torch.load('model.pth')) | 저장된 파라미터 불러오기 |
🚀 .to(device) 사용 팁
모델과 데이터는 반드시 같은 장치(CPU/GPU)에 있어야 합니다. model.to(device)와 data.to(device)를 습관화하세요.