ML/모두의 딥러닝

10장) 모델 설계하기

busy맨 2023. 7. 10. 17:09

1. 모델의 정의

ex) 폐암 수술 환자의 생존율 예측하기

Code)

# 딥러닝을 구동하는 데 필요한 케라스 함수를 불러옵니다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 필요한 라이브러리를 불러옵니다.
import numpy as np
import tensorflow as tf

# 실행할 때마다 같은 결과를 출력하기 위해 설정하는 부분입니다.
np.random.seed(3)
tf.random.set_seed(3)

# 준비된 수술 환자 데이터를 불러들입니다.
Data_set = np.loadtxt("../dataset/ThoraricSurgery.csv", delimiter=",")

# 환자의 기록과 수술 결과를 X와 Y로 구분하여 저장합니다.
X = Data_set[:,0:17]
Y = Data_set[:,17]

# 딥러닝 구조를 결정합니다(모델을 설정하고 실행하는 부분입니다).
model = Sequential()
model.add(Dense(30, input_dim=17, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 딥러닝을 실행합니다.
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=100, batch_size=10)
  • 딥러닝의 모델을 설정하고 구동하는 부분은 model이라는 함수를 선언하며 시작
  • Sequential()
    • 딥러닝의 구조를 짜고 층을 설정하는 부분
  • compile()
    • 위에서 정해진 모델을 컴퓨터가 알아들을 수 있게끔 컴파일 하는 부분
  • fit()
    • 모델을 실제로 수행하는 부분

 

2. 입력층, 은닉층, 출력층

딥러닝의 구조를 짜고 층을 설정하는 부분

# 딥러닝 구조를 결정합니다(모델을 설정하고 실행하는 부분입니다).
model = Sequential()
model.add(Dense(30, input_dim=17, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
  • Sequential() 함수를 model로 선언해 놓고 add()하면 새로운 층이 생성
  • 예제에서는 2개의 층을 생성
  • 맨 마지막 층은 결과를 출력하는 출력층이 되고, 나머지는 모두 은닉층
  • add()를 통해 새 층을 만들고 Dense()를 통해 구체적으로 구조 결정

model.add(Dense(30, input_dim=17, activation='relu'))
  • 노드 30개 생성
  • input_dim
    • 은닉층 + 입력층의 역할을 겸함
    • 즉 데이터에서 17개의 값을 받아 은닉층의 30개 노드로 전달
  • activation
    • 은닉층의 각 노드는 17개 입력 값에서 임의의 가중치를 가지고 각 노드로 전송되어 활성화 함수를 만남
    • 우리가 원하는 활성화 함수를 적어줌
    • 예제에서는 relu함수를 활성화 함수로 사용
    • 활성화 함수를 거친 결과값이 출력층으로 전달
model.add(Dense(1, activation='sigmoid'))
  • 출력값을 하나로 정해야 하므로 출력층의 노드의 수는 1
  • activation
    • 노드에서 입력받은 값이 활성화 함수를 거쳐 최종 출력
    • 예제에서는 sigmoid함수 사용

 

3. 모델 컴파일

model.compile(loss='binary_crossentropy', optimizer='adam', metrics= ['accuracy'])
  • loss
    • 어떤 오차 함수를 사용할 지 결정
    • 예제에서는 이항 교차 엔트로피 사용
  • optimizer
    • 최적화를 위한 방법 결정
    • 예제에서는 Adam사용
  • matrices
    • 모델이 컴파일될 때 모델 수행 결과를 나타내게끔 설정
    • 과적합(overfitting) 문제를 방지하는 기능

 

4. 교차 엔트로피

  • 예측 값이 참과 거짓 둘 중 하나인 형식일 때, binary_crossentropy(이항 교차 엔트로피) 사용
  • 주로 분류 문제에서 많이 사용
평균 제곱 계열 mean_squared_error 평균 제곱 오차
계산: mean(square(yt - yo))
mean_absolute_error 평균 절대 오차(실제 값과 예측 값 차이의 절댓값 평균)
계산: mean(abs(yt - yo))
mean_absolute_percentage_error 평균 절대 백분율 오차(절댓값 오차를 절댓값으로 나눈 후 평균)
계산: mean(abs(yt - yo)/abs(yt)) (단, 분모 ≠ 0)
mean_squared_logarithmic_error 평균 제곱 로그 오차(실제 값과 예측 값에 로그를 적용한 값의 차이를 제곱한 값의 평균)
계산: mean(square((log(yo) + 1) - (log(yt) + 1)))
교차 엔트로피 계열
(다항 분류, 이항 분류)
categorical_crossentropy 범주형 교차 엔트로피(다항 분류, 여럿 중 하나를 예측할 때)
binary_crossentropy 이항 교차 엔트로피(이항 분류, 둘 중 하나를 예측할 때)

 

5. 모델 실행하기

model.fit(X, Y, epochs=100, batch_size=10)
  • fit()
    • 컴파일 단계에서 정해진 환경을 주어진 데이터를 불러 실행시킬 때 사용되는 함수
  • epoch(에포크)
    • 반복 횟수
    • 예제에서는 100번 반복하라는 의미
  • batch_size
    • 샘플을 한 번에 몇 개씩 처리할지를 정하는 부분
    • 예제에서는 10개씩 끊어서 처리하라는 의미
    • bath_size 값이 너무 크면 학습 속도가 느려지고, 너무 작으면 각 실행 값의 편차가 생겨 전체 결과값이 불안정해질 수 있음
      → 메모리가 감당할 만큼의 batch_size로 설정하는 것이 중요

'ML > 모두의 딥러닝' 카테고리의 다른 글

12장) 다중 분류 문제 해결하기  (0) 2023.07.11
11장) 데이터 다루기  (0) 2023.07.11
9장) 신경망에서 딥러닝으로  (0) 2023.07.10
8장) 오차 역전파  (0) 2023.07.10
7장) 다층 퍼셉트론  (0) 2023.07.10