본문 바로가기
DataScience/머신러닝

머신러닝 :: 딥러닝 XOR 예측 실습(이진 논리회귀, MLP, keras functional API)

by 올커 2022. 10. 13.

머신러닝 XOR 예측 실습(이진 논리회귀, MLP, keras functional API)


1. XOR 예측

 · 아래의 그림을 참고로 XOR 경우의 예측모델을 만들어본다.

1) 환경 지정

 · 아래와 같이 필요한 모듈들을 클래스로부터 불러오기한다.

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam, SGD

 

x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)
y_data = np.array([[0], [1], [1], [0]], dtype=np.float32)

2) XOR 이진논리회귀로 풀어보기 

 · 이진논리회귀는 앞서 XOR문제를 풀이할 수 없다고 하였다. 정말 그런지 확인해본다.

   아래와 같이 레이어를 설정하고, 모델을 만들어주었다.

del = Sequential([
  Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.1))

model.fit(x_data, y_data, epochs=1000, verbose=0)   # verbose=0 : epochs 1000개는 너무 많기 때문에 출력하지 않기위해 사용

 · 예측결과를 출력해보면 아래와 같다.

# 예측
y_pred = model.predict(x_data)

print(y_pred)

# 정답은 0 1 1 0이 되어야 하는데, 이진 논리 회귀의 경우 잘못된 예측값을 확인할 수 있다.

"""
[[0.50033224]			# 0
 [0.50024545]			# 1
 [0.4998588 ]			# 1
 [0.49977204]]			# 0
 """

 

3) XOR 딥러닝(MLP)

 · 이제 딥러닝으로 모델을 생성한다. 

   아래에서는 input layer는 히든레이어로 노드 갯수 8개, 활성화 함수는 ReLU로 지정한다.

   그리고 출력 레이어 output layer는 노드 갯수 1개, 활성화 함수는 sigmoid로 지정한다.

# 딥러닝 학습
model = Sequential([
  Dense(8, activation='relu'),      # input layer에 히든 레이어를 지정(노드 갯수 8개, 활성화 함수는 ReLU)
  Dense(1, activation='sigmoid'),     # 출력 레이어는 1개, 활성화 함수는 sigmoid(결과값이 0, 1 binary로 나오기 때문)
])

model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.1))

model.fit(x_data, y_data, epochs=1000, verbose=0)

 · 예측결과를 출력해보면 다음과 같이 결과값과 유사한 것을 확인할 수 있다.

y_pred = model.predict(x_data)

print(y_pred)

"""
[[0.03348094]			# 0
 [0.887605  ]			# 1
 [0.98377913]			# 1
 [0.0241524 ]]			# 0
 """

4) Keras Functional API

 · Sequential API는 순차적인 모델 설계에는 편리한 API 이지만, 복잡한 네트워크를 설계하기에는 한계가 있기 때문에 실무에서는 Functional API를 주로 사용한다. Functional API를 사용해보면 아래와 같다.

import numpy as np
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.optimizers import Adam, SGD

 · Functional API에서는 model.summary()를 사용하면 아래와 같이 모델의 구조를 확인하기 쉽다.

input = Input(shape=(2,))     # x1, x2라는 2개의 input이 필요해서 input node가 2개
hidden = Dense(8, activation='relu')(input)     # 히든 레이어(인풋 레이어를 넣어줌)
output = Dense(1, activation='sigmoid')(hidden)     # 아웃풋(히든 레이어를 넣어줌)

model = Model(inputs=input, outputs=output)       # inputs, outputs처럼 복수형으로 써줘야 한다.

model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.1))

model.summary()     # 모델의 구조 확인

# Output Shape에는 (Batch size , Node의 수)

 · 예측결과를 확인해보면 아래와 같이 높은 정확도로 예측할 수 있음을 확인할 수 있다.

model.fit(x_data, y_data, epochs=1000, verbose=0)

y_pred = model.predict(x_data)

print(y_pred)

"""
[[0.02292162]			# 0
 [0.989807  ]			# 1
 [0.98963356]			# 1
 [0.00882056]]			# 0
 """

 

반응형

댓글