딥러닝 개요
1. gradient
print("변수 x의 data:", x.data)
print("변수 x의 gradient값(미분계산값):", x.grad)
y = x ** 2
y.data, y.grad_fn
y.backward()
x.grad
x = torch.tensor([1.0], requires_grad=True)
print(x.data, x.grad)
2. 여러 변수 gradient
x = torch.tensor([1.0], requires_grad=True)
y = torch.tensor([2.0], requires_grad=True)
z = x + y
z.backward()
print(x.data, x.grad)
print(y.data, y.grad)
3. 합성함수 미분
a = torch.tensor([3.0], requires_grad=True)
b = torch.tensor([4.0], requires_grad=True)
z = a * b
z.backward()
a.data, a.grad
b.data, b.grad
4. no_grad
with torch.no_grad():
z = a * a
print(z.grad_fn)
print(a.requires_grad)
5. gradient 초기화
x = torch.tensor([1.0], requires_grad=True)
x.grad = None
텐서 다루기
1. 파라미터 선언
W = torch.tensor([2.0], requires_grad=True)
b = torch.tensor([1.0], requires_grad=True)
2. forward
pred = W * x + b
3. 손실 계산
loss = torch.mean((pred - y) ** 2)
4. backward
loss.backward()
5. 경사하강 업데이트
with torch.no_grad():
W -= lr * W.grad
b -= lr * b.grad
MNIST MLP 구현
1. 모델 정의
class MNISTModel(nn.Module):
def __init__(self):
super().__init__()
self.layers = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 128),
nn.ReLU(),
nn.Linear(128, 10)
)
def forward(self, x):
x = x.view(x.size(0), -1)
return self.layers(x)
2. 학습 준비
model = MNISTModel().to(device)
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
3. 루프
train_loss_list = []
valid_loss_list = []
valid_acc_list = []
for epoch in range(epochs):
model.train()
train_loss = 0
for X, y in train_loader:
X, y = X.to(device), y.to(device)
pred = model(X)
loss = loss_fn(pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss += loss.item()
4. 시각화
plt.plot(train_loss_list)
plt.plot(valid_loss_list)
plt.plot(valid_acc_list)
plt.grid(True, linestyle=":")
plt.show()
5. 모델 저장/로드
torch.save(model, save_path)
load_model = torch.load(save_path, weights_only=True)
load_model.eval()
6. 테스트
p = load_model(X_test)
p_class = p.argmax(dim=-1)
torch.sum(y_test == p_class).item()
7. 이미지 로드 함수
from PIL import Image
def load_data(device="cpu", *path):
img = Image.open(path[i])
tensor = transform(img)
return tensor
8. 예측 함수
def predict(model, inputs, device="cpu"):
pred = model(inputs)
pred_class = pred.argmax(dim=-1)
return pred_class
9. 이미지 시각화
plt.figure(figsize=(10, 5))
for idx, (path, label) in enumerate(zip(file_list, result_pred)):
plt.subplot(1, len(file_list), idx+1)
plt.imshow(Image.open(path), cmap="gray")
plt.title(f"Pred: {label}")
plt.axis("off")
plt.show()
종합 평가
1. 딥러닝 학습 구조(Forward–Loss–Backward–Update) 완전 이해.
2. autograd 원리 직접 실험하여 gradient 개념 명확히 확보.
3. 텐서 조작 능력.
4. 선형회귀 모델 직접 구현으로 경사하강법.
5. MNIST MLP 모델 구현 및 추론까지 전체 파이프라인.