📚 PyTorch 완벽 가이드

텐서 기초부터 신경망 구축, 최적화, 고급 기법까지 실전 프레임워크 완전 정복
Appendix D - AI Framework Series

📑 목차 (Table of Contents)

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)를 습관화하세요.