먼저 딥러닝을 하기 위해서 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논리도 결과학습이 잘된걸 확인할수있어요.
답니 [1, 1, 0]인데 결과도 [1, 1, 0]이라고 예측했습니다.
딥러닝 학습 과정
- 파라미터 초기화(w,b)
- 랜덤 파라미터가 들어감
- 특성 데이터 입력(X)
- y값을 예측 > y'
- y = w*x + b
- 오차(손실함수)
- e= y - y'
- 오차에 대해 파라미터로 미분
- 오차를 적용시키기 위해서
- 오차가 크면 파라미터를 많이 수정
- 오차가 작으면 파라키더를 적게 수정
- w와b에대한 기울기를 구함
- w,b 업데이터
- 미분값을 그대로 업데이트 하게되면 변화가 너무 크게 나타남
- 미분값*학습률 > w,b 업데이트
- 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
스마트인재개발원에서 작성된 수업내용입니다.
'파이썬 > 딥러닝' 카테고리의 다른 글
[딥러닝] Simple RNN 단어의 다음 알파벳 맞추기 [광주인공지능학원] (0) | 2021.08.22 |
---|---|
[광주인공지능학원] CNN (합성곱 신경망) (0) | 2021.08.16 |
[딥러닝][광주인공지능학원] 딥러닝 실습 - 와인 데이터 & 폐암환자 데이터 (0) | 2021.08.01 |
[딥러닝] 딥러닝 기초 [광주인공지능학원] (0) | 2021.07.26 |
[딥러닝] 딥러닝의 역사 [광주인공지능학원] (0) | 2021.07.25 |