본문 바로가기
C.W.K.
Stream
Lesson 03 of 06 · published

전체 수동 학습 루프

~8 min · custom-train

Level 0Keras 도제
0 XP0/97 lessons0/20 achievements
0/120 XP to next level120 XP to go0% complete

반복 구조 자체를 직접 소유해야 할 때

전체 수동 루프는 두 번째 선택지야. fit()에 운전대를 맡기지 않고 에포크와 배치 반복을 직접 작성하지. 원하는 시점에 평가를 끼우거나 사용자 정의 일정에 따라 분기하고, 배치 사이에 별도 작업을 실행할 수 있는 완전한 제어를 얻어. 대신 진행 표시줄, 콜백, 체크포인트, 분산 처리처럼 물려받던 편의도 사라져. 이전에는 설정 한 줄이던 기능을 이제 직접 구현하고 유지해야 해.

수동 루프의 공통 뼈대

바깥에는 에포크 반복, 안쪽에는 데이터셋 반복이 있고, 각 단계는 순전파 → 손실 계산 → 그래디언트 계산 → 옵티마이저 갱신 순서로 진행돼. 순전파와 손실 계산은 비교적 공통으로 작성할 수 있지만 그래디언트 단계는 백엔드에 종속돼. 아래 예시는 TensorFlow의 tf.GradientTape를 사용하고, PyTorch라면 loss.backward(), JAX라면 jax.grad가 필요해. 이 차이 때문에 완전히 백엔드 독립적인 수동 루프는 만들 수 없어.

Code

수동 학습 루프(TensorFlow 백엔드)·python
import tensorflow as tf
import keras

optimizer = keras.optimizers.Adam(1e-3)
loss_fn = keras.losses.SparseCategoricalCrossentropy()

for epoch in range(10):
    for step, (x_batch, y_batch) in enumerate(train_dataset):
        with tf.GradientTape() as tape:
            # Forward pass with gradient tracking
            y_pred = model(x_batch, training=True)
            loss = loss_fn(y_batch, y_pred)

        # Compute gradients and update weights (TF-native)
        grads = tape.gradient(loss, model.trainable_variables)
        optimizer.apply_gradients(
            zip(grads, model.trainable_variables)
        )

    print(f"Epoch {epoch}, Loss: {float(loss):.4f}")

External links

Exercise

fit() 없이 MNIST의 전체 수동 학습 루프를 작성해. 검증 단계와 최적 모델 저장도 포함하고, fit() 기반 버전과 비교해 어떤 기능을 직접 구현해야 했는지 기록해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.