딥러닝 기초 #8 - 딥러닝 모델 설계 예제

OilyHand·2024년 1월 8일
0

딥러닝 기초

목록 보기
8/17
post-thumbnail

1. 예제를 통한 딥러닝 모델 설계


  • 딥러닝 모델 설계 실습은 모두의 딥러닝에서 사용하고 있는 '폐암 수술 환자의 생존율 예측하기'를 이용하여 진행합니다.

  • 예제 코드

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
import os

# 깃허브에서 데이터 가져오기
print os.system("git clone https://github.com/taehojo/data.git")
Data_set = np.loadtxt("./data/ThoraricSurgery3.csv", delimiter=",")

X = Data_set[:,0:16]  # 환자의 진찰 기록
y = Data_set[:,16]    # 수술 1년 후 사망/생존 여부

# 딥러닝 모델의 구조 결정
model = Sequential()
model.add(Dense(30, input_dim=16, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 딥러닝 모델을 실행
model.compile(loss='binary_crossentropy', optimizer='adam',
metrics=['accuracy'])
history = model.fit(X, y, epochs=5, batch_size=16)

 

1.1. 모델의 정의

우선 딥러닝 모델을 설계하기 위해 먼저 tensorflow 라이브러리 안에 있는 keras API에 있는 함수를 사용합니다.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

 

다음과 같이 keras API의 함수들을 이용하여 딥러닝 모델의 구조와 층 등을 설정합니다.

  • model = Sequential() : keras를 이용하여 모델을 선언하는 부분

  • model.add(Dense()) : 모델에 층을 추가하는 부분

  • model.compile() : 모델을 컴퓨터 언어로 컴파일하는 부분

  • model.fit() : 학습을 실행하는 부분

 

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

입력층, 은닉층, 출력층을 만들어나가는 부분은 다음과 같습니다.

model = Sequential()
model.add(Dense(30, input_dim=16, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
  • Sequential()는 keras에서 쉽게 층 구조를 구현할 수 있도록 도와주는 함수입니다.
  • model.add()는 층을 추가하는 함수입니다.
    • 맨 마지막 층이 출력층이므로 첫번째로 등장하는 add 부분이 은닉층이고 두번째 add 부분이 출력층에 해당하는 코드입니다.
  • add()를 이용하여 추가하는 층은 Dense() 함수에 의해 구체적인 구조가 결정됩니다.

    • Dense(30, input_dim=16, activation='relu')

      • 30은 이 층에 만들 노드의 수를 의미합니다.
      • input_dim=16은 가져올 입력 데이터의 속성 수를 의미합니다.
      • activation='relu'는 활성화 함수를 지정하는 부분입니다. 여기서는 ReLU 함수를 활성화 함수로 사용합니다.
    • Dense(1, activation='sigmoid')

      • 1은 이 층에 만들 노드의 수를 의미합니다. 예제에서는 출력층에서 하나의 출력만 필요하여 하나의 노드를 만듭니다.
      • 출력층에서는 활성화 함수를 시그모이드 함수로 지정하였습니다.

 

1.3. 모델 컴파일

아래 코드는 지정한 모델이 효과적으로 구현될 수 있도록 여러 설정을 하여 컴파일하는 부분입니다.

model.compile(loss='binary_crossentropy', optimizer='adam',
metrics=['accuracy'])
  • loss='binary_crossentropy'

    • 이 부분은 손실 함수를 정하는 부분입니다. 예제에서는 사망과 생존 둘 중 하나의 결과만 있으므로 앞서 다뤘던 교차 엔트로피 오차 함수를 선택하였습니다.

    • 대표적인 손실함수

      loss이름내용
      mean_squared_error평균 제곱 오차실제 값과 예측 값 차이를 제곱한 값의 평균
      mean_absolute_error평균 절대 오차실제 값과 예측 값 차이의 절댓값의 평균
      mean_absolute_percentage_error평균 절대 백분율 오차절댓값 오차를 절댓값으로 나눈 후 평균
      mean_squared_logarithmic_error평균 제곱 로그 오차실제 값과 예측 값에 로그를 적용한 값의 차이를 제곱한 값의 평균
      categorical_crossentropy범주형 교차 엔트로피예측 결과 범주의 수가 여러 개일 때
      binary_crossentropy이항 교차 엔트로피예측 결과 범주의 수가 두 개일 때
  • optimizer='adam'
    • 옵티마이저를 선택하는 부분입니다. 예제에서는 현재 가장 많이 쓰이는 adam을 선택합니다.
  • metrics=['accuracy']
    • metrics() 함수는 모델이 컴파일 될 때 모델 수행의 결과를 나타내게끔 설정하는 부분입니다. accuracy는 학습셋에 대한 정확도에 기반해 결과를 출력하라는 의미입니다.

 

1.4. 모델 실행

실질적으로 모델을 실행하는 부분은 다음 코드 부분입니다.

history = model.fit(X, y, epochs=5, batch_size=16)
  • 차례대로 입력 데이터셋, 출력 데이터셋, 학습 프로세스의 반복 횟수(에포크), 한번에 처리할 샘플의 수를 의미합니다.

 

 


Reference
- 해당 글은 "모두의 딥러닝" 10장을 기반으로 작성되었습니다.

  1. 조태호. 모두의 딥러닝 (개정3판). 길벗(2022)
profile
Electrical Engineering

0개의 댓글