콘텐츠로 건너뛰기

[deep learning] XOR 회로 설계

선형 가림막으로 XOR 논리식을 학습시킬 수 없었다. 그래서 SVM(Support Vector Machine)을 이용해서 이걸 학습시킬 수 있었는데 이게 조금 어렵다. 이걸 NNM(Neural Network Modeling)을 이용해서 학습시키는 방법을 배운다.

XOR 회로 설계

Tensorflow model

import tensorflow as tf # tensorflow의 별명은 tf로 한다
print(tf.version) # version 앞뒤로 두 개의 밑줄을 사용한다

tensorflow와 tf.keras를 임포트

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt

모델설계

  • 입력 4개((0,0), (0,1), (1,0), (1,1)
  • 출력 2개(0 또는 1)
  • 히든 레이어(퍼셉트론) 1개이다. 레이어는 2×2 Matrix
input_layer=tf.keras.layers.Input(shape=(2,)) # 입력층
hidden_layer=tf.keras.layers.Dense(units=2, activation='sigmoid') # 은닉층
output_layer=tf.keras.layers.Dense(units=1, activation='sigmoid') # 출력층

시퀀셜 선형 스택 모델 구축

model=tf.keras.models.Sequential()
model.add(input_layer)
model.add(hidden_layer)
model.add(output_layer)
model.summary()

Model Compile

  • SGD(0.9) 안에 있는건 Learnig Rate. 1보다 작아야 한다. 0.1로 하면 오차가 매우 느리게 줄어든다.
model.compile(optimizer=tf.keras.optimizers.SGD(0.9), loss='mse', metrics=['accuracy'])

Dataset 준비

import numpy as np
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([0, 1, 1, 0])
import numpy as np
X = np.array([[0.0,0.0], [0.0,1.0], [1.0,0.0], [1.0,1.0]])
y = np.array([0.0, 1.0, 1.0, 0.0])

공부하자

model.fit(X,y,epochs=500)
Epoch 1/500
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 438ms/step - accuracy: 0.5000 - loss: 0.3375
Epoch 2/500
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step - accuracy: 0.5000 - loss: 0.3219
Epoch 3/500
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step - accuracy: 0.5000 - loss: 0.3070
Epoch 4/500
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step - accuracy: 0.5000 - loss: 0.2936
Epoch 5/500
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step - accuracy: 0.5000 - loss: 0.2824
Epoch 6/500
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step - accuracy: 0.5000 - loss: 0.2734
Epoch 7/500
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step - accuracy: 0.5000 - loss: 0.2667
...
...
...
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - accuracy: 0.7500 - loss: 0.2377
Epoch 499/500
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step - accuracy: 0.7500 - loss: 0.2375
Epoch 500/500
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step - accuracy: 0.7500 - loss: 0.2374

예측

print(model.predict(X))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
[[0.43946722]
 [0.51216733]
 [0.51630193]
 [0.532924  ]]

종합정리

뭐했는지 모른다. 한 epochs=1000 정도 해야 어느 정도 만족할 만한 결과가 나온다. epochs=3000 이상이 요구된다.

1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
[[0.11300682]
 [0.8315775 ]
 [0.8304282 ]
 [0.19513983]]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다