퍼셉트론의 과제
XOR 문제
ㄴ 직선을 하나 그어서 직선의 한쪽 편에는 검은 점, 다른 한쪽에는 흰 점만 있도록 해보자.
= > 이것이 퍼셉트론의 한계를 설명할 때 등장하는 XOR(exclusive OR) 문제
--> 반으로 접으면 되지 않을까? = > 차원 변경
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
'네이버클라우드 > AI' 카테고리의 다른 글
AI 6일차 (2023-05-15) 인공지능 기초 _머신러닝 - 스케일링 (Scaling) (0) | 2023.05.15 |
---|---|
AI 6일차 (2023-05-15) 인공지능 기초 _머신러닝 - Linear 모델과 SVM 모델 : SVC, SVR (0) | 2023.05.15 |
AI 5일차 (2023-05-12) 인공지능 기초 - pandas (0) | 2023.05.14 |
AI 5일차 (2023-05-12) 인공지능 기초 - Imdb 와 Rueters (0) | 2023.05.12 |
AI 5일차 (2023-05-12) 인공지능 기초 - Tokenizer 와 Embedding (0) | 2023.05.12 |