본문 바로가기
네이버클라우드/AI

AI 6일차 (2023-05-15) 인공지능 기초 _머신러닝 - 퍼셉트론의 과제 : XOR 문제의 해결

by prometedor 2023. 5. 15.

퍼셉트론의 과제

XOR 문제

https://thebook.io/img/080324/112_2.jpg

ㄴ 직선을 하나 그어서 직선의 한쪽 편에는 검은 점, 다른 한쪽에는 흰 점만 있도록 해보자.
= > 이것이 퍼셉트론의 한계를 설명할 때 등장하는 XOR(exclusive OR) 문제

 

--> 반으로 접으면 되지 않을까? = > 차원 변경

 

https://thebook.io/img/080324/116_2.jpg

 

 

AND 게이트 OR 게이트 XOR 게이트
x 1 x 2 결과 값 x 1 x 2 결과 값 x 1 x 2 결과 값
0 0 0 0 0 0 0 0 0
0 1 0 0 1 1 0 1 1
1 0 0 1 0 1 1 0 1
1 1 1 1 1 1 1 1 0

 

 

And

ml01_and.py

import numpy as np
from sklearn.linear_model import Perceptron
from sklearn.svm import LinearSVC, LinearSVR    # C = cassifier(분류), R = Regresser(회귀)
from sklearn.metrics import accuracy_score

# 1. 데이터
x_data = [[0, 0], [0, 1], [1, 0], [1, 1]]
y_data = [0, 0, 0, 1]


# 2. 모델
model = Perceptron()

# 3. 훈련
model.fit(x_data, y_data)

# 4. 평가, 예측
result = model.score(x_data, y_data)
print('모델 score : ', result)

y_predict = model.predict(x_data)
print(x_data, "의 예측 결과 :", y_predict)

acc = accuracy_score(y_data, y_predict)
print('acc : ', acc)


# 모델 score :  1.0
# [[0, 0], [0, 1], [1, 0], [1, 1]] 의 예측 결과 : [0 0 0 1]
# acc :  1.0

 

OR

ml01_or.py

import numpy as np
from sklearn.linear_model import Perceptron
from sklearn.svm import LinearSVC, LinearSVR    # C = cassifier(분류), R = Regresser(회귀)
from sklearn.metrics import accuracy_score

# 1. 데이터
x_data = [[0, 0], [0, 1], [1, 0], [1, 1]]
y_data = [0, 1, 1, 1]


# 2. 모델
model = Perceptron()

# 3. 훈련
model.fit(x_data, y_data)

# 4. 평가, 예측
result = model.score(x_data, y_data)
y_predict = model.predict(x_data)
acc = accuracy_score(y_data, y_predict)

print("모델의 score : ", result)
print(x_data, '의 예측 결과 :', y_predict)
print('acc : ', acc)


# 모델의 score :  1.0
# [[0, 0], [0, 1], [1, 0], [1, 1]] 의 예측 결과 : [0 1 1 1]
# acc :  1.0

 

XOR (문제)

ml01_xor.py

import numpy as np
from sklearn.linear_model import Perceptron
from sklearn.svm import LinearSVC, LinearSVR    # C = cassifier(분류), R = Regresser(회귀)
from sklearn.metrics import accuracy_score

# 1. 데이터
x_data = [[0, 0], [0, 1], [1, 0], [1, 1]]
y_data = [0, 1, 1, 0]

# 2. 모델
model = Perceptron()

# 3. 훈련
model.fit(x_data, y_data)

# 4. 평가, 예측
result = model.score(x_data, y_data)
y_predict = model.predict(x_data)
acc = accuracy_score(y_data, y_predict)

print('모델의 score : ', result)
print(x_data, '의 예측 결과 :', y_predict)
print('acc : ', acc)

# 모델의 score :  0.5
# [[0, 0], [0, 1], [1, 0], [1, 1]] 의 예측 결과 : [0 0 0 0]
# acc :  0.5

 

ml01_xor_tf_p.py

import numpy as np
from sklearn.linear_model import Perceptron
from sklearn.svm import LinearSVC, LinearSVR    # C = cassifier(분류), R = Regresser(회귀)
from sklearn.metrics import accuracy_score
from keras.models import Sequential
from keras.layers import Dense

# 1. 데이터
x_data = [[0, 0], [0, 1], [1, 0], [1, 1]]
y_data = [0, 1, 1, 0]

# 2. 모델구성
model = Sequential()    # Sequential() --> compile, 훈련 다 해야됨
model.add(Dense(1, input_dim=2, 
                activation='sigmoid'))  # sklearn 의 perceptron()과 동일

# 3. 컴파일, 훈련
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics='acc')

model.fit(x_data, y_data, batch_size=1, epochs=100)

# 4. 평가, 예측
loss, acc = result = model.evaluate(x_data, y_data)

y_predict = model.predict(x_data)

print(x_data, '의 예측 결과 :', y_predict)
print('모델의 loss : ', loss)
print('acc : ', acc)


# [[0, 0], [0, 1], [1, 0], [1, 1]] 의 예측 결과 : [[0.5091916 ]
#  [0.6881192 ]
#  [0.23322645]
#  [0.3927872 ]]
# 모델의 loss :  0.7600290179252625
# acc :  0.5

 

 

XOR 문제의 해결

ㄴ 다층 퍼셉트론(Multi-Layer Perceptron, MLP) 사용

ml01_xor_tf_mlp.py

import numpy as np
from sklearn.linear_model import Perceptron
from sklearn.svm import LinearSVC, LinearSVR    # C = cassifier(분류), R = Regresser(회귀)
from sklearn.metrics import accuracy_score
from keras.models import Sequential
from keras.layers import Dense

# 1. 데이터
x_data = [[0, 0], [0, 1], [1, 0], [1, 1]]
y_data = [0, 1, 1, 0]

# [실습] MLP 모델 구성하여 acc = 1.0 만들기
# 2. 모델구성
model = Sequential()    # Sequential() --> compile, 훈련 다 해야됨
model.add(Dense(32, input_dim=2))
model.add(Dense(64, activation='relu'))		# 히든레이어 쌓아주기 
model.add(Dense(32, activation='relu'))		# 히든레이어 쌓아주기 
model.add(Dense(1, activation='sigmoid'))  # MLP(multi layer perceptron) 와 동일

# 3. 컴파일, 훈련
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics='acc')

model.fit(x_data, y_data, batch_size=1, epochs=100)

# 4. 평가, 예측
loss, acc = result = model.evaluate(x_data, y_data)

y_predict = model.predict(x_data)

print(x_data, '의 예측 결과 :', y_predict)
print('모델의 loss : ', loss)
print('acc : ', acc)

# [[0, 0], [0, 1], [1, 0], [1, 1]] 의 예측 결과 : [[0.00640666]
#  [0.99336225]
#  [0.9949134 ]
#  [0.00810985]]
# 모델의 loss :  0.006582422647625208
# acc :  1.0