Julie의 Tech 블로그

딥러닝 기초 - Keras 함수형 API, callback 본문

Tech/ML, DL

딥러닝 기초 - Keras 함수형 API, callback

Julie's tech 2021. 5. 13. 11:25
728x90

딥러닝 프레임워크 중 하나인 keras는 모델을 빌드할 때 두 가지 방법으로 할 수 있다.

첫째는 함수형 API이고, 두 번째는 Sequential 모델을 사용하는 것이다.

Sequential 모델은 input과 output이 하나라고 가정한다.

여러 경우에는 sequential 모델을 사용해도 문제가 없지만, 데이터 소스가 다양할 때 등 일부 case에서는 함수형 API가 필요할 때도 있다.

예를 들어 텍스트 데이터와 이미지 데이터, 메타 데이터 세 가지를 합쳐 각각 모델을 만들고,

모델의 결과를 가중평균하여 output을 낸다고 할 때,

이 때는 input과 output이 하나가 아니기 때문에 함수형 API가 필요하게 된다.

또한 Google의 Inception module이나 Resnet같은 경우는 Sequential하게 만들 수 없다.

 

Google Inception Module, https://arxiv.org/abs/1409.4842 (좌) 아래층 잔차를 윗층으로 반영하는 ResNEt, https://neurohive.io/en/popular-networks/resnet/ (우)

Sequential 모델과 함수형 API로 만든 모델을 각각 비교하면 아래와 같다.

from keras.models import Sequential, Model
from keras import layers
from keras import Input

model = Sequential()
model.add(layers.Dense(32, activation = 'relu', input_shape=(64,)))
model.add(layers.Dense(32, activation = 'relu'))
model.add(layers.Dense(10, activation = 'softmax'))
model.summary()
from keras import Input, layers

input_tensor = Input(shape=(32,))
x = layers.Dense(32, activation = 'relu')(input_tensor)
x = layers.Dense(32, activation='relu')(x)
output_tensor = layers.Dense(10, activation='softamx')(x)

model = Model(input_tensor, output_tensor)
model.summary()

위와 같이 함수형 API를 통해 다중 입력, 다중 출력 모델을 구성할 수 있다.


콜백을 이용한 모델 훈련

모델을 training중에 과대적합이 발생하지 않는 적절한 epoch를 정하기 위해 callback을 이용할 수 있다.

검증 손실이 더 향상되지 않을 때 훈련을 멈추는 것인데, 체크포인트를 저장하여 조기 종료하는 것이다.

또한 하이퍼파라미터 값도 조정하는 것이다.

keras에서 아래와 같은 콜백 내장 함수가 있다.

keras.callbacks.ModelCheckpoint

keras.callbacks.EarlyStopping

keras.callbacks.LearningRateScheduler

kears.callbacks.ReduceLROnPlateau

keras.callbacks.CSVLogger

검증셋의 정확도로 체크포인트를 지속적으로 생성하는 방법은 아래와 같다.

import keras
                 // patience = 2개 epoch동안 val_acc가 향상되지 않으면 일찍 중단
callback_lst = [ keras.callbacks.EarlyStopping(monitor='val_acc', patience=1, ),
                 // val_loss가 이전에 적힌 값보다 더 좋은 값일때 기록
                 keras.callbacks.ModelCheckpoint(filepath='model.h5', 
                                                 monitor='val_loss',
                                                 save_best_only=True,),
                 // learning rate를 줄이는 방법. factor : 학습률을 0.1배함(10배로 줄임)
                 keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1,
                                                   paitence = 1, )]

model.compile(optimizer='rmsprop', metrics=['acc'], ...)
model.fit(x, y, epochs=100, batch_size=1, callbacks=callback_lst, validation_data=..)

keras.callbacks.Callback 클래스를 상속받아 자신만의 콜백을 구현해서 사용할 수 있다.

텐서보드

텐서플로우를 백엔드로 사용한 keras모델은 텐서보드를 통해 모델 training 정보에 대해 수집할 수 있다.

// 텐서보드 로그를 기록할 디렉토리 생성
$ mkdir log_dir

// 텐서보드 콜백
callbacks_lst = [ keras.callbacks.TensorBoard(log_dir = 'log_dir', 
                                              histogram_freq = 1,)]
history = model.fit(... callbacks = callbacks_lst)
// histogram_freq : 1 epoch마다 activation에 따른 출력값 기록

$ tensorboard --logdir=log_dir

딥러닝 모델 성능을 극대화하는 데 필요한 여러가지 기술들

1. 배치 정규화

input값만 정규화하는 것이 아니라, 각 층에 input으로 들어가는 데이터를 정규화하는 것

Convolution 층이나 Dense 층 바로 다음에 사용하는 경우가 많다.

input 배치의 평균과 표준편차를 지수 이동 평균으로 계산하여 전체 데이터셋의 평균과 표준편차를 대신하여 배치화하는 것이다.

2. Depth-wise separable convolution

동일한 depth에 위치한 층에서 각 합성곱을 나눠서 진행하는 것이다.

채널을 분리하여 여러 합성곱으로 나눈 뒤, 합쳐서 다시 전달하는 방식이다.

3. 하이퍼파라미터 조정하기

이 부분은 정답이 따로 없고, 분석가가 계속해서 모델의 하이퍼파라미터를 조정하여 성능을 끌어올려야한다.

여러번 경험을 쌓다 보면 직관이 생기게 된다.

하지만 하이퍼파라미터를 과하게 조정할 경우 validation set에 과대적합이 될 수 있다.

4. 앙상블

여러 좋은 모델을 앙상블하여 하나의 거대한 모델을 만드는 것이다.

각 모델이 독립적이고, 다른 장점을 지니고 있다는 점에서 착안된 기술이다.

학습된 모델별 예측값을 가중평균하여 최종 결과를 산출하는 것이다.

모델이 다양할수록 결과가 좋기 때문에 DNN * TREE 또는 DNN * LINEAR 로 섞곤 한다.


참고자료

https://book.naver.com/bookdb/book_detail.nhn?bid=14069088

 

반응형