본문 바로가기

Data Scientist

피마 인디언 당뇨병 예측하기 - 2편: 딥러닝 구조 짜기

반응형

 

 

2020/01/23 - [딥러닝] - 피마 인디언 당뇨병 예측하기 - 1편: 데이터 불러오기

1편에 이어서 간단하게 딥러닝 구조를 짜도록 하겠습니다. 

 

딥러닝 구조 짜기

# 모델 설정 
model = Sequential()   # 2, 4,, 8, 16, 32, 64, 128, 256, 512, 1024 2진법 구조로 생각
model.add(Dense(16, input_dim=8, activation = 'relu'))  #0부터 7까지였으니 8개 인풋 #히든 레이어
model.add(Dense(8, activation = 'relu'))   #히든레이어 
model.add(Dense(1, activation = 'sigmoid')) #이진분류 #아웃풋레이어 

 

model은 앞서 말했던 Sequntial을 사용하여 빈 그릇을 만들어 줍니다.

거기에 인풋 데이터인 input_dim은 8개(X값)입니다.

activation은 활성화 함수로 'relu'를 사용해 주었습니다.

Rectifier = 'relu'  사진출처: wikipedia

relu는 x값이 0보다 작다면 무조건 0으로, 0보다 큰 값이라면 해당하는 값으로 출력하게 해줍니다. 

같이 출력된 'softplus'는 0을 만드는 기준을 완화시키는 것으로 0 또는 x를 출력하는 로그함수입니다.

'softplus'
'relu'

이렇게 0또는 x로 positive part만 출력해주기 때문에 Vanishing(전달하다 사라짐)을 해결하고 은닉층에 사용합니다. 

이는 기존의 sigmoid함수와 차이가 있죠. 

'Sigmid' logistic curve 사진출처: wikipedia

sigmoid 함수는 0또는 1의 값만 출력하기 때문에 이진 분류 출력층에 사용합니다. 

# 모델 컴파일
model.compile(loss = 'binary_crossentropy', optimizer ='adam', metrics=['accuracy'])

모델을 구축해주었으면 컴파일(엮다, 편집하다)을 해주어야 합니다. 

모델이 효과적으로 시행되도록 환경을 설정해주는 것인데

차례대로 오차함수, 최적화함수, 메트릭스입니다.

오차함수는 다양한 것이 있는데 지금 사용한

'binary_crossentropy'의 경우 두 개의 클래스 중에서

예측할 때 사용합니다. 교차엔트로피 중에는 'categorical_crossentropy'도

있는데 이는 범주형 교차엔트로피(일반적인 분류)입니다. 

이 외에는 평균 제곱 계열이 있으며 주로 회귀모형에 사용합니다.

 

평균 제곱 계열: {mean_squared_error, mean_absolute_error,

mean_absolute_percentage_error, mean_squared_logarithmic_error}

 

최적화 함수인 adam은 다른 최적화 함수에 비해 보폭 크기와 정확도가 높다고 합니다.

# 모델 실행
model.fit(X, Y, epochs=200, batch_size = 10)

모델을 적용해줍니다.

학습량은 200번만 돌려줍니다.

batch_size는 원 데이터의 개수(X)가 몇개씩 들어가게 해줄거니?

좀 더 쉽게 설명해주시는 분들은 200권의 문제집을 풀게 시킬건데 10권을 풀었을 때 

한번에 답맞춰보게 한다. 대략 이런 식으로 설명해주셨어요. 

근데 이게 약간은 개념이 다른 것 같기도 해요. 

X(=768)가 몇개 단위로 끊어서 학습을 시킬거니? 여기선 10이니까 

1번의 학습에 10개씩 77번을 수행하면 1권의 문제집을 풀었다.

라고 이해를 했습니다.. 

 

이렇게 학습 중인 모습이구요.

# 결과 출력  ( 정확도 )
print( 'Accuracy: %.4f' % (model.evaluate(X,Y)[1]))   # 4f : 소수점 넷째 자리 까지


768/768 [==============================] - 0s 78us/step
Accuracy: 0.7891
model.evaluate(X,Y)   # 앞이 로스, 뒤가 정확도 

768/768 [==============================] - 0s 39us/step
[0.4516071043908596, 0.7890625]

앞의 print는 4번째 float(실수), 소수 넷째 자리까지 출력하란 얘기입니다. 

model.evaluate(X,Y)[1]로 인덱스를 1을 준 이유는 1이 정확도고 0이 오차이기 때문입니다.

200번의 학습 결과 78.91%의 정확도가 나왔네요. 

정말 비루한 결과인 것 같습니다... ㅋㅋㅋㅋ

하지만 아직 노드나 층도 얼마 쌓지 않았고, 다른 많은 기법들이 있지만 적용이 안되었습니다.

배움이 짧아 못한것..이지만 앞으로도 계속 공부해나가겠습니다.

 

중간에 ppt는 https://www.slideshare.net/yongho/ss-79607172

 

자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.

백날 자습해도 이해 안 가던 딥러닝, 머리속에 인스톨 시켜드립니다. 이 슬라이드를 보고 나면, 유명한 영상인식을 위한 딥러닝 구조 VGG를 코드 수준에서 읽으실 수 있을 거에요

www.slideshare.net

 

 

 

 

 

 

이 곳에서 퍼왔습니다. 하용호님이 올려주신 내용인데 쉽고 재밌게 설명해주셨습니다! 

 

 

 

감사합니다~~ 

 

😁

반응형