본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 2. · 13 Views
Callbacks와 학습 최적화 완벽 가이드
딥러닝 모델 훈련 과정에서 필수적인 Callback 시스템을 알아봅니다. EarlyStopping, ModelCheckpoint, ReduceLROnPlateau 등 핵심 콜백들의 원리와 활용법을 실무 예제와 함께 친절하게 설명합니다.
목차
- Callback 시스템 이해
- EarlyStopping으로 조기 종료
- ModelCheckpoint로 체크포인트 저장
- ReduceLROnPlateau 학습률 조정
- TensorBoard 시각화
- 커스텀 Callback 만들기
1. Callback 시스템 이해
김개발 씨는 딥러닝 모델을 훈련시키면서 고민에 빠졌습니다. 훈련이 언제 끝날지도 모르고, 중간에 컴퓨터가 꺼지면 어떡하지?
훈련 과정을 지켜보고 싶은데 매번 화면만 뚫어지게 쳐다볼 수도 없는 노릇입니다.
Callback은 모델 훈련 과정에서 특정 시점마다 자동으로 실행되는 함수들의 집합입니다. 마치 요리할 때 타이머를 맞춰두고 알람이 울리면 확인하는 것과 같습니다.
에포크가 시작될 때, 배치가 끝날 때, 훈련이 완료될 때 등 원하는 시점에 원하는 동작을 수행할 수 있습니다.
다음 코드를 살펴봅시다.
import tensorflow as tf
from tensorflow.keras.callbacks import Callback
# 기본 콜백 사용 예시
model = tf.keras.Sequential([
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='categorical_crossentropy')
# callbacks 파라미터에 리스트로 전달합니다
history = model.fit(
x_train, y_train,
epochs=100,
callbacks=[callback1, callback2, callback3] # 여러 콜백 동시 사용
)
김개발 씨는 입사 6개월 차 머신러닝 엔지니어입니다. 어느 날 중요한 이미지 분류 모델을 훈련시키게 되었는데, 100 에포크짜리 훈련을 시작하고 나니 막막해졌습니다.
밤새 돌아가는 훈련을 어떻게 관리해야 할까요? 선배 개발자 박시니어 씨가 지나가다 김개발 씨의 화면을 봤습니다.
"아직도 콜백 안 쓰고 있어요? 그러면 훈련하는 동안 아무것도 못 하잖아요." 그렇다면 Callback이란 정확히 무엇일까요?
쉽게 비유하자면, 콜백은 마치 집사와 같습니다. 주인이 "매 시간마다 온도를 확인하고, 너무 높으면 에어컨을 켜줘"라고 지시해두면 집사는 알아서 그 일을 수행합니다.
딥러닝에서 콜백도 마찬가지입니다. "매 에포크가 끝날 때마다 손실 값을 확인하고, 더 이상 개선되지 않으면 훈련을 중단해줘"라고 지시할 수 있습니다.
콜백이 없던 시절에는 어땠을까요? 개발자들은 훈련이 끝날 때까지 무작정 기다려야 했습니다.
과적합이 발생해도 모른 채 훈련이 계속되었고, 갑자기 컴퓨터가 꺼지면 모든 진행 상황을 잃어버렸습니다. 더 큰 문제는 훈련 과정을 실시간으로 모니터링할 방법이 마땅치 않았다는 것입니다.
바로 이런 문제를 해결하기 위해 Callback 시스템이 등장했습니다. Keras의 콜백 시스템은 훈련 생명주기의 다양한 시점에 개입할 수 있게 해줍니다.
on_epoch_begin, on_epoch_end, on_batch_begin, on_batch_end, on_train_begin, on_train_end 등 원하는 시점을 선택할 수 있습니다. 위의 코드를 살펴보면, model.fit() 함수의 callbacks 파라미터에 리스트 형태로 콜백들을 전달합니다.
여러 개의 콜백을 동시에 사용할 수 있으며, 순서대로 실행됩니다. 이것이 콜백 시스템의 기본 사용법입니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 의료 영상 분석 모델을 훈련한다고 가정해봅시다.
훈련에 며칠이 걸릴 수 있는데, 콜백을 활용하면 최적의 모델을 자동 저장하고, 학습률을 동적으로 조정하며, 과적합 징후가 보이면 즉시 훈련을 중단할 수 있습니다. 하지만 주의할 점도 있습니다.
너무 많은 콜백을 사용하면 훈련 속도가 느려질 수 있습니다. 또한 콜백 간의 순서도 중요합니다.
예를 들어 EarlyStopping이 ModelCheckpoint보다 먼저 실행되면 최적의 모델이 저장되지 않을 수 있습니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
박시니어 씨의 설명을 들은 김개발 씨는 눈이 반짝였습니다. "이제 밤새 모니터 앞에 앉아있지 않아도 되겠네요!"
실전 팁
💡 - callbacks 파라미터는 항상 리스트 형태로 전달해야 합니다
- 콜백의 순서가 실행 순서에 영향을 주므로 신중하게 배치하세요
- Keras는 다양한 내장 콜백을 제공하니 먼저 내장 콜백을 검토한 후 커스텀 콜백을 고려하세요
2. EarlyStopping으로 조기 종료
김개발 씨가 모델을 훈련시켰는데, 어느 순간부터 검증 손실이 오히려 올라가기 시작했습니다. 이미 50 에포크나 더 진행된 후였습니다.
"아, 진작 멈췄어야 했는데..." 시간과 자원을 낭비한 김개발 씨는 한숨을 쉬었습니다.
EarlyStopping은 모델의 성능이 더 이상 개선되지 않을 때 훈련을 자동으로 중단하는 콜백입니다. 마치 달리기를 하다가 더 이상 기록이 좋아지지 않으면 무리하지 않고 멈추는 것과 같습니다.
과적합을 방지하고 훈련 시간을 절약하는 핵심 도구입니다.
다음 코드를 살펴봅시다.
from tensorflow.keras.callbacks import EarlyStopping
# EarlyStopping 콜백 설정
early_stopping = EarlyStopping(
monitor='val_loss', # 모니터링할 지표
patience=10, # 개선 없이 기다릴 에포크 수
min_delta=0.001, # 개선으로 인정할 최소 변화량
mode='min', # 'min': 작을수록 좋음, 'max': 클수록 좋음
restore_best_weights=True # 최적 가중치 복원
)
# 훈련에 적용
history = model.fit(
x_train, y_train,
validation_data=(x_val, y_val),
epochs=1000, # 충분히 크게 설정
callbacks=[early_stopping]
)
김개발 씨는 이미지 분류 모델을 훈련시키고 있었습니다. 에포크 30까지는 검증 손실이 착실히 줄어들었는데, 그 이후로는 오히려 손실이 증가하기 시작했습니다.
전형적인 과적합 현상입니다. 박시니어 씨가 물었습니다.
"에포크를 몇으로 설정했어요?" 김개발 씨가 대답했습니다. "100이요." 박시니어 씨가 고개를 저었습니다.
"그럼 70 에포크나 낭비한 거네요. EarlyStopping 써야죠." EarlyStopping을 쉽게 비유하자면, 수능 공부를 하는 학생과 같습니다.
매일 모의고사를 보는데, 10일 연속으로 점수가 오르지 않으면 더 이상 무리하게 공부하지 않고 휴식을 취하는 것입니다. 무작정 달리는 것보다 효율적인 공부를 하는 것이지요.
가장 중요한 파라미터는 monitor입니다. 어떤 지표를 기준으로 조기 종료를 결정할지 정합니다.
일반적으로 'val_loss'(검증 손실)를 사용하지만, 'val_accuracy'나 다른 커스텀 지표도 사용할 수 있습니다. patience는 성능 개선 없이 기다릴 에포크 수입니다.
예를 들어 patience=10이면, 10 에포크 동안 개선이 없을 때 훈련을 중단합니다. 너무 작으면 일시적인 변동에 민감하게 반응하고, 너무 크면 불필요한 훈련이 계속됩니다.
min_delta는 개선으로 인정할 최소 변화량입니다. 손실이 0.0001 정도 줄어든 것을 개선으로 볼지 말지 결정합니다.
이 값을 적절히 설정하면 의미 없는 미세한 변동에 휘둘리지 않습니다. mode 파라미터는 지표의 방향을 설정합니다.
손실처럼 작을수록 좋은 지표는 'min', 정확도처럼 클수록 좋은 지표는 'max'로 설정합니다. 'auto'로 설정하면 Keras가 자동으로 판단합니다.
가장 중요한 것은 restore_best_weights=True 설정입니다. 이것을 True로 설정하면 훈련이 종료될 때 가장 좋았던 시점의 가중치로 자동 복원됩니다.
설정하지 않으면 마지막 에포크의 가중치가 유지되어 과적합된 모델을 사용하게 될 수 있습니다. 실무에서는 epochs를 넉넉하게 설정하고 EarlyStopping에게 최적의 종료 시점을 맡기는 것이 일반적입니다.
epochs=1000으로 설정해도 EarlyStopping이 알아서 적절한 시점에 멈춥니다. 주의할 점은 검증 데이터가 반드시 필요하다는 것입니다.
validation_data를 제공하지 않으면 val_loss를 모니터링할 수 없습니다. 또한 patience를 너무 작게 설정하면 충분히 학습하기 전에 멈출 수 있으니 주의하세요.
김개발 씨는 EarlyStopping을 적용한 후 다시 훈련을 시작했습니다. 35 에포크에서 자동으로 훈련이 중단되었고, 최적의 모델이 저장되었습니다.
"이제 밤새 걱정할 필요가 없겠네요!"
실전 팁
💡 - patience는 데이터셋 크기와 모델 복잡도에 따라 5에서 20 사이로 설정하세요
- restore_best_weights=True는 거의 필수로 사용해야 합니다
- validation_split 대신 별도의 검증 세트를 사용하면 더 안정적인 결과를 얻습니다
3. ModelCheckpoint로 체크포인트 저장
김개발 씨가 하룻밤 동안 모델을 훈련시키고 있었습니다. 다음 날 아침, 컴퓨터 앞에 앉아 결과를 확인하려는데 화면이 까맣습니다.
밤사이에 정전이 있었던 것입니다. 12시간의 훈련 결과가 모두 사라졌습니다.
ModelCheckpoint는 훈련 도중 모델의 가중치를 파일로 저장하는 콜백입니다. 마치 게임에서 세이브 포인트를 만들어두는 것과 같습니다.
갑작스러운 중단이 발생해도 마지막 체크포인트부터 다시 시작할 수 있어, 긴 훈련에서 필수적인 안전장치입니다.
다음 코드를 살펴봅시다.
from tensorflow.keras.callbacks import ModelCheckpoint
# 최고 성능 모델만 저장
checkpoint_best = ModelCheckpoint(
filepath='best_model.keras',
monitor='val_loss',
save_best_only=True, # 최고 성능일 때만 저장
save_weights_only=False, # 전체 모델 저장
mode='min',
verbose=1
)
# 매 에포크마다 저장 (파일명에 에포크 번호 포함)
checkpoint_every = ModelCheckpoint(
filepath='checkpoints/model_epoch_{epoch:02d}_loss_{val_loss:.4f}.keras',
save_freq='epoch'
)
history = model.fit(x_train, y_train, callbacks=[checkpoint_best])
정전 사고를 겪은 김개발 씨는 박시니어 씨에게 하소연했습니다. "12시간이나 돌렸는데 다 날아갔어요." 박시니어 씨가 물었습니다.
"ModelCheckpoint 안 썼어요?" 김개발 씨는 그것이 뭔지도 몰랐습니다. ModelCheckpoint를 쉽게 비유하자면, 논문을 쓸 때 중간중간 저장하는 것과 같습니다.
"Ctrl+S"를 습관적으로 누르는 이유는 갑자기 프로그램이 죽어도 작업 내용을 잃지 않기 위해서입니다. ModelCheckpoint도 마찬가지로 훈련의 진행 상황을 안전하게 보관합니다.
filepath 파라미터는 저장할 파일 경로를 지정합니다. 특별한 포맷 문자열을 사용할 수 있는데, {epoch}는 에포크 번호, {val_loss}는 검증 손실 값으로 대체됩니다.
이렇게 하면 여러 체크포인트를 구분할 수 있습니다. save_best_only=True는 가장 많이 사용하는 옵션입니다.
성능이 개선될 때만 저장하므로 디스크 공간을 절약하면서도 최적의 모델을 보관할 수 있습니다. False로 설정하면 매 에포크마다 저장됩니다.
save_weights_only 옵션도 중요합니다. True면 가중치만 저장하고, False면 모델 구조까지 함께 저장합니다.
가중치만 저장하면 파일 크기가 작아지지만, 나중에 모델 구조를 다시 정의해야 합니다. 일반적으로는 False를 권장합니다.
파일 확장자는 .keras를 사용하는 것이 최신 권장 사항입니다. 이전에는 .h5를 많이 사용했지만, Keras 3.0부터는 .keras 형식이 표준입니다.
이 형식은 모델 구조, 가중치, 옵티마이저 상태를 모두 포함합니다. 실무에서는 두 가지 체크포인트 전략을 병행하는 것이 좋습니다.
하나는 save_best_only=True로 최고 성능 모델을 저장하고, 다른 하나는 매 N 에포크마다 체크포인트를 남깁니다. 이렇게 하면 훈련 과정 분석도 가능하고 안전장치도 확보됩니다.
저장된 모델을 불러오는 방법도 알아둬야 합니다. **tf.keras.models.load_model('best_model.keras')**로 간단히 불러올 수 있습니다.
훈련을 이어서 할 수도 있고, 바로 예측에 사용할 수도 있습니다. 주의할 점은 디스크 공간입니다.
큰 모델을 매 에포크마다 저장하면 금방 디스크가 가득 찹니다. 적절한 주기로 저장하거나, 오래된 체크포인트는 삭제하는 로직을 추가하세요.
김개발 씨는 ModelCheckpoint를 설정한 후 다시 훈련을 시작했습니다. 이번에는 갑자기 중단되어도 걱정이 없습니다.
"이제 안심이네요!"
실전 팁
💡 - EarlyStopping과 함께 사용할 때는 둘 다 같은 지표를 monitor하세요
- 클라우드 환경에서는 체크포인트를 S3나 GCS에 저장하는 것도 고려하세요
- 파일명에 날짜와 시간을 포함하면 버전 관리가 쉬워집니다
4. ReduceLROnPlateau 학습률 조정
김개발 씨의 모델은 에포크 20까지 빠르게 학습하다가 갑자기 멈춘 것처럼 보였습니다. 손실 값이 줄어들지 않고 같은 자리에서 맴돌기만 합니다.
"왜 더 이상 학습을 안 하는 거지?" 김개발 씨는 고개를 갸우뚱했습니다.
ReduceLROnPlateau는 성능이 정체될 때 학습률을 자동으로 낮추는 콜백입니다. 마치 산을 오를 때 경사가 급해지면 보폭을 줄이는 것과 같습니다.
학습 초기에는 큰 학습률로 빠르게 진행하다가, 최적점 근처에서는 작은 학습률로 정밀하게 조정합니다.
다음 코드를 살펴봅시다.
from tensorflow.keras.callbacks import ReduceLROnPlateau
# 학습률 감소 콜백 설정
reduce_lr = ReduceLROnPlateau(
monitor='val_loss',
factor=0.5, # 학습률을 절반으로 감소
patience=5, # 5 에포크 동안 개선 없으면 감소
min_lr=1e-7, # 최소 학습률 한계
min_delta=0.001, # 개선으로 인정할 최소 변화량
verbose=1 # 학습률 변경 시 출력
)
# 초기 학습률 설정
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss='categorical_crossentropy'
)
history = model.fit(x_train, y_train, callbacks=[reduce_lr])
박시니어 씨가 김개발 씨의 훈련 그래프를 보며 말했습니다. "학습률이 너무 큰 것 같네요.
최적점 주변에서 왔다 갔다 하고 있어요." 김개발 씨가 물었습니다. "그럼 학습률을 줄이면 되나요?" 박시니어 씨가 고개를 끄덕였습니다.
"근데 언제 줄일지가 문제예요." ReduceLROnPlateau를 쉽게 비유하자면, 목적지에 가까워질수록 속도를 줄이는 것과 같습니다. 처음에는 고속도로에서 빠르게 달리다가, 목적지 근처에서는 천천히 운전해야 정확한 위치에 도착할 수 있습니다.
학습률도 마찬가지입니다. **학습률(Learning Rate)**은 모델이 한 번에 얼마나 많이 학습할지를 결정합니다.
너무 크면 최적점을 지나쳐버리고, 너무 작으면 학습이 너무 느립니다. 그래서 상황에 따라 동적으로 조절하는 것이 효과적입니다.
factor 파라미터는 학습률을 얼마나 줄일지 결정합니다. factor=0.5면 기존 학습률의 절반이 됩니다.
너무 작게 설정하면(예: 0.1) 급격히 떨어져서 학습이 거의 멈출 수 있고, 너무 크게 설정하면(예: 0.9) 효과가 미미합니다. patience는 EarlyStopping과 비슷한 개념입니다.
몇 에포크 동안 개선이 없으면 학습률을 줄일지 결정합니다. 이 값은 EarlyStopping의 patience보다 작게 설정하는 것이 일반적입니다.
먼저 학습률을 줄여보고, 그래도 안 되면 조기 종료하는 식입니다. min_lr은 학습률의 하한선입니다.
학습률이 계속 줄어들다가 이 값 아래로는 내려가지 않습니다. 너무 작은 학습률은 사실상 학습이 진행되지 않는 것과 같으므로, 적절한 하한선을 설정해야 합니다.
실무에서는 ReduceLROnPlateau와 EarlyStopping을 함께 사용합니다. 학습이 정체되면 먼저 학습률을 줄여서 탈출을 시도하고, 그래도 개선이 없으면 훈련을 종료합니다.
이 조합은 거의 모든 딥러닝 프로젝트에서 사용됩니다. verbose=1로 설정하면 학습률이 변경될 때마다 메시지가 출력됩니다.
"Reducing learning rate to 0.0005"와 같은 메시지를 보면서 훈련 과정을 모니터링할 수 있습니다. 주의할 점은 콜백 간의 patience 설정입니다.
ReduceLROnPlateau의 patience가 5이고 EarlyStopping의 patience가 10이라면, 학습률이 두 번 감소한 후에 조기 종료가 발생합니다. 이런 관계를 이해하고 설정해야 합니다.
김개발 씨는 ReduceLROnPlateau를 추가한 후 다시 훈련을 시작했습니다. 에포크 25에서 학습률이 절반으로 줄어들더니, 다시 손실이 감소하기 시작했습니다.
"학습률 조절이 이렇게 중요했군요!"
실전 팁
💡 - factor는 0.2에서 0.5 사이로 설정하는 것이 일반적입니다
- ReduceLROnPlateau의 patience는 EarlyStopping의 절반 정도로 설정하세요
- 초기 학습률을 너무 작게 시작하면 이 콜백의 효과가 제한됩니다
5. TensorBoard 시각화
김개발 씨는 여러 모델을 실험하면서 결과를 비교하고 싶었습니다. 그런데 터미널에 출력되는 숫자들만 보고는 어떤 모델이 더 좋은지 판단하기 어려웠습니다.
"그래프로 볼 수 있으면 좋을 텐데..." 김개발 씨는 중얼거렸습니다.
TensorBoard는 딥러닝 훈련 과정을 시각화하는 강력한 도구입니다. 마치 자동차 계기판처럼 모델의 상태를 실시간으로 보여줍니다.
손실 곡선, 정확도 변화, 가중치 분포, 모델 그래프 등을 웹 브라우저에서 직관적으로 확인할 수 있습니다.
다음 코드를 살펴봅시다.
from tensorflow.keras.callbacks import TensorBoard
import datetime
# 로그 디렉토리 설정 (실험별로 구분)
log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
# TensorBoard 콜백 설정
tensorboard_callback = TensorBoard(
log_dir=log_dir,
histogram_freq=1, # 가중치 히스토그램 기록 빈도
write_graph=True, # 모델 그래프 저장
write_images=True, # 가중치를 이미지로 저장
update_freq='epoch', # 로그 업데이트 빈도
profile_batch=2 # 프로파일링할 배치 (성능 분석)
)
history = model.fit(x_train, y_train, callbacks=[tensorboard_callback])
# 터미널에서 TensorBoard 실행: tensorboard --logdir logs/fit
박시니어 씨가 김개발 씨에게 물었습니다. "여러 실험 결과를 어떻게 비교하고 있어요?" 김개발 씨가 대답했습니다.
"엑셀에 숫자를 옮겨 적고 있어요." 박시니어 씨가 웃으며 말했습니다. "TensorBoard를 쓰면 그럴 필요 없어요." TensorBoard를 쉽게 비유하자면, 병원에서 환자의 상태를 모니터링하는 계기판과 같습니다.
심박수, 혈압, 체온이 실시간으로 그래프로 표시되듯이, TensorBoard는 모델의 손실, 정확도, 가중치 상태를 실시간으로 보여줍니다. log_dir은 로그가 저장될 디렉토리입니다.
날짜와 시간을 포함하면 여러 실험을 구분할 수 있습니다. 또는 실험 이름을 붙여서 "logs/fit/experiment_batch32_lr001"처럼 의미 있는 이름을 사용할 수도 있습니다.
histogram_freq를 1로 설정하면 매 에포크마다 가중치와 바이어스의 분포를 히스토그램으로 기록합니다. 가중치가 한쪽으로 치우치거나, 그래디언트가 소실되는 현상을 발견하는 데 유용합니다.
write_graph=True는 모델의 구조를 그래프로 저장합니다. TensorBoard에서 "Graphs" 탭을 열면 레이어 간의 연결 관계를 시각적으로 확인할 수 있습니다.
복잡한 모델의 구조를 이해하는 데 도움이 됩니다. TensorBoard를 실행하려면 터미널에서 tensorboard --logdir logs/fit 명령을 입력합니다.
그러면 기본적으로 localhost:6006에서 웹 서버가 시작됩니다. 웹 브라우저에서 이 주소로 접속하면 대시보드를 볼 수 있습니다.
가장 많이 사용하는 기능은 Scalars 탭입니다. 여기서 훈련 손실과 검증 손실의 변화를 그래프로 볼 수 있습니다.
두 곡선이 벌어지기 시작하면 과적합의 신호입니다. 여러 실험을 동시에 표시해서 비교할 수도 있습니다.
실무에서는 하이퍼파라미터 튜닝 시 TensorBoard가 필수입니다. 학습률, 배치 크기, 레이어 수 등을 바꿔가며 실험할 때, 각 실험의 결과를 한눈에 비교할 수 있습니다.
어떤 설정이 가장 효과적인지 직관적으로 파악됩니다. 원격 서버에서 훈련하는 경우에도 TensorBoard를 사용할 수 있습니다.
SSH 터널링을 통해 로컬에서 접속하거나, TensorBoard.dev를 사용해 클라우드에 공유할 수 있습니다. 주의할 점은 로그 파일이 빠르게 커질 수 있다는 것입니다.
histogram_freq나 profile_batch를 너무 자주 설정하면 디스크 공간을 많이 차지합니다. 필요한 정보만 선택적으로 기록하세요.
김개발 씨는 TensorBoard를 설정한 후 웹 브라우저를 열었습니다. 손실 곡선이 실시간으로 그려지는 것을 보며 감탄했습니다.
"이거 진짜 편하네요!"
실전 팁
💡 - 여러 실험을 비교할 때는 log_dir에 의미 있는 이름을 붙이세요
- 훈련 중에도 TensorBoard를 새로고침하면 실시간으로 업데이트됩니다
- histogram_freq=0으로 설정하면 오버헤드를 줄일 수 있습니다
6. 커스텀 Callback 만들기
김개발 씨는 특별한 요구사항이 생겼습니다. 매 에포크가 끝날 때마다 슬랙으로 알림을 보내고 싶었습니다.
기존 콜백들을 아무리 찾아봐도 이런 기능은 없었습니다. "직접 만들 수 있을까?" 김개발 씨는 고민에 빠졌습니다.
커스텀 Callback은 기본 제공 콜백으로 충족되지 않는 요구사항을 위해 직접 만드는 콜백입니다. 마치 기성복 대신 맞춤복을 주문하는 것과 같습니다.
Callback 클래스를 상속받아 원하는 시점에 원하는 동작을 정의할 수 있습니다.
다음 코드를 살펴봅시다.
from tensorflow.keras.callbacks import Callback
import requests
class SlackNotificationCallback(Callback):
def __init__(self, webhook_url):
super().__init__()
self.webhook_url = webhook_url
def on_epoch_end(self, epoch, logs=None):
# 매 에포크 끝에 슬랙 알림 전송
message = f"Epoch {epoch+1} 완료 - loss: {logs['loss']:.4f}"
requests.post(self.webhook_url, json={"text": message})
def on_train_end(self, logs=None):
# 훈련 종료 시 최종 결과 전송
message = f"훈련 완료! 최종 loss: {logs['loss']:.4f}"
requests.post(self.webhook_url, json={"text": message})
# 사용 예시
slack_callback = SlackNotificationCallback("https://hooks.slack.com/...")
history = model.fit(x_train, y_train, callbacks=[slack_callback])
박시니어 씨가 김개발 씨의 고민을 듣고 말했습니다. "커스텀 콜백을 만들면 돼요.
Callback 클래스를 상속받아서 원하는 메서드만 구현하면 됩니다." 김개발 씨의 눈이 밝아졌습니다. "그게 가능해요?" 커스텀 콜백을 만드는 것은 마치 레고 블록을 조립하는 것과 같습니다.
기본 틀(Callback 클래스)은 제공되어 있고, 원하는 부분(메서드)만 조립하면 됩니다. 필요 없는 메서드는 구현하지 않아도 됩니다.
먼저 Callback 클래스를 상속받아야 합니다. **super().init()**을 호출하는 것을 잊지 마세요.
이렇게 하면 부모 클래스의 초기화가 제대로 이루어집니다. 오버라이드할 수 있는 메서드는 여러 가지가 있습니다.
on_train_begin과 on_train_end는 전체 훈련의 시작과 끝에 호출됩니다. on_epoch_begin과 on_epoch_end는 각 에포크의 시작과 끝에 호출됩니다.
on_batch_begin과 on_batch_end는 각 배치의 시작과 끝에 호출됩니다. 각 메서드는 logs 파라미터를 통해 현재 상태 정보를 받습니다.
예를 들어 on_epoch_end에서 logs['loss']로 훈련 손실을, logs['val_loss']로 검증 손실을 확인할 수 있습니다. 이 정보를 활용해 다양한 로직을 구현할 수 있습니다.
위의 코드 예시는 슬랙 알림을 보내는 콜백입니다. 웹훅 URL을 생성자에서 받아 저장하고, on_epoch_end에서 매 에포크의 결과를 슬랙으로 전송합니다.
on_train_end에서는 훈련 완료 메시지를 보냅니다. 실무에서 커스텀 콜백이 유용한 경우는 많습니다.
훈련 중간에 예측 샘플을 생성해서 확인하고 싶을 때, 특정 조건에서 학습률을 급격히 변경하고 싶을 때, 외부 시스템과 연동하고 싶을 때 등 다양한 상황에서 활용됩니다. 커스텀 콜백 내에서 self.model을 통해 현재 훈련 중인 모델에 접근할 수 있습니다.
모델의 가중치를 확인하거나, 중간 예측을 수행하거나, 특정 레이어의 출력을 분석하는 등 다양한 작업이 가능합니다. 주의할 점은 콜백 내에서 너무 무거운 작업을 수행하지 않는 것입니다.
특히 on_batch_end처럼 자주 호출되는 메서드에서 시간이 오래 걸리는 작업을 하면 전체 훈련 시간이 크게 늘어납니다. 필요하다면 N 에포크마다 한 번씩만 수행하도록 조건을 추가하세요.
김개발 씨는 슬랙 알림 콜백을 만들어 테스트해보았습니다. 훈련이 시작되자 슬랙에 알림이 오기 시작했습니다.
"이제 훈련 상황을 실시간으로 확인할 수 있겠네요!"
실전 팁
💡 - 무거운 작업은 on_epoch_end에서 수행하고, on_batch_end에서는 가볍게 유지하세요
- self.model을 통해 현재 모델에 접근할 수 있습니다
- 여러 커스텀 콜백을 조합하면 강력한 훈련 파이프라인을 구축할 수 있습니다
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.