def forward(network, x): W1, W2, W3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] z1 = sigmoid(x.dot(W1) + b1) # 첫번째 은닉층 전파(propagation) z2 = sigmoid(z1.dot(W2) + b2) # 두번째 은닉층 전파(propagation) y = softmax(z2.dot(W3) + b3) # 출력층 전파(propagation) return y
def predict(network, X_test): ''' 가중치 행렬들(W1, W2, W3, b1, b2, b3)을 생성 ''' W1, W2, W3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] a1 = X_test.dot(W1) + b1 z1 = sigmoid(a1) z2 = sigmoid(z1.dot(W2) + b2) y = z2.dot(W3) + b3 y = softmax(y) y_pred = np.argmax(y, axis=1) return y_pred
def predict(network, X_test): ''' 가중치 행렬들(W1, W2, W3, b1, b2, b3)을 생성 ''' W1, W2, W3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] a1 = X_test.dot(W1) + b1 z1 = sigmoid(a1) z2 = sigmoid(z1.dot(W2) + b2) y = z2.dot(W3) + b3 y = softmax(y) # print('y after softmax:', y) y = step_function2(y) # print('y after step:', y[0]) return y
def forward(network, x): ''' 순방향 전파(forward propagation). 입력 -> 은닉층 -> 출력. :param network: 신경망에서 사용되는 가중치/bias 행렬들을 저장한 dict :param x: 입력 값을 가지고 있는 (1차원) 리스트. [x1, x2] :return: 2개의 은닉층과 출력층을 거친 후 계산된 출력 값. [y1, y2] ''' # 가중치 행렬: W1, W2, W3 = network['W1'], network['W2'], network['W3'] # bias 행렬: b1, b2, b3 = network['b1'], network['b2'], network['b3'] # 은닉층에서 활성화 함수: sigmoid 함수 a1 = x.dot(W1) + b1 z1 = sigmoid(a1) # 첫번째 은닉층 전파 z2 = sigmoid(z1.dot(W2) + b2) # 두번째 은닉층 전파 # 출력층 : z2 2 W3 + b3 값을 그대로 출력 y = z2.dot(W3) + b3 # return identity_function(y) return softmax(y) # 출력층의 활성화 함수로 softmax 함수를 적용
def forward(network, x): """ 순방향 전파(forward propagation). 파라미터 x: 이미지 한 개의 정보를 가지고 있는 배열. (784,) """ # 가중치 행렬(Weight Matrices) W1, W2, W3 = network['W1'], network['W2'], network['W3'] # bias matrices b1, b2, b3 = network['b1'], network['b2'], network['b3'] # 첫번째 은닉층 a1 = x.dot(W1) + b1 z1 = sigmoid(a1) # 두번째 은닉층 a2 = z1.dot(W2) + b2 z2 = sigmoid(a2) # 출력층 a3 = z2.dot(W3) + b3 y = softmax(a3) return y
from ch03.e01_Perceptron import sigmoid class Sigmoid: def __init__(self): self.y = None def forward(self, x): self.y = 1 / (1 + np.exp(-x)) return self.y def backward(self, dout): return dout * (self.y * (1 - self.y)) if __name__ == '__main__': # Sigmoid 뉴런을 생성 sigmoid_gate = Sigmoid() # x = 1 일때 sigmoid 함수의 리턴값(forward) y = sigmoid_gate.forward(x=0.) print('y =', y) # x = 0 일때 sigmoid(0) = .5 # x = 0 에서의 sigmoid 의 gradient(전선의 기울기) dx = sigmoid_gate.backward(dout=1) print('dx =', dx) # 아주 작은 h 에 대해서 [f(x + h) - f(x)] / h 를 계산 h = 1e-7 dx2 = (sigmoid(0. + h) - sigmoid(0.)) / h print('dx2 =', dx2)