Tensorflow - EarlyStopping/Callback클래스 (인공지능 학습 중단)

EarlyStopping

  • 인공지능 학습시 성능 향상이 없을 경우 학습을 조기 종료 시킬 때 사용
  • tf.keras.callbacks.EarlyStopping(monitor= 'val_loss', patience= N)
    • monitor='val_loss' : validation 검증 손실률의 값 모니터링
    • patience= N : N번의 횟수 동안, 에포크당 1회
    • 즉 N번의 횟수동안 손실률의 값을 모니터링하여 손실률이 줄어들지  않을 경우 학습을 조기 종료
early_stop = tf.keras.callbacks.EarlyStopping(monitor = 'val_loss', patience=10)

인공지능 학습 시 EarlyStopping 라이브러리 적용 방법

  • model.fit(X_train, y_train, epochs=10000, validation_split=0.2, callbacks=[early_stop])
    • validation_split=0.2 : 학습 데이터의 20%를 검증에 사용
    • callbacks=[early_stop] : 코드 실행을 프레임워크가 실행 하는 것, 리스트 안에 넣어주어야 함, 임의의 변수 early_stop
epoch_history = model.fit(X_train, y_train, epochs=10000, validation_split=0.2, callbacks=[early_stop])

EarlyStopping 사용 인공지능 모델링 전체 코드

# 인공지능 생성
model = tf.keras.models.Sequential()

# 플래튼 작업 : 다차원 행렬 1차원화
model.add(tf.keras.layers.Flatten())

# 히든 레이어
model.add(tf.keras.layers.Dense(128, 'relu'))

# 활성함수 소프트맥스로 분류 문제로 출력
model.add(tf.keras.layers.Dense(10, 'softmax'))

# 분류 작업을 하는 손실함수를 이용하여 컴파일
model.compile('adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 10번동안 성능 향상이 없으면 학습 중단
early_stop = tf.keras.callbacks.EarlyStopping(monitor = 'val_loss', patience=10)

# 인공지능 학습
epoch_history = model_ep30.fit(training_images, training_labels, epochs=30, validation_split=0.2, callbacks=[early_stop])

Callback 클래스

  • 텐서플로우의 Callback 클래스를 상속해서 클래스 생성
  • EarlyStopping과는 다르게 내가 특정 수치를 지정하여 학습을 중단 할 수 있음
  • 지정한 함수 안에 에포크가 끝날때마다 하고싶은 작업을 코딩
class 클래스이름(tf.keras.callbacks.Callback):
  def 함수이름(self, 변수) :
  	클래스의 함수 호출시 시행 할 작업

Callback 클래스 사용 인공지능 모델링 전체 코드

# 콜백 클래스 정의
class myCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs={}) :
    if logs.get('val_accuracy') > 0.87 :
      print('\n밸리데이션 정확도가 87% 넘으므로 학습을 종료합니다.')
      self.model.stop_training=True
      
# 콜백 클래스 생성
my_callback = myCallback()

# 인공지능 생성
model_ep30 = tf.keras.models.Sequential()

# 플래튼 작업 : 다차원 행렬 1차원화
model_ep30.add(tf.keras.layers.Flatten())

# 히든 레이어
model_ep30.add(tf.keras.layers.Dense(128, 'relu'))

# 활성함수 소프트맥스로 분류 문제로 출력
model_ep30.add(tf.keras.layers.Dense(10, 'softmax'))

# 분류 작업을 하는 손실함수를 이용하여 컴파일
model_ep30.compile('adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 인공지능 학습
epoch_history = model_ep30.fit(training_images, training_labels, epochs=30, validation_split=0.2, callbacks=[my_callback])