CH6. 딥러닝(1) - 딥러닝 개요와 Keras 코드 파헤치기
Deep learning(딥러닝)
- DNN(Deep Neural Network)을 이용한 머신러닝 기법
- hidden layer가 2개 이상인 network를 의미
- 다층의 layer를 통해 복잡한 데이터 학습이 가능
- overfitting이 쉽게 일어나고, 학습시간이 오래 걸림
각 layer의 역할
1. Input layer
- 데이터를 받아 hidden layer의 모든 Neuron으로 재분배
2. Hidden layer
- 데이터의 특성 파악
3. Ouput layer
- hidden layer의 신호를 받아 전체 신경망의 출력 패턴을 정함
※ Hidden layer
은닉 층과 은닉 노드의 수는 분석가가 분석 경험에 의해 설정한다.
- hidden layer가 너무 적은 경우
- 네트워크가 복잡한 의사결정 경계를 만들 수 없다.
- Underfitting 문제가 발생한다.
- hidden layer가 너무 많은 경우
- 복잡성을 만들 수 있지만 일반화가 어렵다.
- layer가 늘어나면 기울기 소실 문제가 발생할 수 있다.
- 과대적합 문제 발생
딥러닝 코드 파헤치기(Sequential API)
1. 라이브러리 호출
케라스는 거의 모든 종류의 딥러닝 모델을 간편하게 만들고 훈련시킬 수 있는 파이썬을 위한 딥러닝 프레임워크로 여러 가지 백엔드 엔진이 케라스와 매끄럽게 연동된다. 현재는 텐서플로, 씨아노, 마이크로소프트 코그니티브 툴킷 Microsoft Cognitive Toolkit, CNTK 3개를 백엔드 엔진으로 사용할 수 있다. 텐서플로, CNTK, 씨아노는 딥러닝을 위한 주요 플랫폼 중 하나이다. 가장 널리 사용되고 확장성이 뛰어나며 상용 제품에 쓸 수 있기 때문에 대부분의 딥러닝 작업에 텐서플로 백엔드가 기본으로 권장된다. 모델을 정의하는 방법은 두 가지인데, Sequential API(가장 자주 사용하는 구조인 층을 순서대로 쌓아 올린 네트워크) 또는 Functional API(완전히 임의의 구조를 만들 수 있는 비순환 유향 그래프)를 사용한다.
from tensorflow.keras.backend import clear_session
from tensorflow.keras.models import Sequential
from tensroflow.keras.layers import Dense
2. 모델 구성
1. Sequential(): 케라스에서는 층을 구성하기 위해 Sequential()을 사용한다. Sequential()을 model로 선언한 뒤에 model.add()라는 코드를 통해 층을 단계적으로 추가한다.
2. Dense(): 첫 번째 인자의 값은 8인데 이는 총 8개의 출력 뉴런을 의미한다. Dense()의 두 번째 인자인 input_shape은 입력층의 뉴런 수를 의미한다. 즉 입력 데이터의 feature 수로 이해하면 된다. 이 경우에는 사전에 정의한 input_dim = 10이다.
- 첫번째 인자 = 출력 뉴런의 수.
- input_dim = 입력 뉴런의 수. (입력의 차원)
- activation = 활성화 함수.
두 번째 Dense()는 input_dim 인자가 없는데, 이는 이미 이전 층의 뉴런 수가 8개임을 알고있기 때문이다. 위 코드에서 두번째 Dense()는 마지막 층이므로, 첫 번째 인자 2는 결국 출력층의 뉴런 개수가 됩니다.
3. summary() : 모델의 정보를 요약해서 보여준다.
# 모델 선언
model = Sequential()
input_dim = 10
# 모델 구성
model.add(Dense(8, input_shape = (input_dim, ), activation = 'relu')
model.add(Dense(2, activation = 'softmax'))
# 모델의 정보 요약
model.summary()
3. 컴파일
선언된 모델에 대해 몇 가지 설정을 한 후, 컴퓨터가 이해할 수 있는 형태로 변환하는 작업
- optimizer = 훈련 과정을 설정하는 옵티마이저를 설정
- loss = 훈련 과정에서 사용할 손실 함수(loss function)를 설정(회귀/분류 목적에 따라 다르다.)
- metrics = 훈련을 모니터링하기 위한 지표를 선택
문제 유형 | 손실함수 | 출력층의 활성화 함수 |
회귀 | mean_squared_error | - |
이진 분류 | binary_crossentropy | 시그모이드 |
다중 분류(레이블 원핫인코딩O) | categorical_crossentropy | 소프트맥스 |
다중 분류(레이블 원핫인코딩X) | sparse_categorical_crossentropy | 소프트맥스 |
model.compile(loss = saprse_crossentropy,
matrics = ['accuracy'],
activation = 'relu')
4. 모델 학습
- x= 훈련 데이터
- y = 지도 학습에서 레이블 데이터
- epochs = 에포크. 에포크 1은 전체 데이터를 한 차례 훑고 지나갔음을 의미함. 정수값 기재 필요. 총 훈련 횟수를 정의
- batch_size = 배치 크기. 기본값은 32. (미니 배치 경사 하강법을 사용하고 싶지 않을 경우에는 batch_size=None)
- validation_split = validation_data와 동일하게 검증 데이터를 사용하기 위한 용도, 련 데이터의 레이블인 X_train과 y_train에서 일정 비율 분리하여 이를 검증 데이터로 사용한다.
- verbose = 학습 중 출력되는 문구를 설정합니다. (0 : 아무것도 출력하지 않는다. 1 : 훈련의 진행도를 보여주는 진행 막대를 보여준다. 2 : 미니 배치마다 손실 정보를 출력한다.)
history = model.fit(x_train, y_train,
batch_size = batch_size,
epochs = epochs,
validation_split = 0.2,
verbose = 1)
5. 모델 학습&성능 확인
모델 학습 횟수에 따른 loss & accuracy의 성능을 시각적으로 확인한다.
history.history['loss'].plot()
history.history['accuracy'].plot()
plt.legend(['loss', 'accuracy'])
plt.xlabel('epochs')
plt.ylabel('loss & accuracy')
plt.show()
6. 모델 성능 평가 및 예측
테스트 데이터를 통해 학습한 모델에 대한 정확도를 평가한다.
모델 성능평가
model.evaluate(X_test, y_test, batch_size=32)
모델 예측
model.predict(X_input, batch_size=32)
7. 모델 저장과 불러오기
습이 끝난 신경망의 구조를 보존하고 계속해서 사용하기 위해 모델을 저장하고 다시 불러와서 사용한다.
# 모델 저장
model.save("model_name.h5")
# 모델 불러오기
from tensorflow.keras.models import load_model
model = load_model("model_name.h5")
※ 케라스 구현 방식에 대한 이해
1) Sequential API
장점 : 단순하게 층을 쌓는 방식으로 쉽고 사용하기가 간단하다
단점 : 다수의 입력(multi-input), 다수의 출력(multi-output)을 가진 모델 또는 층 간의 연결(concatenate)이나 덧셈(Add)과 같은 연산을 하는 모델을 구현하기에는 적합하지 않습니다. 이런 모델들의 구현은 Functional API를 사용해야 한다.
2) Functional API
장점 : Sequential API로는 구현하기 어려운 복잡한 모델들을 구현할 수 있다.
단점 : 입력의 크기(shape)를 명시한 입력층(Input layer)을 모델의 앞단에 정의해주어야 한다.
3) Subclassing API
장점 : Functional API로도 구현할 수 없는 모델들조차 구현이 가능하다.
단점 : 객체 지향 프로그래밍(Object-oriented programming)에 익숙해야 하므로 코드 사용이 가장 까다롭다.