취업 준비/AIVLE SCHOOL

CH6. 딥러닝(1) - 딥러닝 개요와 Keras 코드 파헤치기

BraveTiger 2023. 4. 25. 09:29

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의 신호를 받아 전체 신경망의 출력 패턴을 정함

출처: https://hongong.hanbit.co.kr/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%84-%EC%86%8C%EA%B0%9C%ED%95%A9%EB%8B%88%EB%8B%A4/

※ 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")

 

※ 케라스 구현 방식에 대한 이해

출처: https://wikidocs.net/106897

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)에 익숙해야 하므로 코드 사용이 가장 까다롭다.