
학습목표
- 퍼센트론의 개념을 이해할 수 있다.
- 퍼셉트론을 간단히 구현해보자.


unit : 퍼셉트론 한 단위
Activation function(활성화함수) : 역치
뉴런을 수학적 모델로 고안한 것
<= 0, > 0 을 역치라고 생각하면 됨.
기준값 이상일 경우 다음 뉴런에게 전달, 기준값 이하일 경우 비활성화한다.





비선형 데이터를 분리할 수 있다.
학습시간이 오래 걸린다.
가중치 파라미터가 많아 과적합되기 쉽다.
⭐ 가중치 초기 값에 민감하며 지역 최적점에 빠지기 쉽다.
import numpy as np
# 활성화 함수 : step function
def activation_function(x) :
if x <= 0:
return 0 # 비활성화
else:
return 1 # 활성화
# AND 구분하는 가중치가 학습되었다고 가정
def AND(x1, x2) :
w1 = 1
w2 = 1
b = -1.5
y = w1*x1 + w2*x2 + b # 선형모델
return activation_function(y)

# OR 구분하는 가중치가 학습되었다고 가정
def OR(x1,x2):
w1 = 1
w2 = 1
b = 0
y = w1*x1 + w2*x2 + b # 선형모델
return activation_function(y)

# NAND 구분하는 가중치가 학습되었다고 가정
def NAND(x1, x2) :
w1 = -1
w2 = -1
b = 2
y = w1*x1 + w2*x2 + b # 선형모델
return activation_function(y)

def XOR_MLP(x1, x2):
a2 = NAND(x1, x2)
a1 = OR(x1, x2)
return AND(a1, a2)

# 문제
X = np.array([[0,0],
[1,0],
[0,1],
[1,1]])
# 정답
y = np.array([0,1,1,0])
from tensorflow.keras.models import Sequential # 뼈대 클래스
from tensorflow.keras.layers import InputLayer, Dense # 입력층, 퍼센트론의 묶음(중간층, 출력층)
# 1. 모델 설계
xor_model = Sequential() # 뼈대 생성
xor_model.add(InputLayer(shape=(2,))) # 입력층
xor_model.add(Dense(units=2, activation='sigmoid')) # 중간층 2개
xor_model.add(Dense(units=1, activation='sigmoid')) # 출력층
# 2. 학습방법 및 평가방법 설정
xor_model.compile(loss="binary_crossentropy", # 손실함수 : 모델 예측의 틀린 정도를 계산
optimizer="adam", # 최적화 함수 : 오차를 기반으로 가중치를 최적화한다.
metrics=['accuracy']) # 평가지표 : 정확도


xor_model.fit(X,y, epochs=2000) # 최적화 횟수
xor_model.predict(np.array([[0,0],[1,0]]))

0.5 이하는 0, 0.5 이상이 1로 생각한다.

중간층은 몇 층으로 몇 개가 되든 상관 없다. 입력층과 출력층은 개수 확실한 수치로 작성

[예1] 사진(입력) -> 어떤 동물 사진인지 확률(출력)
입력층 : 28 * 28 개
출력층 : 3개 - 강아지, 고양이, 오리 사진일 확률
[예2] 그림(입력) -> 사진(출력)
입력층 : 28 28 개
출력층 : 28 28 개
픽셀 하나의 색을 예측 -> 1개로 본다.