파이썬/딥러닝

[딥러닝] [광주인공지능학원] 딥러닝 기초 실습

취준생코린이 2021. 8. 1. 23:26
728x90

먼저 딥러닝을 하기 위해서 tensorflow 임폴트해주세요.

import tensorflow as tf
print(tf.__version__)

 

 

먼저 딥러닝 AND논리를 합습 해볼거에요!

1. AND논리

# AND 데이터 정의
X = [[0,0], [0,1], [1,0], [1,1]]
y = [0,0,0,1]

 

신경망을 설계해볼겁니다

  • tensorflow, keras 라이브러리 사용
  • keras가 tensorflow의 하위 모듈로 됨

여기서는 활성화 함수로 시그모이드함수를 사용했어요!

파라미터수

  • 입력수 * 출력수 + 출력수
  • 예) 2*1+1 = 3

 

add() : 신경망에 층을 추가
Dense로 퍼셉트론을 쌓는다.
units: 출력의 수를 설정(퍼셉트론의 수)
input_dim: 입력의 수 (특성의 수)

# 신경망 생성
from tensorflow.keras.models import Sequential
# 퍼셉트론으로 구성된 신경층을 정의
from tensorflow.keras.layers import Dense
# 활성화 함수를 정의
from tensorflow.keras.layers import Activation

model = Sequential()

model.add(Dense(units = 1, input_dim=2))
model.add(Activation("sigmoid"))

# 설계한 신경망의 구조를 확인
model.summary()

loss: 손실함수
     -회귀분석 : MSE 또는 mean_squared_error
     -이진분류: binary_crossentropy
     -다진분류: categorical_crossentropy
     -원핫인코딩이 안된 다진 분류: spare_categorical_crossentropy
optimiser: 경사하강법 종류
metrics: 평가 방법
     -회귀분석: metrics를 안씀 -> 자동으로 loss로 설정
     -분류분석: accuracy

 

모델을 실행 할수 있도록 컴파일 수행

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

신경망 모델을 학습

  • 특성데이터, 라벨데이터, 반복수, 데이터수
  • epochs: 몇번 학습을 할 것인지 설정
  • batch_size: epochs마다 몇개씩의 데이터를 사용할것인지 설정
model.fit(X,y, epochs=2000, batch_size=4)

반복수가 1603때 오차가 0.4173이고 정확도가 1이 된걸 확인

 

모델 평가

  • evaluate(특성데이터, 라벨데이터)
  • [0.23724843561649323->오차, 1.0->정확도]
  • loss, accuracy를 모두 반환
model.evaluate(X,y)

예측

  • predict(특성데이터)
  • 0.5보다 크면 1, 0.5보다 작으면 0으로 본다.
  • 결과는 전부 1일 확률
  • 이유는 활성함수로 시그노이드 함수를 사용했기 때문이다.
X_new = [[1,1], [1,0], [0,1], [0,1], [1,1]]
y_new = [1, 0, 0, 0, 1]
pred = model.predict(X_new)
pred

 

짠! 이렇게 AND논리가 잘된걸 볼수있어요.

설명을 하자면 X_new데이터를 보면 [1,1]일때 정답인 y_new 데이터가 1, [1, 0]일때는 0, [0,1]일때는 0 이런식으로 되어있는데 딥러닝으로 X_new데이터를 넣어서 예측을 해보니 y_new데이터 처럼 [1, 0, 0, 0, 1]이라는 결과가 나왔어요

 

2. XOR논리 학습

XOR논리의 경우 AND논리랑 달리 층을 2개이상 쌓아야해요!

층을 하나만 쌓으면 학습이 잘되지않아 예측이 정확하지 않습니다.

그리고  input_dim는 맨처음에만 해도 됩니다.  왜나하면 뒤에부터는 입력이 앞층의 출력수이기 때문이에요. 그래서 컴퓨터가 알아서 input_dim을 설정해줍니다.

X = [[0,0], [0,1], [1,0], [1,1]]
y = [0, 1, 1, 0]

model2 = Sequential()
model2.add(Dense(units = 10, input_dim=2, activation='sigmoid'))
model2.add(Dense(units = 5, activation='sigmoid'))
model2.add(Dense(units = 1, activation='sigmoid'))
model2.summary()

model2.compile(loss="binary_crossentropy",optimizer="adam",metrics=["accuracy"])
model2.fit(X,y, epochs=1000, batch_size=4)

model2.evaluate(X,y)

# 예측
X_new = [[1,1], [1,0], [0,0]]
y_new = [1, 1, 0]
pred = model2.predict(X_new)
pred

모델 설계도

 

모델 평가 결과

 

XOR모델 예측 결과

XOR논리도 결과학습이 잘된걸 확인할수있어요.

답니 [1, 1, 0]인데 결과도 [1, 1, 0]이라고 예측했습니다.

 

 

딥러닝 학습 과정

  1. 파라미터 초기화(w,b)
  • 랜덤 파라미터가 들어감
  1. 특성 데이터 입력(X)
  2. y값을 예측 > y'
  • y = w*x + b
  1. 오차(손실함수)
  • e= y - y'
  1. 오차에 대해 파라미터로 미분
  • 오차를 적용시키기 위해서
  • 오차가 크면 파라미터를 많이 수정
  • 오차가 작으면 파라키더를 적게 수정
  • w와b에대한 기울기를 구함
  1. w,b 업데이터
  • 미분값을 그대로 업데이트 하게되면 변화가 너무 크게 나타남
  • 미분값*학습률 > w,b 업데이트
  1. 2~6을 epochs만큼 반복

 


[중요내용 정리]

 

loss: 손실함수
     -회귀분석 : MSE 또는 mean_squared_error
     -이진분류: binary_crossentropy
     -다진분류: categorical_crossentropy
     -원핫인코딩이 안된 다진 분류: spare_categorical_crossentropy
optimiser: 경사하강법 종류
metrics: 평가 방법
     -회귀분석: metrics를 안씀 -> 자동으로 loss로 설정
     -분류분석: accuracy

 

맨 마지막 층의 출력노드 수는 회귀:1, 이진분류: 1or2, 다진분류: m(y의 클래스)
마지막 층의 활성함수
     -회귀분류: 생략 또는 linear
     -다진분류: sorftmax
     -이진분류:
        -y를 원핫인코딩 안함: sigmoid
        -y를 원핫인코딩 함: sorftmax

 

 

 

스마트인재개발원에서 작성된 수업내용입니다.

https://www.smhrd.or.kr/

 

728x90