[DL] callback ํ•จ์ˆ˜

Minjeong Kimยท2026๋…„ 1์›” 7์ผ

์ธ๊ณต์ง€๋Šฅ

๋ชฉ๋ก ๋ณด๊ธฐ
28/50

๐Ÿ“ข callback ํ•จ์ˆ˜ ์ค‘ checkpoint ์™€ early stopping ์— ๋Œ€ํ•œ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.

๋ชจ๋ธ ์ €์žฅ

  • model checkpoint
  • ํŠน์ • epoch ๋งˆ๋‹ค ๋ชจ๋ธ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ
  • ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ข‹์€ ๊ฒฝ์šฐ
    • ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ ํ•™์Šต ์‹œ, ์ง€์ •๋œ epochs ๋ชจ๋‘ ์ง„ํ–‰ํ•  ๊ฒฝ์šฐ ๊ณผ๋Œ€์ ํ•ฉ์ผ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ โ†’ ์ค‘๊ฐ„์— ์ผ๋ฐ˜ํ™”๋œ ๋ชจ๋ธ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ ์˜ˆ๋ฅผ ๋“ค์–ด, 100๋ฒˆ ํ•™์Šตํ–ˆ์„ ๋•Œ 100๋ฒˆ ์ค‘ 70๋ฒˆ์งธ ์ดํ›„๋ถ€ํ„ฐ ๊ณผ์ ํ•ฉ์ด ์ผ์–ด๋‚ฌ๋‹ค๊ณ  ํ•˜์ž. ๊ธฐ์กด๋Œ€๋กœ ํ•œ๋‹ค๋ฉด, ์ด๋ฅผ ํ™•์ธํ•˜๊ณ  70๋ฒˆ ํ•™์Šต์‹œํ‚จ ๋ชจ๋ธ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์•ผํ•จ. But, checkpoint ์‚ฌ์šฉํ•˜๋ฉด ์ €์žฅ๋œ 70๋ฒˆ์งธ ๋ชจ๋ธ์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ!
    • ์ปค๋„์ด ๋Š๊ธฐ๋ฉด ์ •๋ณด๊ฐ€ ๋‚ ์•„๊ฐ โ†’ ํ•™์Šต ๋‚ด์šฉ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ
    • ๋ชจ๋ธ๋งŒ ๋–ผ์„œ ์“ฐ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ(์˜ˆ๋ฅผ ๋“ค์–ด, ์›น์— ์†๊ธ€์”จ ์˜ฌ๋ฆฐ๋‹ค๊ณ  ํ•˜๋ฉด, flask ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ ์˜ฎ๊ฒจ์ฃผ๋ฉด? ๋”ฐ๋กœ ๋–ผ๋‘” ๋ชจ๋ธ์— ์†๊ธ€์”จ ์‚ฌ์ง„ ๋„ฃ์–ด์„œ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

๋ชจ๋ธ ์กฐ๊ธฐ ํ•™์Šต ์ค‘๋‹จ

  • early stopping
  • ๋ง ๊ทธ๋Œ€๋กœ, ๋ชจ๋ธ์„ ์กฐ๊ธฐ์— ํ•™์Šต ์ค‘๋‹จ ์‹œํ‚ค๋Š” ๊ฒƒ
  • ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ข‹์€ ๊ฒฝ์šฐ
    • epoch๋ฅผ ํฌ๊ฒŒ ์„ค์ •ํ–ˆ์„ ์‹œ ์ผ์ • ํšŸ์ˆ˜ ์ดํ›„๋กœ๋Š” ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ๊ฐœ์„ ์ด ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ โ†’ ๊ทธ๋Ÿผ์—๋„ ๊ณ„์† ํ•™์Šตํ•˜๋ฉด ์‹œ๊ฐ„/์ž์› ๋‚ญ๋น„์ž„!
    • ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์ด ๋”์ด์ƒ ๊ฐœ์„ ๋˜์ง€ ์•Š์„ ๋•Œ ์กฐ๊ธฐ ์ค‘๋‹จ

์ฝ”๋“œ

๋ชจ๋ธ ์ €์žฅ

# ๋ชจ๋ธ ์ €์žฅ
# ๊ฒฝ๋กœ ์„ค์ •
model_path = './data/num_model/model_{epoch:02d}_{val_accuracy:0.3f}.keras'
mc = ModelCheckpoint(filepath=model_path,
                     verbose = 1, # log ์ถœ๋ ฅ
                     save_best_only = True, # ๋ชจ๋ธ์ด ์ตœ๊ณ ์„ฑ๋Šฅ์„ ๊ฐฑ์‹ ํ•  ๋•Œ๋งŒ ์ €์žฅ (False: ๋ชจ๋“  epoch ์ €์žฅ)
                     monitor = 'val_accuracy' # ๋ชจ๋ธ์˜ ์„ฑ๋Šฅํ™•์ธ ๊ธฐ์ค€ ์ง€ํ‘œ
)

์กฐ๊ธฐ ํ•™์Šต ์ค‘๋‹จ

# ์กฐ๊ธฐํ•™์Šต ์ค‘๋‹จ
es = EarlyStopping(monitor='val_accuracy',
                   verbose = 1,
                   patience = 10) # ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ๊ฐœ์„ ์„ ๊ธฐ๋‹ค๋ ค์ฃผ๋Š” ํšŸ์ˆ˜ (๋งŒ์•ฝ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ๋”๋””๋‹ค๋ฉด, ํšŸ์ˆ˜ ๋” ๋Š˜๋ฆฌ๊ธฐ!)

๋ชจ๋ธ๋ง

model1 = Sequential()
model1.add(Input(shape=(28,28)))
model1.add(Flatten())
model1.add(Dense(units=64, activation='sigmoid'))
model1.add(Dense(units=128, activation='sigmoid'))
model1.add(Dense(units=256, activation='sigmoid'))
model1.add(Dense(units=128, activation='sigmoid'))
model1.add(Dense(units=64, activation='sigmoid'))
model1.add(Dense(units=10, activation='softmax'))

model1.compile(loss='sparse_categorical_crossentropy',
               optimizer=SGD(),
               metrics=['accuracy'])

m1 = model1.fit(X_train, y_train, epochs=200, validation_split=0.2,
                callbacks = [mc,es])       # <- ์ด ๋ถ€๋ถ„์—์„œ ์ ์šฉ !!!!!

model1.evaluate(X_test, y_test)

์ €์žฅ๋œ ๋ชจ๋ธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

  • ๋ชฉ์ : best ๋ชจ๋ธ ๋ถˆ๋Ÿฌ์™€์„œ ์ง์ ‘ ์ž‘์„ฑํ•œ ์†๊ธ€์”จ ๋ฐ์ดํ„ฐ ํ‰๊ฐ€
# best ๋ชจ๋ธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
from tensorflow.keras.models import load_model
best_model = load_model('./data/num_model/model_97_0.890.keras') # <- ์ด ๋ถ€๋ถ„ !!!!

# ์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
import PIL.Image  as pimg
img = pimg.open('./data/5.png')

# shape ํ™•์ธ
np.array(img) # ํ˜„์žฌ ์ปฌ๋Ÿฌ(RGB) ๋กœ ๋˜์–ด ์žˆ์–ด์„œ, ํ‘๋ฐฑ์œผ๋กœ ๋ฐ”๊ฟ”์•ผํ•จ~!

# ์ปฌ๋Ÿฌ์ด๋ฏธ์ง€ ํ‘๋ฐฑ์œผ๋กœ ๋ณ€ํ™˜
img_b = img.convert('L')
img_np = np.array(img_b)

# shape ๋ณ€๊ฒฝ
img_np = img_np.reshape(1,28,28)

# ์˜ˆ์ธก
best_model.predict(img_np)
# ๊ฐ class ์— ๋Œ€ํ•œ ํ™•๋ฅ ๊ฐ’
# array([[0.0084987 , 0.01119939, 0.23745966, 0.03384652, 0.00381436,
#         0.0770776 , 0.00616608, 0.00652381, 0.59920114, 0.01621275]],
#       dtype=float32)

# ํ™•๋ฅ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ๋Œ“๊ฐ’๋งŒ ์ถœ๋ ฅ
best_model.predict(img_np).argmax() # argmax: ์ตœ๋Œ“๊ฐ’์˜ ์ธ๋ฑ์Šค ์ถœ๋ ฅ
# np.int64(8)
  • std
    • early stopping ๋กœ๊ทธ
      1500/1500 โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 7s 5ms/step - accuracy: 0.9015 - loss: 0.3550 - val_accuracy: 0.8924 - val_loss: 0.3776
      Epoch 119: early stopping
    • checkpoint ๋กœ๊ทธ
      1490/1500 โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 0s 3ms/step - accuracy: 0.8893 - loss: 0.3978
      Epoch 109: val_accuracy improved from 0.89583 to 0.89875, saving model to ./data/num_model/model_109_0.899.keras

0๊ฐœ์˜ ๋Œ“๊ธ€