2017-12-10 10 views
2

홍채 데이터 세트의 회귀를 수행하여 유형을 예측합니다. 나는 동일한 데이터와 동일한 신경망을 사용하여 성공적으로 분류를 수행했다. 분류를 위해 모든 레이어에서 tanh를 활성화 함수로 사용했습니다. 그러나 회귀 분석을 위해, 나는 숨겨진 레이어에서 tanh 함수를 사용하고 출력 레이어에서 ID 함수를 사용합니다.신경망의 선형 함수는 출력으로 큰 값을 생성합니다.

import numpy as np 

class BackPropagation: 
    weight =[] 
    output =[] 
    layers =0 
    eta = 0.1 

    def __init__(self, x): 
     self.layers = len(x) 
     for i in range(self.layers-2): 
     w = np.random.randn(x[i]+1,x[i+1]+1) 
     self.weight.append(w) 
     w = w = np.random.randn(x[-2]+1,x[-1]) 
     self.weight.append(w) 

    def tanh(self,x): 
     return np.tanh(x) 

    def deriv_tanh(self,x): 
     return 1.0-(x**2) 

    def linear(self,x): 
     return x 

    def deriv_linear(self,x): 
     return 1 


    def training(self,in_data,target,epoch=100): 
     bias = np.atleast_2d(np.ones(in_data.shape[0])*(-1)).T 
     in_data = np.hstack((in_data,bias)) 
     print("Training Starts ......") 

     while epoch!=0: 
      epoch-=1 
      self.output=[] 
      self.output.append(in_data) 
      # FORWARD PHASE 
      for j in range(self.layers-2): 
       y_in = np.dot(self.output[j],self.weight[j]) 
       y_out = self.tanh(y_in) 
       self.output.append(y_out) 

      y_in = np.dot(self.output[-1],self.weight[-1]) 
      y_out = self.linear(y_in) 
      self.output.append(y_out) 
      print("Weight Is") 
      for i in self.weight: 
       print(i)  

      # BACKWARD PHASE 
      error = self.output[-1]-target 
      print("ERROR IS") 
      print(np.mean(0.5*error*error)) 
      delta=[] 
      delta_o = error * self.deriv_linear(self.output[-1]) 
      delta.append(delta_o) 

      for k in reversed(range(self.layers-2)): 
       delta_h = np.dot(delta[-1],self.weight[k+1].T) * self.deriv_tanh(self.output[k+1]) 
       delta.append(delta_h) 
      delta.reverse() 

      # WEIGHT UPDATE 

      for i in range(self.layers-1): 
       self.weight[i] -= (self.eta * np.dot(self.output[i].T, delta[i])) 

     print("Training complete !") 
     print("ACCURACY IS") 
     acc = (1.0-(0.5*error*error))*100 
     print(np.mean(acc)) 

    def recall(self,in_data): 
     in_data = np.atleast_2d(in_data) 
     bias = np.atleast_2d(np.ones(in_data.shape[0])*(-1)).T 
     in_data = np.hstack((in_data,bias)) 
     y_out = in_data.copy() 
     for i in range(self.layers-2): 
      y_in = np.dot(y_out,self.weight[i]) 
      y_out = self.tanh(y_in).copy() 
     y_in = np.dot(y_out,self.weight[-1]) 
     y_out = self.linear(y_in).copy() 
     return y_out 
# MAIN 
data = np.loadtxt("iris.txt",delimiter=",") 
obj = BackPropagation([4,2,1]) 
in_data = data[:rows,:cols].copy() 
target = data[:rows,cols:].copy() 
obj.training(in_data,target) 
print("ANSWER IS") 
print(obj.recall(in_data)) 

데이터 세트는이 같은 것입니다. 여기에서 처음 네 열은 지형지 물이며 마지막 열은 목표 값을 포함합니다. 데이터 세트에는 150 개의 레코드가 있습니다.

5.1,3.5,1.4,0.2,0 
4.9,3.0,1.4,0.2,0 
5.0,3.6,1.4,0.2,0 
5.4,3.9,1.7,0.4,0 
4.6,3.4,1.4,0.3,0 
7.0,3.2,4.7,1.4,1 
6.4,3.2,4.5,1.5,1 
6.9,3.1,4.9,1.5,1 
5.5,2.3,4.0,1.3,1 
6.3,3.3,6.0,2.5,2 
5.8,2.7,5.1,1.9,2 
7.1,3.0,5.9,2.1,2 
6.3,2.9,5.6,1.8,2 

매 에포크 후 예측값은 기하 급수적으로 증가하고있다. 그리고 50 epoch 내에서 코드는 INF 또는 -INF를 출력으로 제공합니다. 신원 기능 대신, 나는 또한 누설 ReLU를 시도했지만, 여전히 출력은 INF였다. 또한 다양한 학습 속도, 숨겨진 레이어의 뉴런 수, 숨겨진 레이어 수, 초기 가중치, 반복 횟수 등을 시도했습니다. 그래서 어떻게 오류가 역 전파하는 신경 네트워크를 사용하여 회귀를 수행 할 수 있습니까?

+0

귀하의 손실 기능은 무엇입니까? –

+0

@Bastian Schoettle L = (0.5 * error * error) 여기서 error는 예측 된 값과 목표 값의 차이입니다. –

답변

2

회귀 작업에 평균 제곱 오류 함수를 사용합니다. 분류 작업을 위해 일반적으로 출력으로 softmax 레이어를 사용하고 교차 항목 비용 기능을 최적화합니다.

+0

정말 고마워요! 이제 올바른 출력을 생성 중입니다. 나는 기계 학습과 신경 네트워크의 초보자에 불과하다. 그래서, 나는 softmax와 cross-entry 비용 함수에 대해 확실히 공부할 것이고 구현할 것입니다. –

+0

걱정하지 마라 :) 우리 모두는 어딘가에서 시작해야했다! –

관련 문제