2017-12-10 35 views
2

虹彩データセットの回帰を実行してそのタイプを予測しています。私は同じデータと同じニューラルネットワークを使って分類に成功しました。分類のために、すべてのレイヤーで活性化関数としてtanhを使用しました。しかし、回帰のために、私は隠された層のtanh関数と出力層の同一性関数を使用しています。ニューラルネットワークの線形関数は出力として大きな値を生成しています。

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)) 

データセットは、このようなものです。ここでは、最初の4つの列はフィーチャであり、最後の列にはターゲット値が含まれています。このような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エポック以内に、コードはINFまたは-INFを出力として与えます。アイデンティティ関数の代わりに、私は漏れたReLUも試しましたが、出力はINFでした。私はまた、学習率、隠れた層のニューロンの数、隠れた層の数、初期重み値、反復回数などを試してみました。 それでは、誤差の逆伝播を伴うニューラルネットワークを用いて回帰を行うにはどうすればよいですか?

+0

あなたの損失機能は何ですか? –

+0

@Bastian Schoettle L =(0.5 * error * error)ここで、errorは予測値と目標値の差です。 –

答えて

2

回帰タスクの平均二乗誤差関数を使用します。分類タスクでは、通常、出力としてsoftmaxレイヤーを使用し、相互エントリーコスト関数を最適化します。

+0

ありがとうございました!現在、正しい出力が生成されています。私は機械学習とニューラルネットワークの初心者です。だから、私は間違いなくsoftmaxとクロスエントリーコスト関数について学び、実装します。 –

+0

心配しない:)私たちは皆どこかに出発しなければならなかった! –

関連する問題