본문 바로가기
국비 교육/머신러닝, 딥러닝

[딥러닝 - 교육 외] Keras

by 육츠 2024. 8. 1.

Keras

TensorFlow 의 딥러닝 모델 설계와 훈련을 위한 고수준 API
파이썬으로 구현된 쉽고 간결한 딥러닝 라이브러리 이다.
내부적으로는 텐서플로우, 티아노 Theano, CNTK 등의 딥러닝 엔진이 구동된다.

 

특징

모듈화 Modularity
- 독립적이고 설정 가능한 모델을 이용해 모듈을 구성할 수 있다.
- 신경망층, 비용함수, 최적화기, 초기화 기법, 활성화 함수 등의 모듈을 조합해서 새로운 모델을 만들 수 있다.

최소주의 Minimalism
- 각 모듈은 짧고 간결하다. 하지만 반응 속도와 혁신성은 다소 떨어진다.

쉬운 확장성 : 새로운 클래스나 함수로 모듈을 쉽게 추가할 수 있어 고급 연구에 필요한 다양한 표현을 할 수 있다.

 

코딩 절차

 

Data Set 종류

훈련 셋 검증 셋 시험 셋
딥러닝 모델을 학습시키기 위한 training data 와 label data 

- 학습이란 문제와 답을 같이 제공한 후 문제를 풀고 답을 맞추는 것을 말한다.
딥러닝 모델의 훈련이 잘 되었는지 확인하기 위한 데이터 셋
- 검증 셋은 학습시에 사용된다.
- 검증 셋은 가중치 갱신이 일어나지 않는다.

- 검증이란 문제만 주고 풀게 한뒤 맞는지 틀린지 점수만 계산하는 것을 말한다.
훈련되지 않은 데이터들로써 훈련이 잘 이루어졌는지 확인하기 위한 데이터 셋이다.

실제 데이터를 아직 보지 못한 데이터 이다.

Batch size

- 모델이 Training 할 때 몇 문항을 풀고 답을 맞출 것인지 결정
- 즉, 한 번에 가져올 데이터의 양을 의미
- 배치를 이용하면 컴퓨터 메모리를 효율적으로 사용할 수 있을 뿐만 아니라, gradient descent 시 local minimum 을 피할 수 있다.

** 데이터 전부를 하나의 batch 로 넣으면 데이터 전체의 loss 를 알게 되어 주변의 local minimum 에 빠질 위험이 있다.
하지만 mini batch 를 사용하면 loss 가 배치마다 다르므로 요동치며 감소하여 주변에 있는 local minimum 을 지나쳐 global minimum 에 도달할 확률이 높아진다.

 

Epoch

- 트레이닝 데이터를 몇 번 반복해서 풀어보는지 정하는 값
Epoch = 20 이면 같은 데이터를 20회 학습하는 것을 의미한다.

 

딥러닝 순서

 

1. 데이터 셋을 생성

- 주로 원본 데이터를 불러오거나 시뮬레이션을 통해 데이터를 생성한다.
- 데이터를 훈련, 검증, 시험 셋으로 각각 생성한다.
- 포맷을 변환한다.

 

2. 모델 구성

- 시퀀스 모델을 생성한다. (다차원 입출력을 갖는 신경망을 구현할 수 있는 Functional 과 Model Subclassing 이 있다.)
- 레이터를 추가하여 은닉계층을 추가한다.

# 예시 코드
model = Sequential()
model.add(Dense(32, activation = 'sigmoid', input_dim = 100))
model.add(Dense(1, activation = 'sigmoid' ))
첫 번째 인자 출력 뉴런의 수 (argument : units = 32)
input_dim 입력 뉴런의 수
activation 활성화 함수 설정
- 'linear' : 디폴트 값으로 입력 뉴런과 가중치로 계산된 결과값이 그대로 출력된다.
(회귀문제에서 출력층에 주로 쓰인다.)
- 'relu' : rectifier 함수로 은닉층에 주로 쓰인다.
- 'sigmoid' : 시그모이드 함수로 이진 분류 문제에서 출력층에 주로 쓰인다.
- 'softmax' : 소프트맥스 함수로 다중클래스 분류 문제에서 출력층에 주로 쓰인다.

 

3. 모델 학습 과정 설정

- 모델 학습에 대한 성정으로 손실 함수와 최적화 방법을 정의한다.
- compile() 함수 사용

model.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics = ['accuracy'])
loss 현재 가중치 세트를 평가하는데 사용한 손실함수
- binary_crossentropy
- categorical_crossentropy
- mse
optimizer 가중치를 업데이트 할 최적화 알고리즘
metrics 평가척도
분류에선 일반적으로 accuracy 사용한다. 그 외 회귀 문제에는 맞는 평가 척도가 있다. (모델을 훈련할 때 평가 결과가 사용되지는 않는다.)

 

학습 과정 모니터링 셋팅

- 텐서보드를 이용하여 학습과정 중 정확도와 손실값 변화를 데이터 그래프로 확인 가능하다.
- 모델 네트워크 시각화 (이미지, 텍스트, 오디오, 데이터 표시)

from keras.callbacks import TensorBoard
import datetime

log_dir = 'c:\\Logs\\' + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard = TensorBoard(log_dir=log_dir, histogram_freq=1)
log_dir 로그가 기록될 디렉토리 경로 (경로에 한글이 포함되면 안된다.)
histogram_freq 1 : 모든 에포크마다 히스토그램 계산
0 : 디폴트 값, 히스토그램 계산 비활성화

실행
아나콘다 콘솔에서 tensorboard --logdir = 로그 디렉토리 경로

 

딥러닝 과적합 방지 방법

1. EarlyStopping

: Keras 콜백 함수 중 하나로 검증 손실이 더이상 개선되지 않을때 학습을 중단시키는 역할을 한다.
가중치가 최고 유용성 시점을 지나서 더 업데이트가 되지 않도록 학습을 조기 중단.

from keras.callbacks import EarlyStopping
early_stop = EarlyStopping(monitor='val_loss')
monitor 모니터링 할 지표를 선택한다. 일반적으로 val_loss 나 val_acc 를 선택한다.
min_data 개선되었다고 판단할 최소한의 변화량. 이 값보다 작으면 개선이 없는 것으로 간주한다.
기본값 = 0
patience 개선이 없다고 판단하기 전에 대기할 에폭 수. 즉 이 값만큼 검증 손실이 개선되지 않으면 학습을 중단한다. 기본값 = 0
mode 모니터링 할 지표를 최소화('min')할지 최대화('max')할지 결정한다. 기본값 = 'auto'
지표가 'acc', 'accuracy', 'fmeasure', 'precision', 'recall' 중 하나이면  'max' 아니면 'min' 으로 선택한다.
baseline 모니터링 할 지표의 기준값을 설정한다. 이 값보다 개선되지 않으면 학습을 중단한다.
restore_best_weights 최상의 가중치를 복원할지 여부를 결정한다. 이 값을 True 로 설정하면 학습 중 최상의 검증 손시을 가진 가중치를 복원한다. 기본값 = False

 

2. Regulation

: 가중치가 계속 커지는 것을 방지하여 모델이 일반화 될 수 있도록 함.

model.add(Dense(1000, activation= 'tanh', kernel_regularizer= regularizers.l2(0.01)))
# l1(),l1_l2()

 

3. Dropout

: 모든 노드 중 몇 개의 연결을 끊어 남은 노드들을 통해서만 학습하는 방법

드롭아웃 덕분에 미니 배치마다 신경망의 구조가 조금씩 달라지는 효과를 낳게 되며 이는 일종의 모델 앙상블과 비슷한 효과가 생긴다.

from keras.layers import Dropout

model.add(Dropout(rate= 0.3))

 

4. 모델 학습

- 훈련셋으로 모델을 학습시킨다.
- fit() 함수 사용

model.fit(data, label, epochs= MY_EPOCH, batch_size= MY_BATCH, validation_data=(X_val,y_val), verbose = 1, callbacks = [tensorboard, early_stop])
첫 번째 인자 입력 변수
두 번째 인자 출력 변수
epochs 전체 훈련 데이터셋에 대한 학습 반복횟수 지정
batch_size 가중치를 업데이트할 배치 크기
verbose 학습 과정 출력 여부 및 방식 지정
validation_data 검증하는 x,y 데이터
callbacks 텐서보드 콜백함수

 

5. 학습 과정 살펴보기

- 모델 학습시 훈련셋, 검증셋의 손실 및 정확도를 측정
- 반복 횟수에 따른 손실 및 정확도 추이를 보면서 학습 상황을 판단한다.

 

6. 모델 평가하기

- 시험 셋으로 학습한 모델을 평가한다.
- evaluate() 함수 사용한다.

score = model.evaluate(data, label, verbose= 1)
첫 번째 인자 테스트로 사용할 입력변수
두 번째 인자 테스트로 사용할 출력변수