딥러닝

[DL]3. 퍼셉트론, 다층퍼셉트론

CodeJaram 2023. 9. 11. 13:37

딥러닝_03_퍼셉트론, 다층퍼셉트론

 

[퍼셉트론]

 

  1. 퍼셉트론: 선형모델+활성화 함수 

 

  • 인간의 뉴런은 모든 자극에 반응하는 게 아니라 자극의 크기가 역치 이상일 때 반응함

*역치: 반응을 일으키기 위한 최소한의 자극의 세기

 

  • 역치의 개념을 활성화 함수로 표현

 

  • 입력데이터가 활성화 함수를 통해 자극에 반응할 것인지 결정됨

 

1)Step function(계단함수): 퍼셉트론에 활용되는 활성화 함수. X값이 0 이하면 y는 0(무반응), 0을 초과하면 1(반응)

 

2)시그모이드 함수(sigmoid 함수): 경사하강법을 사용할 때 필요한 기울기가 있는 함수

  • 경사하강법:  예측값과 정답값 간의 차이인 손실 함수의 크기를 최소화시키는 파라미터를 찾기 위해 최적의 가중치와 절편의 값을 찾는 방법

 

 

2. 다층 퍼셉트론(MLP, Multi Layer Perceptron): XOR 문제 해결하기 위해 고안한 퍼셉트론을 여러 개의 층으로 구성하여 만든 신경망

 

<기존의 퍼셉트론>

  • AND 게이트: X1, X2가 모두 참이면 참
  • OR 게이트: X1, X2 중 하나가 참이면 참

 

  • XOR 게이트: 하나의 퍼셉트론(선형모델)으로는 해결할 수 없음

 

  • XOR 게이트를 구현한 다층 퍼셉트론의 구조

 

  • NAND: AND 연산의 결과값을 반대로 출력하는 연산

  • XOR 게이트를 NAND 연산을 통해 해결할 수 있음



  • 다층 퍼셉트론의 구조

 

  • 예측데이터의 종류에 따라 출력층의 개수나 활성화 함수의 종류가 달라짐

-예측데이터가 범주형 데이터→분류

-예측데이터가 연속형 데이터→회귀

 

 

  • 다층퍼셉트론의 특징

-한 번의 연산으로는 해결되지 않는 문제 해결 예)XOR 게이트

-단층 퍼셉트론에 학습시간이 오래 걸림

-모델(신경망)이 복잡해지면서 과대적합이 발생하기 쉬움

 

 

[유방암 분류 실습]

1.  목표

  • 환자 데이터를 바탕으로 유방암 여부를 판단하기
  • 딥러닝을 통해 이진분류 진행
  • sklearn에서 제공하는 load_breast_cance 데이터 사용

 

#라이브러리 불러오기

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

 

2.  데이터 불러오기

#유방암 데이터 가져오기

from sklearn.datasets import load_breast_cancer

 

#데이터 불러오기

breast_data=load_breast_cancer()

 

#key 확인

breast_data.keys()

 

#입력데이터: data

#출력데이터: target

#출력데이터의 종류: target_name

#특성의 이름: feature_names

 

#데이터 설명

print(breast_data.DESCR)

 

#30개의 특성(Number of Attributes)과 2개의 클래스(class)를 가진 데이터

#특성의 개수->입력층의 입력특성 개수

#클래스의 개수->분류의 종류 파악(이진/다중분류)

 

#타겟 이름(결과데이터의 종류) 확인

 

breast_data.target_names

 

#malignant: 악성종양[0], benign: 양성종양[1]



3.문제 정답데이터 분리

X=breast_data['data']

y=breast_data['target']

 

#train/test 데이터 분리

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test=train_test_split(X, y, test_size=0.2, random_state=10)

 

4.신경망 모델링

1)신경망 모델 구조 설계

2)신경망 학습방법 및 평가방법 설정: 정답데이터의 종류에 따라 달라짐

  • 분류: 정답데이터의 종류가 범주형 데이터일 때(이진분류, 다중분류)
  • 회귀: 정답데이터의 종류가 연속형 데이터일 때

3)신경망 학습 및 학습결과 시각화

4)모델 예측 및 평가

 

#tensorflow 모델링 도구 불러오기

 

from tensorflow.keras.models import Sequential #모델의 뼈대

 

#신경망의 구성요소

from tensorflow.keras.layers import InputLayer, Dense, Activation

 

1)신경망 모델 구조 설계: 다층퍼셉트론(신경망모델+활성화함수*n개)

#1. 신경망 모델 구조 설계

 

#1-1. 뼈대 생성

model=Sequential()

 

#1-2. 입력층 추가하기(InputLayer)

#입력층에 특성의 개수를 정확하게 입력!

model.add(InputLayer(input_shape=(30,)))

 

#1-3. 연산층 추가하기(Dense)

#퍼셉트론: 신경망모델(units)+활성화 함수(activation)

#다층퍼셉트론: 퍼셉트론(Dense)을 여러 개 구성

model.add(Dense(units=16, activation='sigmoid'))

model.add(Dense(units=8, activation='sigmoid'))

 

#1-4. 출력층 추가하기(Dense)

model.add(Dense(units=1, activation='sigmoid'))

 

#이진분류: 하나의 퍼셉트론과 sigmoid 활성화 함수를 추가함

 

2)신경망 학습방법 및 평가방법 설정

#2. 모델 학습 및 평가 방법 설정

 

#이진분류모델

#최적화 손실함수:binary_crossentropy

#최적화 알고리즘: Adam

#평가방법: accuracy(정확도)

 

model.compile(loss='binary_crossentropy',

              optimizer='Adam',

              metrics=['accuracy']

              )

 

3)신경망 학습 및 학습결과 시각화

#3. 신경망 학습 및 학습결과 시각화

breast_history=model.fit(X_train, y_train,

                         validation_split=0.2,

                         epochs=100)

 

#학습결과 시각화

plt.figure(figsize=(10,5))

plt.plot(breast_history.history['loss'], label='train_loss')

plt.plot(breast_history.history['val_loss'], label='val_loss')

 

plt.legend()

 

plt.show()

 

 

 

#모델에 대한 전체적인 내부 구조 확인

model.summary()

 

#Layer, Parameter 확인

 

#y=w1x+w2x2....+b

#dense Param=17(30개의 입력특성(가중치)+절편 1개)x8(선형모델의 개수)=496

#dense1 Param=17(16개의 입력특성(가중치)+절편 1개)x8(선형모델의 개수)=136

 

#출력층(dense2) Output Shape->결과값

#분류의 결과값->확률

#->50%를 기준으로 50% 미만이면 0, 50% 이상이면 1




'딥러닝' 카테고리의 다른 글

[DL]6. CNN  (0) 2023.09.20
[DL]5. 오차 역전파  (0) 2023.09.15
[DL]4. 다중분류  (0) 2023.09.14
[DL]2. 딥러닝 개요  (0) 2023.09.09
[DL]1. 텍스트 마이닝  (0) 2023.09.06