[플레이데이터 SK 네트웍스 Family AI 캠프 21기] 11월 2주차 회고

조남웅·2025년 11월 16일

딥러닝 개요

1. gradient

# gradient를 계산할 tensor는 requires_grad=True 로 설정.
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 모델 구현 및 추론까지 전체 파이프라인.
profile
파이팅...

0개의 댓글