이 책에서는 딥러닝을 처음에 간략하게 소개하기 위해 초장부터 직접 데이터셋을 가져와 딥러닝을 구현한다.
데이터셋은 2013년 외국 외과대학에서 공개한 폐암 수술 환자의 수술 전 진단 데이터와 수술 후 생존 결과를 기록한 실제 의료 기록 데이터다. 470개의 라인으로 이루어져 있고 17개의 속성 그리고 하나의 클래스로 구성되어 있다.
속성들은 예를 들어 종양의 유형, 흡연 등등의 환자 특성을 기록했고 클래스는 생존이면 1 사망이면 0을 기록해 폐암 환자의 수술 후 생존율을 예측하는 모델이다.
이제 시작해보자!

먼저 딥러닝을 구동하기 위해 필요한 케라스 함수들을 불러온다.
케라스는 딥러닝을 할 때 제일 많이 쓰이고 있는 라이브러리 "TensorFlow"를 쫓고 있는 유망한 딥러닝 라이브러리다.
텐서플로우로는 이것저것 적용해야 될 부분이 많지만 케라스 라이브러리를 사용하면 자잘한 계산이나 적용문제 없이 딥러닝을 구현할 수 있다는 점에서 딥러닝 초심자에게 많이 사용되고 있다. 물론 딥러닝이 어떻게 구현되는지 확실히 알려면 현재는 텐서플로우가 우위에 있는 건 사실이다..
그리고 지금 import한 함수들은 나중에 사용할 때 설명을 할 테니 잠시만 기다려주세요~

이 부분은 딥러닝을 실행할 때마다 같은 결과를 출력하기 위해 설정하는 부분이다.
random()함수는 컴퓨터 안에 미리 내장된 수많은 '랜덤 테이블'중 하나를 불러내 그 표의 순서대로 숫자를 보여주는 것!
seed 값을 설정한다는 것은 그 랜덤 테이블 중에서 몇 번째 테이블을 불러와 쓸지 정하는 것이다.
따라서 seed 값이 같으면 똑같은 랜덤 값을 출력하게 된다!

이건 말 그대로 데이터셋을 불러오는 부분!

딥러닝을 위해서 속성(attribute)와 클래스(class)를 나눠서 데이터셋에서 데이터를 뽑는 부분이다.

드디어 케라스 함수가 나왔다!
먼저 딥러닝 모델 구조를 구축하기 위해 케라스 함수 중 하나인 Sequential()함수를 사용했고
그 안에 있는 층들을 add함수를 사용해서 구축!
Dense함수는 층의 상태를 정해주는데 첫 번째 인자는 출력 뉴런 수를 말하고
input_dim은 입력 뉴런 수(입력 데이터로부터 몇 개의 값이 들어올지를 정하는 것)고
activation은 활성화 함수( ex) sigmoid , relu, softmax , etc)를 말한다.
간략하게 설명하자면 활성화 함수는 딥러닝을 활성화할 때 적용시킬 함수를 말하는데
가중합의 결과를 놓고 1 또는 0을 출력해 보내주는 데 결과를 0, 1으로 판단하는 함수다.
첫 번째 모델 라인은 사실 입력층, 은닉층 두 개의 역할을 동시에 한다.
Keras는 입력층을 따로 만드는게 아니라 input_dim을 적어줌으로써 역할을 동시에 적용!
따라서 데이터에서 17개의 값을 받아 30개의 노드로 보내준다는 의미다.
이제 은닉층의 각 노드는 17개의 입력 값으로 부터 임의의 가중치를 가지고
각 노드의 전송되어 활성화 함수를 만나 거친 결과 값이 출력층으로 전달된다.
마지막 모델 라인은 출력층 역할을 한다. (그래서 첫 번째 인자(출력 노드 수)가 1개!)

compile함수는 손실함수, optimzer, metrics를 정해준다.
- 손실함수는 신경망을 실행할 때마다 어떻게 오차를 추적할 지 정해주는 함수를 말한다.
- optimizer는 오차를 줄일 방법을 의미!
- metrics는 평가 기준을 의미하며 모델이 컴파일 될 때 모델 수행 결과를 나타나게끔 설정하는 부분이다.
이 모델에서는 accuracy가 평가 기준!(보통 정확성을 기준으로 한다)
model.compile 부분은 앞서 지정한 모델이 효과적으로 구현될 수 있게 여러가지 환경을 설졍해주면서 말그대로 컴파일 하는 부분이다.
model.fit은 아까 설정한 속성, 클래스를 넣고 epochs, batct_size를 설정한다.
여기서 model.fit부분을 이해하기 쉽게 비유를 하기 위해 한 가정을 해보자면
우리가 모의고사를 공부하는 학생이라 해보자.
모의고사 1회분당 100문항이 있고 답지도 있다. 다만 문제(X)와 해답지(Y) 둘다 있어야 학습이 가능하다.
batch_size는 몇 개의 샘플로 가중치를 갱신할 것인지 지정하는 것이다.
예를 들어 batch_size를 10문항으로 정해두면 10문항을 풀고 학습을 해서 다음 10문항을 풀 때 영향을 미칠 수 있도록 가중치를 갱신하는 것!
epoch는 말 그대로 세대를 의미하는데 모의고사 1회분을 1 epoch라고 한다.
그래서 이 딥러닝 모델처럼 epochs=30이면 모의고사 30회분을 풀어야 학습이 완료!
그러면 질문을 해보자.
그럼 epoch를 높일수록 학습률이 증가하나요?
여기에 대한 대답은 "반은 맞고 반은 틀리다".
초반에는 epoch를 늘려 학습률을 높이는 게 중요하지만 적당히 하지 않으면 딥러닝의 함정인
과적합(OverFitting)에 걸려 예측에 대해 악영향을 미치게 된다.
model.fit까지 마치면 딥러닝이 반복 실행되면서 손실을 줄이며 예측률이 어느 정도인지 진행된다.

470개의 데이터라인으로 30개의 epoch동안 실행해보니 손실은 0.1461까지 줄여졌다.

model.evaluate함수는 말 그대로 이 모델의 metrics였던 accuracy를 평가하는 함수다.
정확도는 0.8511, 즉 이 모델로 다른 폐암 환자의 수술 후 생존율을 예측하는 성공률이 85.1%라는 의미와 같다.
이제 끝났다! 대충 감이 올지 모르겠지만 정말 이게 딥러닝의 대부분을 설명해주는 모델이라고 책에서 나와있다.
사실 대부분인지는 저도 계속 공부해봐야겠지만 딥러닝의 기본을 담아낸 것은 확실한 모델이다.
사실 선형회귀, 로지스틱회귀, 최소제곱법, 딥러닝 함수 등 이런 걸 알려주지도 않고 소개하는 것이라 간단하게 설명해주는 파트였는데, 괜히 처음부터 빡세게 해보자며 구글링을 하면서 모르는 부분을 채워나갔는데 알고보니 뒤에 내가 공부한 파트를 확실히 설명해주는 부분이 있었다. 그래서 뒤 파트를 이해하기가 편했다.
여튼 다음 장은 선형 회귀다!
'딥러닝' 카테고리의 다른 글
모두의 딥러닝 (5) - 퍼셉트론 (0) | 2019.12.23 |
---|---|
모두의 딥러닝 (4) - 참 거짓 판단 장치 : 로지스틱 회귀 (0) | 2019.12.23 |
모두의 딥러닝 (3) - 오차 수정하기 : 경사 하강법 (0) | 2019.12.23 |
모두의 딥러닝 (2) - 가장 훌륭한 예측선 긋기: 선형 회귀 (0) | 2019.12.21 |
모두의 딥러닝 (0) | 2019.10.10 |