2장. 퍼셉트론
1 퍼셉트론이란?
- 인간의 뇌세포 하나를 컴퓨터로 흉내낸 것
- 1957년에 프랑크 로젠블라트가 고안
- 사람의 뇌 동작으로 전기 스위치 온/오프로 흉내낼 수 있다는 이론을 증명함
퍼셉트론을 간단히 얘기하면 인간의 뇌의 신경세포 하나를 컴퓨터로 흉내 냄.
1. 자극(stimulus)
2. 반응(reponse)
3. 역치(threshold)
"특정 자극이 있다면 그 자극이 어느 역치 이상이어야 세포가 반응한다"
ex. 짜게 먹는 사람은 자기가 평소에 먹는 만큼 음식이 짜지 않으면 싱겁다고 느낌.(역치 이하의 자극 무시)
위의 사항을 수학식으로 정리한게 퍼셉트론. 이걸 파이썬 코드로 구현할 것.
2 AND게이트
퍼셉트론을 컴퓨터로 구현하기 위해서 and 게이트 진리 연산표를 먼저 numpy로 생성합니다.
import numpy as np
x = np.array([0,0,1,0,0,1,1,1]).reshape(4,2)
y = np.array([0,0,0,1]).reshape(4,1)
print(x.shape) #(4, 2)
print(y.shape) #(4, 1)
문제13. 위와 같이 생성하지 말고 이번에는 아래의 a리스트와 b리스트를 가지고 numpy의 reshape를 이용해 생성하시오.
import numpy as np
a = [0,0,1,0,0,1,1,1]
b = [0,0,0,1]
x = np.array(a).reshape(4,2)
y = np.array(b).reshape(4,1)
문제14. and게이트 퍼셉트론 함수를 생성하시오.
def AND(x1,x2):
w1,w2,theta = 0.5, 0.5, 0.7 #가중치와 임계치 임의 설정
tmp = x1*w1 + x2*w2 # 입력값과 가중치 곱의 합을 tmp변수에 입력
if tmp <= theta:
return 0
elif tmp > theta:
return 1
print(AND(0,0)) #0
print(AND(1,0)) #0
print(AND(0,1)) #0
print(AND(1,1)) #1
3 OR 게이트
문제15. OR게이트 진리 연산표를 보고 데이터셋x와 y를 구현하시오.
import numpy as np
x = np.array([0,0,1,0,0,1,1,1]).reshape(4,2)
y = np.array([0,1,1,1]).reshape(4,1)
문제16. OR게이트 퍼셉트론 함수를 생성하고 다음과 같이 실행되게 하시오.
def OR(x1,x2):
w1,w2,theta = 0.5, 0.5, 0.3 #가중치와 임계치 임의 설정
tmp = x1*w1 + x2*w2 # 입력값과 가중치 곱의 합을 tmp변수에 입력
if tmp <= theta:
return 0
elif tmp > theta:
return 1
print(OR(0,0)) #0
print(OR(1,0)) #1
print(OR(0,1)) #1
print(OR(1,1)) #1
책에 나온대로 만든 퍼셉트로론 함수는 가중치와 임계치를 그냥 사용자가 결과가 나올 수 있도록 직접 정해준 것이고 그게 아니라 실제 신경망에서는 데이터(입력값)을 학습해서 직접 정답(y)을 맞출 수 있도록 가중치를 알아내는 것
4 텐써 플로우를 이용해서 AND 게이트 퍼셉트론 구현하기
import tensorflow as tf # 텐서 플로우 모듈 임포트
import numpy as np
from tensorflow.keras.models import Sequential # 신경망 모델 구성
from tensorflow.keras.layers import Dense # 완전 연결계층
from tensorflow.keras.optimizers import SGD # 경사감소법
from tensorflow.keras.losses import mse # 오차함수
# (신경망이 제대로 학습할 수 있도록 신경망의 오차를 깨닫게 해줌)
tf.random.set_seed(777) # 시드 설정
# AND게이트 데이터 준비
x = np.array( [ [0, 0], [1, 0], [0, 1], [1, 1] ] )
y = np.array( [ [0], [0], [0], [1] ] )
#모델 구성하기
model = Sequential()
#단층 퍼셉트론 구현하기
#입력값2 , 뉴런1, 활성화함수 선형(linear)
model.add( Dense( 1, input_shape =( 2, ), activation ='linear') )
# 모델 준비하기
model.compile( optimizer= SGD(), # 경사하강법(오차 줄이는 규칙)으로 확률적 경사하강법 사용
loss= mse, # 오차함수는 mean square error 함수 사용
metrics = ['acc'] ) # list 형태로 평가지표를 전달
# 학습 시키기
model.fit(x, y, epochs = 500) # x입력값, y정답값 , epochs 500번 반복해서 학습
#학습을 마친 후 입력데이터를 모델에 넣어서 어떤 값으로 예측하는지 확인해보겠습니다.
result = model.predict(x)
print(result)
# [[-0.12992516]
# [ 0.32823712]
# [ 0.20944935]
# [ 0.6676116 ]]
문제17. 위에서 출력된 결과를 반올림해서 출력하시오.
result = model.predict(x)
print(np.round(result))
# [[-0.]
# [ 0.]
# [ 0.]
# [ 1.]]
문제18. 위의 AND게이트 퍼셉트론으로 구현한 신경망에서 만들어낸 최종 가중치를 출력하시오.
print(model.get_weights())
#[array([[0.45816228], # 가중치
# [0.3393745 ]],
# array([-0.12992516], # bias
문제19. AND 게이트 퍼셉트론 신경망의 오차와 정확도를 출력하시오.
print(model.evaluate(x,y))
#[0.06974281370639801, 1.0]
# 오차 정확도
5 텐써 플로우를 이용해서 OR 게이트 퍼셉트론 구현하기
문제20. OR게이트 퍼셉트론을 텐서플로우 신경망으로 구현하고 예측값 4개를 출력하시오.
import tensorflow as tf # 텐서 플로우 모듈 임포트
import numpy as np
from tensorflow.keras.models import Sequential # 신경망 모델 구성
from tensorflow.keras.layers import Dense # 완전 연결계층
from tensorflow.keras.optimizers import SGD # 경사감소법
from tensorflow.keras.losses import mse # 오차함수
# (신경망이 제대로 학습할 수 있도록 신경망의 오차를 깨닫게 해줌)
tf.random.set_seed(777) # 시드 설정
# OR게이트 데이터 준비
x = np.array( [ [0, 0], [1, 0], [0, 1], [1, 1] ] )
y = np.array( [ [0], [1], [1], [1] ] )
#모델 구성하기
model = Sequential()
#단층 퍼셉트론 구현하기
#입력값2 , 뉴런1, 활성화함수 선형(linear)
model.add( Dense( 1, input_shape =( 2, ), activation ='linear') )
# 모델 준비하기
model.compile( optimizer= SGD(), # 경사하강법(오차 줄이는 규칙)으로 확률적 경사하강법 사용
loss= mse, # 오차함수는 mean square error 함수 사용
metrics = ['acc'] ) # list 형태로 평가지표를 전달
# 학습 시키기
model.fit(x, y, epochs = 500) # x입력값, y정답값 , epochs 500번 반복해서 학습
#학습을 마친 후 입력데이터를 모델에 넣어서 어떤 값으로 예측하는지 확인해보겠습니다.
result = model.predict(x)
print(np.round(result))
# [[0.]
# [1.]
# [1.]
# [1.]]
print(model.get_weights())
#[array([[0.49431452], # 가중치
# [0.37552658]],
# array([0.3271933], #bias
print(model.evaluate(x,y))
#[0.06652823090553284, 1.0]
# 오차 정확도
ㅇ단순한 논리회로 4가지
1. AND 게이트
2. OR 게이트
3. NAND 게이트
4. XOR 게이트
6 텐써 플로우를 이용해서 NOT AND 게이트 퍼셉트론 구현하기
문제21. NOT AND 게이트 단층신경망을 텐서플로우로 구현해서 예상값을 출력하시오.
import tensorflow as tf # 텐서 플로우 모듈 임포트
import numpy as np
from tensorflow.keras.models import Sequential # 신경망 모델 구성
from tensorflow.keras.layers import Dense # 완전 연결계층
from tensorflow.keras.optimizers import SGD # 경사감소법
from tensorflow.keras.losses import mse # 오차함수
# (신경망이 제대로 학습할 수 있도록 신경망의 오차를 깨닫게 해줌)
tf.random.set_seed(777) # 시드 설정
# NAND게이트 데이터 준비
x = np.array( [ [0, 0], [1, 0], [0, 1], [1, 1] ] )
y = np.array( [ [1], [1], [1], [0] ] )
#모델 구성하기
model = Sequential()
#단층 퍼셉트론 구현하기
#입력값2 , 뉴런1, 활성화함수 선형(linear)
model.add( Dense( 1, input_shape =( 2, ), activation ='linear') )
# 모델 준비하기
model.compile( optimizer= SGD(), # 경사하강법(오차 줄이는 규칙)으로 확률적 경사하강법 사용
loss= mse, # 오차함수는 mean square error 함수 사용
metrics = ['acc'] ) # list 형태로 평가지표를 전달
# 학습 시키기
model.fit(x, y, epochs = 500) # x입력값, y정답값 , epochs 500번 반복해서 학습
#학습을 마친 후 입력데이터를 모델에 넣어서 어떤 값으로 예측하는지 확인해보겠습니다.
result = model.predict(x)
print(np.round(result))
# [[1.]
# [1.]
# [1.]
# [0.]]
7 XOR 게이트 퍼셉트론 구현하기 -p.54
eXclusive OR 게이트
= 배타적(자기 외에는 다 거부)
AND, OR, NAND는 단층 신경망으로 구현되는데 XOR게이트는 단층으로는 구현이 안됨.
XOR 게이트는 직선으로 분류할 수 없고 곡선(비선형)분류 가능. 따라서 다층 신경망으로만 구현할 수 있음.
예제1. 위의 결과대로 함수 3개(AND, NAND, OR)를 이요해서 XOR게이트 함수를 생성하시오.
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1*w1 + x2*w2
if tmp <= theta:
return 0
elif tmp >theta:
return 1
def NAND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1*w1 + x2*w2
if tmp <= theta:
return 1
elif tmp >theta:
return 0
def OR(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.3
tmp = x1*w1 + x2*w2
if tmp <= theta:
return 0
elif tmp >theta:
return 1
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y
print(XOR(0,0)) # 0
print(XOR(1,0)) # 1
print(XOR(0,1)) # 1
print(XOR(1,1)) # 0
8 가중치와 편향 구현하기
1. 신경망에서의 파라미터 : 가중치, 편향
2. 신경망에서의 하이퍼 파라미터 : 러닝 레이트, 층수와 뉴런의 갯수
가중치 : 입력신호가 결과에 주는 영향력(중요도)를 조절하는 매개변수
편향 : 뉴런이 얼마나 쉽게 활성화(결과를 1로 출력) 하느냐를 조정하는 매개변수
위의 그림 OR게이트처럼 입력신호 x1과 x2 값을 받는 경우에 편향(b)이 없다면 target을 분류하는 직선은 무조건 원점을 통과해야하기 때문에 제대로 분류를 할 수 없게 됩니다.
예제1. 편향을 도입해서 퍼셉트론에 and게이트 함수를 생성하시오. - p.53
def AND(x): #[x1,x2] 형식의 변수 x
x = np.array(x)
w = np.array([0.5, 0.5])
b = - 0.7
tmp = np.sum(x*w) + b #np.snum(x*w) = (x1*w1) + (x2*w2)
if tmp <= 0:
return 0
else:
return 1
inp = np.array( [ [0, 0], [1, 0], [0, 1], [1, 1] ] )
for i in inp:
print(AND(i))
#0
#0
#0
#1
앞에서 만들었던 AND게이트 함수에 numpy를 적용하고 theta 대신에 bias를 도입한 구문
예제2. 편향을 도입한 퍼셉트론에 OR 게이트 함수를 생성하시오. - p.54
def OR(x): #[x1,x2] 형식의 변수 x
x = np.array(x)
w = np.array([0.5, 0.5])
b = - 0.2
tmp = np.sum(x*w) + b #np.snum(x*w) = (x1*w1) + (x2*w2)
if tmp <= 0:
return 0
else:
return 1
inp = np.array( [ [0, 0], [1, 0], [0, 1], [1, 1] ] )
for i in inp:
print(OR(i))
# 0
# 1
# 1
# 1
예제3. 편향을 도입한 퍼셉트론에 NOT AND 게이트 함수를 생성하시오. -p.53
def NAND(x): #[x1,x2] 형식의 변수 x
x = np.array(x)
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(x*w) + b #np.snum(x*w) = (x1*w1) + (x2*w2)
if tmp <= 0:
return 0
else:
return 1
inp = np.array( [ [0, 0], [1, 0], [0, 1], [1, 1] ] )
for i in inp:
print(NAND(i))
# 1
# 1
# 1
# 0
예제4. 위의 함수 3개를 이용해서 XOR게이트 함수를 생성하고 아래와 같이 실행되게 하시오.
def XOR(x): #[x1,x2] 형식의 변수 x
s1 = NAND(x) # 위에서 만든 NAND 함수
s2 = OR(x) # 위에서 만든 OR 함수
inp2 = np.array([s1,s2])
y = AND(inp2) # 위에서 만든 AND함수
return y
inp = np.array( [ [0, 0], [1, 0], [0, 1], [1, 1] ] )
for i in inp:
print(XOR(i))
# 0
# 1
# 1
# 0
9 텐써 플로우를 이용해서 XOR 게이트 퍼셉트론 구현하기
AND, NAND, OR는 단층신경망으로 구현 가능. 그런데 XOR는 단층 신경망으로 구현할 수 없고 다층 신경망으로 구현해야함.
그래서 텐서 플로구로 층을 구성할 때 다층으로 구성해야함.
예제1. XOR게이트용 데이터셋을 준비합니다.
# XOR게이트 데이터 준비
x = np.array( [ [0, 0], [1, 0], [0, 1], [1, 1] ] )
y = np.array( [ [0], [1], [1], [0] ] )
예제2. 앞에서 텐서플로우로 구현한 AND게이트 단층 퍼셉트론 신경망에 XOR 게이트용 데이터셋을 넣고 학습시켜봅니다.
import tensorflow as tf # 텐서 플로우 모듈 임포트
import numpy as np
from tensorflow.keras.models import Sequential # 신경망 모델 구성
from tensorflow.keras.layers import Dense # 완전 연결계층
from tensorflow.keras.optimizers import SGD # 경사감소법
from tensorflow.keras.losses import mse # 오차함수
# (신경망이 제대로 학습할 수 있도록 신경망의 오차를 깨닫게 해줌)
tf.random.set_seed(777) # 시드 설정
# XOR게이트 데이터 준비
x = np.array( [ [0, 0], [1, 0], [0, 1], [1, 1] ] )
y = np.array( [ [0], [1], [1], [0] ] )
#모델 구성하기
model = Sequential()
#단층 퍼셉트론 구현하기
#입력값2 , 뉴런1, 활성화함수 선형(linear)
model.add( Dense( 1, input_shape =( 2, ), activation ='linear') )
# 모델 준비하기
model.compile( optimizer= SGD(), # 경사하강법(오차 줄이는 규칙)으로 확률적 경사하강법 사용
loss= mse, # 오차함수는 mean square error 함수 사용
metrics = ['acc'] ) # list 형태로 평가지표를 전달
# 학습 시키기
model.fit(x, y, epochs = 500) # x입력값, y정답값 , epochs 500번 반복해서 학습
=> 학습이 전혀 되고 있지 않음을 확인할 수 있음.
예제3. 다층(2층) 신경망으로 구성해서 다시 학습 시키시오.
import tensorflow as tf
tf.random.set_seed(777) # 시드를 설정한다.
import numpy as np
from tensorflow.keras.models import Sequential # 신경망 모델 구성
from tensorflow.keras.layers import Dense # 완전 연결계층
from tensorflow.keras.optimizers import SGD # 경사감소법
from tensorflow.keras.losses import mse # 오차함수
# 데이터 준비 (XOR 진리 연산표)
x = np.array( [ [0, 0], [1, 0], [0, 1], [1, 1] ] )
y = np.array( [ [0], [1], [1], [0] ] )
#모델 구성하기
model = Sequential()
#다층 퍼셉트론 구현하기 (1층에는 relu, 2층에는 sigmoid)
model.add(Dense(2, input_shape =(2, ), activation ='sigmoid')) #1층(은닉층)
model.add(Dense(1, activation ='sigmoid')) #2층(출력층)
# 모델 준비하기
model.compile( optimizer= SGD(learning_rate=0.1), #경사하강법
loss= mse, #오차함수는 mean square error 사용
metrics = ['acc'] ) # list 형태로 평가지표를 전달한다.
# 학습 시키기
model.fit(x, y, epochs = 2000, batch_size=1) #500번 학습
# 학습 종료 후 입력 데이터 모델에 넣어서 예측값 확인
result = model.predict(x)
print(result.round())
=> 은닉1층 활성화함수 sigmoid설정, learning_rate(), batch_size, epochs 옵션 설정을 변경하면서 정확도 1로 맞춤.
2장 내용정리
1. 퍼셉트론이란 무엇인지? 인간의 뇌의 뉴런 세포를 컴퓨터로 흉내낸 것
2. 퍼셉트론의 종류 2가지 : 1. 단층퍼셉트론 2. 다층 퍼셉트론
문제22. XOR게이트 데이터를 이용해서 신경망을 구현하는데 3층으로 구현해보시오. (뉴런의 갯수 마음대로)
import tensorflow as tf # 텐서 플로우 모듈 임포트
import numpy as np
from tensorflow.keras.models import Sequential # 신경망 모델 구성
from tensorflow.keras.layers import Dense # 완전 연결계층
from tensorflow.keras.optimizers import SGD # 경사감소법
from tensorflow.keras.losses import mse # 오차함수
# (신경망이 제대로 학습할 수 있도록 신경망의 오차를 깨닫게 해줌)
tf.random.set_seed(777) # 시드 설정
# XOR게이트 데이터 준비
x = np.array( [ [0, 0], [1, 0], [0, 1], [1, 1] ] )
y = np.array( [ [0], [1], [1], [0] ] )
#모델 구성하기
model = Sequential()
# for문 돌리기 위한 데이터셋
prms1 = [4,5,6,8,10]
prms2 = [2,3,4]
func = ['relu','sigmoid']
params = list(product(prms1,prms2,func))
#다층 퍼셉트론 구현하기
for i in params:
model.add( Dense(i[0], input_shape =( 2, ), activation = i[2]) ) # 1층
model.add( Dense(i[1], activation =i[2]) ) # 2층
model.add( Dense(1, activation =i[2]) ) # 3층
# 모델 준비하기
model.compile( optimizer= SGD(), # 경사하강법(오차 줄이는 규칙)으로 확률적 경사하강법 사용
loss= mse, # 오차함수는 mean square error 함수 사용
metrics = ['acc']) # list 형태로 평가지표를 전달
# 학습 시키기
model.fit(x, y, epochs = 500, verbose = 0) # x입력값, y정답값 , epochs 500번, verbose = 0 진행과정 안보이게
# 정확도
if model.evaluate(x,y, verbose = 0 )[1] == 1.0:
print("[활성화 함수] : %s"%i[2])
print("[뉴런의 개수] : 1층 %s개, 2층 %s개, 3층 1개 "%(i[0],i[1]))
print("[오차, 정확도] : %s"%model.evaluate(x,y, verbose = 0 ))
'Study > class note' 카테고리의 다른 글
딥러닝 / 다차원 배열, 3층신경망 구현, 소프트맥스 함수 (0) | 2022.04.01 |
---|---|
딥러닝 / 활성화함수(계단함수, 시그모이드, 하이퍼블릭 탄젠트, 렐루함수) (0) | 2022.04.01 |
딥러닝 / 넘파이 원소 접근, Matplotlib 로 그래프 그리기 (0) | 2022.03.31 |
딥러닝 / 텐서플로우 설치 (0) | 2022.03.31 |
딥러닝 / 넘파이 (0) | 2022.03.30 |