Training & evaluation with the built-in methods

Training & evaluation with the built-in methods

Keras 모델을 학습시키고 평가하는 가장 기본적인 방법은, 내장 API인 Model.fit(), Model.evaluate(), Model.predict()를 쓰는 거예요. Sequential 모델이든 Functional API 모델이든, 서브클래싱으로 직접 만든 모델이든, 내장 루프를 쓰든 직접 루프를 작성하든 학습·평가는 모든 Keras 모델에서 똑같이 동작해요. 이 가이드에서는 내장 메서드를 중심으로 학습·평가·추론의 흐름을 살펴볼게요.

출처: Training & evaluation with the built-in methods · Keras Guides

소개

이 가이드는 Model.fit(), Model.evaluate(), Model.predict() 같은 내장 API를 사용해 모델을 학습·평가·추론(예측)하는 방법을 다뤄요. fit()을 쓰면서도 자신만의 학습 스텝 함수를 지정하고 싶다면, "Writing a custom train step" 가이드(Backend별)를 참고하세요.

데이터 넣기 — 첫 end-to-end 예시

모델의 내장 학습 루프에 데이터를 넘길 때는 다음 중 하나를 쓰면 돼요.

  • NumPy 배열 (데이터가 작고 메모리에 들어갈 때)
  • keras.utils.PyDataset 서브클래스
  • tf.data.Dataset 객체
  • PyTorch DataLoader 인스턴스

MNIST 데이터를 NumPy 배열로 사용해 옵티마이저·손실·메트릭 사용법을 먼저 살펴볼게요. Functional API로 이렇게 모델을 만든다고 해 볼게요.

inputs = keras.Input(shape=(784,), name="digits")
x = layers.Dense(64, activation="relu", name="dense_1")(inputs)
x = layers.Dense(64, activation="relu", name="dense_2")(x)
outputs = layers.Dense(10, activation="softmax", name="predictions")(x)
model = keras.Model(inputs=inputs, outputs=outputs)

compile()으로 학습 구성(옵티마이저, 손실, 메트릭)을 지정해요.

model.compile(
    optimizer=keras.optimizers.RMSprop(),  # Optimizer
    loss=keras.losses.SparseCategoricalCrossentropy(),  # Loss function to minimize
    metrics=[keras.metrics.SparseCategoricalAccuracy()],  # List of metrics to monitor
)

fit()을 호출하면 데이터를 batch_size 크기의 "배치"로 잘라 주어진 epochs 횟수만큼 전체 데이터셋을 반복하며 학습해요.

print("Fit model on training data")
history = model.fit(
    x_train,
    y_train,
    batch_size=64,
    epochs=2,
    # We pass some validation for
    # monitoring validation loss and metrics
    # at the end of each epoch
    validation_data=(x_val, y_val),
)

evaluate()로 테스트 데이터에서 모델을 평가하고, predict()로 새 데이터에서 예측(확률)을 만들어요.

# Evaluate the model on the test data using `evaluate`
print("Evaluate on test data")
results = model.evaluate(x_test, y_test, batch_size=128)
print("test loss, test acc:", results)
# Generate predictions (probabilities -- the output of the last layer)
# on new data using `predict`

compile(): 손실·메트릭·옵티마이저 지정

fit()으로 모델을 학습하려면 손실 함수, 옵티마이저, 그리고 선택적으로 감시할 메트릭을 지정해야 해요. 이를 compile() 메서드의 인자로 모델에 넘겨요.

model.compile(
    optimizer=keras.optimizers.RMSprop(learning_rate=1e-3),
    loss=keras.losses.SparseCategoricalCrossentropy(),
    metrics=[keras.metrics.SparseCategoricalAccuracy()],
)

다양한 내장 옵티마이저·손실·메트릭

대부분의 경우 손실·메트릭·옵티마이저를 처음부터 만들 필요가 없어요. 필요한 게 이미 Keras API에 있기 때문이에요. 옵티마이저로는 SGD()(모멘텀 포함 가능), RMSprop(), Adam() 등이 있고, 손실·메트릭도 비슷하게 다양하게 준비돼 있어요.

커스텀 손실

커스텀 손실이 필요하면 Keras는 세 가지 방법을 제공해요. 첫 번째는 y_truey_pred를 받는 함수를 만드는 것. 실제 데이터와 예측 사이의 평균 제곱 오차를 계산하는 손실 함수 예시를 아래와 같이 만들 수 있어요. y_truey_pred 외에 파라미터를 받아야 한다면 keras.losses.Loss 클래스를 서브클래싱해 __init__(self)(손실 호출 시 전달할 파라미터 수락)와 call(self, y_true, y_pred)(손실 계산) 두 메서드를 구현하면 돼요.

커스텀 메트릭

API에 없는 메트릭이 필요하면 keras.metrics.Metric 클래스를 서브클래싱해 쉽게 만들 수 있어요. 네 가지 메서드를 구현해야 해요.

PyTorch DataLoader로 학습·평가

내장 학습·평가 API는 모두 torch.utils.data.Datasettorch.utils.data.DataLoader 객체와도 호환돼요. PyTorch 백엔드를 쓰든 JAX나 TensorFlow 백엔드를 쓰든 상관없어요.

샘플 가중치·클래스 가중치

Model.fit()class_weight 인자에 딕셔너리를 넘겨 클래스 가중치를 설정할 수 있어요. 이 딕셔너리는 클래스 인덱스를 해당 클래스의 샘플에 적용할 가중치로 매핑해요. 리샘플링 없이 클래스를 균형 잡거나, 특정 클래스에 더 중요도를 주는 학습에 사용할 수 있어요.

콜백 사용

Keras의 콜백은 학습 중 여러 시점(에폭 시작, 배치 종료, 에폭 종료 등)에 호출되는 객체예요. 학습률 감소, 조기 종료, 체크포인트 저장 같은 특정 동작을 구현하는 데 써요.

학습률 스케줄

학습률 감쇠 스케줄은 정적(현재 에폭·배치 인덱스의 함수로 미리 고정)일 수도, 동적(현재 모델 동작, 특히 검증 손실에 반응)일 수도 있어요.

옵티마이저에 스케줄 넘기기

initial_learning_rate = 0.1
lr_schedule = keras.optimizers.schedules.ExponentialDecay(
    initial_learning_rate,
    decay_steps=100000,
    decay_rate=0.96,
    staircase=True,
)
optimizer = keras.optimizers.RMSprop(learning_rate=lr_schedule)

TensorBoard로 학습 중 손실·메트릭 시각화

TensorBoard 콜백을 사용하면 학습 중 손실·메트릭을 실시간으로 시각화할 수 있어요. 자세한 내용은 TensorBoard 콜백 문서를 참고하세요.

더 알아보기