선형 가림막으로 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
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 438ms/step - accuracy: 0.5000 - loss: 0.3375
Epoch 2/500
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 37ms/step - accuracy: 0.5000 - loss: 0.3219
Epoch 3/500
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 42ms/step - accuracy: 0.5000 - loss: 0.3070
Epoch 4/500
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 36ms/step - accuracy: 0.5000 - loss: 0.2936
Epoch 5/500
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 35ms/step - accuracy: 0.5000 - loss: 0.2824
Epoch 6/500
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 34ms/step - accuracy: 0.5000 - loss: 0.2734
Epoch 7/500
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 34ms/step - accuracy: 0.5000 - loss: 0.2667
...
...
...
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 30ms/step - accuracy: 0.7500 - loss: 0.2377
Epoch 499/500
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 38ms/step - accuracy: 0.7500 - loss: 0.2375
Epoch 500/500
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 30ms/step - accuracy: 0.7500 - loss: 0.2374
예측
print(model.predict(X))
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 37ms/step
[[0.43946722]
[0.51216733]
[0.51630193]
[0.532924 ]]
종합정리
뭐했는지 모른다. 한 epochs=1000 정도 해야 어느 정도 만족할 만한 결과가 나온다. epochs=3000 이상이 요구된다.
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 35ms/step
[[0.11300682]
[0.8315775 ]
[0.8304282 ]
[0.19513983]]