본문 바로가기
프로그래머/프로그래밍

[케라스] Keras 다층 퍼셉트론 레이어

by plog 2019. 12. 19.

* 김태영님 동영상(https://youtu.be/cJpjAmRO_h8) 강의 정리 노트 
* 참고: 김태영님 블로그(https://tykimos.github.io/)

 

다층 퍼셉트론 

다층 퍼셉트론(Multilayer Perceptron)이란 이제 인간이 생각하고 학습하는 방법을 인공지능이 흉내내기 위해 인공신경망이란 개념을 만들어냈고 이를 실현하기 위해 인간의 뉴런을 퍼셉트론으로 흉내를 내서 그 목적을 실현하려 했으나 인간이 생각하기에는 간단한 XOR문제도 해결을 못하는 난관에 봉착해서 이를 해결하기 위한 시도에서 나온 것이다.

단층 신경망(입력층+출력층) 
다층 신경망(입력층+히든층+출력층) 
심층 신경망(입력층+2개 이상의 히든층+출력층)

 

Dense 레이어

입출력을 모두 연결해주는 Dense 레이어

# 입력 4개, 출력 8개, 학습해야 되는 가중치는 32개

Dense(8, input_dim=4, init='uniform, activation='relu')

  • 첫번째 인자 : 출력 뉴런의 수를 설정.

  • input_dim : 입력 뉴런의 수를 설정.

  • init : 가중치 초기화 방법 설정.

    ‘uniform’ : 균일 분포

    ‘normal’ : 가우시안 분포

  • activation : 활성화 함수 설정.

    ‘linear’ : 디폴트 값, 입력뉴런과 가중치로 계산된 결과값이 그대로 출력.

    ‘relu’ : rectifier 함수, 은익층에 주로 사용.

    ‘sigmoid’ : 시그모이드 함수, 이진 분류 문제에서 출력층에 주로 사용.

    ‘softmax’ : 소프트맥스 함수, 다중 클래스 분류 문제에서 출력층에 사용.

 

코드설명

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

model = Sequential()

 

'''

처음 입력은 4개, 최종 출력은 1개 

은닉층이므로 relu, 이진분류이므로 sigmoid

하이퍼파라미터 튜닝(hyperparameter tuning)시 입력값과 출력값은 수정 불가 (붉은색)

'''

model.add(Dense(8, input_dim=4, init='uniform', activation='relu'))
model.add(Dense(6, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))

 

실습

1) 문제 정의

데이터셋은 8개 변수와 당뇨병 발병 유무가 기록된 ‘피마족 인디언 당뇨병 발병 데이터셋’이 있습니다. 이 데이터셋을 이용하여 8개 변수를 독립변수로 보고 당뇨병 발병 유무를 예측하는 이진 분류 문제로 정의.

 

2) 데이터 준비

데이터셋

https://gist.github.com/ktisha/c21e73a1bd1700294ef790c56c8aec1f

 

pima-indians-diabetes.csv

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

첨부 파일 (다운로드 안될경우)

pima-indians-diabetes.csv
0.02MB

  • CSV파일 이므로 엑셀 또는 노트패드에서 확인 가능

  • 8가지 속성과 결과로 구성 

  • 인스턴수 768개 (데이터 수)

(1) 임신 횟수
(2) 경구 포도당 내성 검사에서 2시간 동안의 혈장 포도당 농도
(3) 이완기 혈압 (mm Hg)
(4) 삼두근 피부 두겹 두께 (mm)
(5) 2 시간 혈청 인슐린 (mu U/ml)
(6) 체질량 지수
(7) 당뇨 직계 가족력
(8) 나이 (세)
(9) 5년 이내 당뇨병이 발병 여부 << 결과 

 

  • 코랩에서 파일 업로드 하기 

코랩 왼쪽에 있는 열기 >> 파일 >> 업로드 

업로드후 

3) 예제 코드

# 0. 사용할 패키지 불러오기
import numpy as np
from keras.models import Sequential
from keras.layers import Dense

# 랜덤시드 고정시키기
'''
매번 실행 시마다 결과가 달라지지 않도록 랜덤 시드를 명시적으로 지정
'''
np.random.seed(5)

# 1. 데이터 준비하기
dataset = np.loadtxt("pima-indians-diabetes.csv", delimiter=",")

# 2. 데이터셋 생성하기
x_train = dataset[:600,0:8] # 훈련셋
y_train = dataset[:600,8]

x_val = dataset[600:700,0:8] # 검증셋
y_val = dataset[600:700,8]

x_test = dataset[700:,0:8] # 테스트
y_test = dataset[700:,8]

# 3. 모델 구성하기
'''
첫번째 Dense 레이어는 8개 뉴런을 입력받아 12개 뉴런을 출력합니다.
두번째 Dense 레이어는 12개 뉴런을 입력받아 8개 뉴런을 출력합니다.
     이전 레이어에서 12개 출력이 발생하므로 굳이 input_dim을 넣지 않아도 된다.
마지막 Dense 레이어는 출럭 레이어로 8개 뉴런을 입력받아 1개 뉴런을 출력합니다.
'''
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 4. 모델 학습과정 설정하기
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 5. 모델 학습시키기
'''
첫번째 인자 : 입력 변수입니다. 8개의 속성 값을 담고 있는 X를 입력합니다.
두번째 인자 : 출력 변수 즉 라벨값입니다. 결과 값을 담고 았는 Y를 입력합니다.
epochs : 전체 훈련 데이터셋에 대해 학습 반복 횟수를 지정합니다. 1500번을 반복적으로 학습시켜 보겠습니다.
batch_size : 가중치를 업데이트할 배치 크기를 의미하며, 64개로 지정했습니다.
validation_data : 검증셋
'''
model.fit(x_train, y_train, epochs=1500, batch_size=64, validation_data=(x_val, y_val))

# 6. 모델 평가하기
scores = model.evaluate(x_test, y_test)
print("%s: %.2f%%" %(model.metrics_names[1], scores[1]*100))

 

댓글