파이썬/딥러닝 구현
3층 신경망 구현
오지고지리고알파고포켓몬고
2017. 5. 19. 16:38
에서 0->1층으로의 전달
import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x)) # numpy의 브로드캐스트 X = np.array([1.0, 0.5]) W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) B1 = np.array([0.1, 0.2, 0.3]) A1 = np.dot(X, W1) + B1 print(A1) Z1 = sigmoid(A1) print(Z1)
0 - 1층. A
활성화 함수로 sigmoid를 사용(http://tastydarr.tistory.com/137)
절차에 따른 구현
import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x)) # numpy의 브로드캐스트 def identiry_function(x): # 출력층의 활성화 함수는 풀고하 하는 문제의 성질에 맞게 정의 # 예를 들어 회귀에는 항등 함수, 2클래스 분류에는 시그모이드 함수, 다중 클래스 분류에는 소프트맥수 함수 등 return x # 0 - 1 Layer X = np.array([1.0, 0.5]) W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) B1 = np.array([0.1, 0.2, 0.3]) A1 = np.dot(X, W1) + B1 print(A1) Z1 = sigmoid(A1) print(Z1) # 1 - 2 Layer W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]) B2 = np.array([0.1, 0.2]) A2 = np.dot(Z1, W2) + B2 print(A2) Z2 = sigmoid(A2) print(Z2) # 2 - Out Layer W3 = np.array([[0.1, 0.3], [0.2, 0.4]]) B3 = np.array([0.1, 0.2]) A3 = np.dot(Z2, W3) + B3 print(A3) Y = identiry_function(A3) print(Y)
조금 더 프로그램화.
제대로 하려면 init_network에서 weight와 bias를 tensorflow에서 회귀모델 만들때처럼 랜덤으로 주고 그라디언트로 값 찾게 하는거랑 같은 원리겠지
import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x)) # numpy의 브로드캐스트 def identity_function(x): # 출력층의 활성화 함수는 풀고하 하는 문제의 성질에 맞게 정의 # 예를 들어 회귀에는 항등 함수, 2클래스 분류에는 시그모이드 함수, 다중 클래스 분류에는 소프트맥수 함수 등 return x def init_network(): W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) B1 = np.array([0.1, 0.2, 0.3]) W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]) B2 = np.array([0.1, 0.2]) W3 = np.array([[0.1, 0.3], [0.2, 0.4]]) B3 = np.array([0.1, 0.2]) network = [ [W1,B1],[W2,B2],[W3,B3] ] return network def forward(network, x, out): for idx in range(len(network)): if idx==0: a = np.dot(x, network[idx][0]) + network[idx][1] # x로 시작 out.append(sigmoid(a)) continue if idx==len(network)-1: a = np.dot(out[-1], network[idx][0]) + network[idx][1] out.append(identity_function(a)) # identity function으로 끝 return out[-1] # list를 통째로 내보내는게 더 유연할 듯 a = np.dot(out[-1], network[1][0]) + network[1][1] out.append(sigmoid(a)) network = init_network() out = [] x = np.array([1.0, 0.5]) y = forward(network,x,out) print(y)