1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
 
import numpy as np
 
 
# 인공 신경망 (Neural Network)
# 인간의 뉴런 구조를 본떠 만든 기계학습 모델
# 시냅스의 결합으로 네트워크를 형성한 인공 뉴런(노드)이 학습을 통해 시냅스의 결합 세기를 변화시켜, 문제 해결 능력을 가지는 모델
# 뉴런(노드)dms 이전 뉴런으로부터 입력을 받아 또 다른 신호를 발생시킴
# 하지만, 입력에 비례해서 출력을 하는 것이 아니라, 임계점을 넘어서야만 출력 신호를 발생시킴 => 활성화 함수
# 대표적인 활성화 함수 => sigmoid, ReLU, Leaky ReLU, hyperbolic tangent etc
 
# 딥러닝
# 입력층-은닉층-출력층
# 출력층에서의 오차를 기반으로, 오차역전법을 통해, 각 층 노드의 가중치를 학습하는 머신러닝의 한 분야
# 은닉층의 노드의 갯수가 많아지면 당연히 학습속도가 느려지겠죠?
 
# feed forward : 입력된 데이터가 [입력층-은닉층-출력층]을 흐르는 과정
 
 
 
## XOR 문제 => 딥러닝 네트워크로 해결 ##
 
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
 
 
def numerical_derivative(func, x):
    delta = 1e-4
    grad = np.zeros_like(x)
 
    it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
 
    while not it.finished:
        idx = it.multi_index
 
        temp = x[idx]
        x[idx] = float(temp) + delta
        f1 = func(x)
 
        x[idx] = float(temp) - delta
        f2 = func(x)
 
        grad[idx] = (f1 - f2) / (2 * delta)
 
        x[idx] = temp
        it.iternext()
 
    return grad
 
 
class LogicGate:
 
    def __init__(self, x_data, t_data):
        self.__x_data = x_data.reshape(42)
        self.__t_data = t_data.reshape(41)
 
        self.__W1 = np.random.rand(28)
        self.__b1 = np.random.rand(8)
 
        self.__W2 = np.random.rand(81)
        self.__b2 = np.random.rand(1)
 
        self.__learning_rate = 1e-2
 
    def feed_forward(self):
        delta = 1e-6  # log가 무한대로 발산하는 것을 막아준다
 
        z1 = np.dot(self.__x_data, self.__W1) + self.__b1
        a1 = sigmoid(z1)
 
        z2 = np.dot(a1, self.__W2) + self.__b2
        y = sigmoid(z2)
 
        return -np.sum(self.__t_data * np.log(y + delta) + (1 - self.__t_data) * np.log((1 - y) + delta))
 
    def loss_eval(self):
        delta = 1e-6  # log가 무한대로 발산하는 것을 막아준다
 
        z1 = np.dot(self.__x_data, self.__W1) + self.__b1
        a1 = sigmoid(z1)
 
        z2 = np.dot(a1, self.__W2) + self.__b2
        y = sigmoid(z2)
 
        return -np.sum(self.__t_data * np.log(y + delta) + (1 - self.__t_data) * np.log((1 - y) + delta))
 
    def train(self):
 
        f = lambda x: self.feed_forward()
 
        for step in range(10001):
            self.__W1 -= self.__learning_rate * numerical_derivative(f, self.__W1)
            self.__b1 -= self.__learning_rate * numerical_derivative(f, self.__b1)
            self.__W2 -= self.__learning_rate * numerical_derivative(f, self.__W2)
            self.__b2 -= self.__learning_rate * numerical_derivative(f, self.__b2)
 
            if (step % 500== 0:
                print("step = ", step, ", error = "self.loss_eval())
 
    def predict(self, input_data):
 
        z1 = np.dot(input_data, self.__W1) + self.__b1
        a1 = sigmoid(z1)
 
        z2 = np.dot(a1, self.__W2) + self.__b2
        y = sigmoid(z2)
 
        if y >= 0.5:
            result = 1
        else:
            result = 0
 
        return result
 
 
# 테스트 데이터
data_x = np.array([[00], [01], [10], [11]])
data_t = np.array([0110])
test_data = np.array([[00], [01], [10], [11]])
 
XOR_object = LogicGate(data_x, data_t)
XOR_object.train()
 
for input_data in test_data:
    pred = XOR_object.predict(input_data)
    print(input_data, " = ", pred)
 
cs

 

위 소스코드를 실행시키면 아래와 같은 출력값을 얻을 수 있다.

반응형

'머신러닝_딥러닝 > Tensorflow + Keras' 카테고리의 다른 글

MNIST 2탄 (Back Propagation)  (0) 2021.10.23
MNIST 1탄  (0) 2021.10.23
XOR 문제  (0) 2021.10.23
로지스틱 회귀 (Logistic Regression)  (0) 2021.10.23
선형회귀 (Linear Regression)  (0) 2021.10.23

+ Recent posts