#신경망 모델 클래스
class my_NN01:

    # 비용 값 계산
    def cost(self):      
        delta = 1e-7    # log 무한대 발산 방지  
        A1 = np.dot(self.input_data, self.W1) + self.B1
        Z1 = sigmoid(A1)     
        A2 = np.dot(Z1, self.W2) + self.B2
        y = sigmoid(A2)
        cost_val=-np.sum( self.target_data*np.log(y + delta) + (1-self.target_data)*np.log((1 - y)+delta ) )
        return  cost_val

    # 수치미분을 이용하여 손실함수가 최소가 될때 까지 학습하는 함수
    def train(self, input_data, target_data):
        
        self.input_data = input_data
        self.target_data = target_data
        
        f = lambda x : self.feed_forward()
        
        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)

    # 미래 값 예측 함수
    def predict(self, input_data):          
        A1 = np.dot(self.input_data, self.W1) + self.B1
        Z1 = sigmoid(A1)   
        A2 = np.dot(Z1, self.W2) + self.B2
        y = sigmoid(A2)
        # MNIST 경우는 one-hot encoding 을 적용하기 때문에
        # 0 또는 1 이 아닌 argmax() 를 통해 최대 인덱스를 넘겨주어야 함
        predicted_num = np.argmax(y) 
        return predicted_num

 
