'''
입력층 2 히든층 4 출력층 2
'''
import numpy as np
import random
# def get_Weight(len):
# W_hidden = []
# for i in range(len):
# tmp = []
# for j in range(len):
# tmp.append(0)
# W_hidden.append(tmp)
# W_hidden = np.array(W_hidden)
# Out_hidden = tmp
# return W_hidden, Out_hidden
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def softmax(x):
# 소프트맥스한 값들의 모두 합친 값은 1
# 가장 큰 클래스가 가장 높은 확률로 사용될 것
for i in range(len(x)):
e_x = np.exp(x[i])
x[i] = e_x / e_x.sum()
return x
def Err(t, s_out):
a = t - s_out
return np.mean(np.abs(a))
if __name__ == '__main__':
x_train = np.array([[1., 0., 0.],
[1., 0., 1.],
[1., 1., 0.],
[1., 1., 1.]])
y_train = np.array([[1., 0.],
[0., 1.],
[0., 1.],
[1., 0.]])
Bias = np.array([[1],
[1],
[1],
[1]])
iters = 10000
# len = int(input('히든 몇층?'))
# 가중치
# w_hidden, out_hidden = get_Weight(len)
random.seed(11)
w_hidden = np.array([[random.random(), random.random(), random.random(), random.random()],
[random.random(), random.random(), random.random(), random.random()],
[random.random(), random.random(), random.random(), random.random()]])
out_hidden = np.array([[random.random(), random.random()],
[random.random(), random.random()],
[random.random(), random.random()],
[random.random(), random.random()],
[random.random(), random.random()]])
learn_rate = 0.1
tmp = 0
for i in range(iters):
# Hidden Layer
w_out = np.dot(x_train, w_hidden)
s_hidd = sigmoid(w_out)
s_hidd = np.hstack((Bias, s_hidd))
# Out Layer
w_out = np.dot(s_hidd, out_hidden)
s_out = softmax(w_out)
print(s_out)
# Delta 값 구하기
delta_out_hidden = (y_train - s_out) * (s_out * (1 - s_out))
delta_w_hidden = delta_out_hidden.dot(out_hidden.T) * s_hidd * (1 - s_hidd)
# 가중치 변경하기 전에 이 값이 미세하게 변하면 중지
out_hidden = out_hidden + s_hidd.T.dot(delta_out_hidden) * learn_rate
if np.all(tmp != 0):
if np.all(abs(out_hidden - tmp) < 0.0002):
break
tmp = out_hidden
w_hidden = w_hidden + np.delete(x_train.T.dot(delta_w_hidden), 0, axis=1) * learn_rate
print(i)
print('Test')
x = [1., 0., 0.]
w_out = np.dot(x, w_hidden)
s_hidd = sigmoid(w_out)
s_hidd = np.hstack(([1.], s_hidd))
w_out = np.dot(s_hidd, out_hidden)
e_xout = np.exp(w_out - np.max(w_out))
s_out = e_xout / e_xout.sum()
if s_out[0] > s_out[1]:
print('0')
else:
print('1')