1

2パーセプトロンネットワークを使用してXORゲートを作成しようとしていますが、何らかの理由でネットワークが学習していないため、グラフのエラーの変化をプロットするとエラーが静的レベルその領域で振動する。ニューラルネットワークXORゲートが学習していない

私は現時点でネットワークにいかなるバイアスも加えていませんでした。

import numpy as np 

def S(x): 
    return 1/(1+np.exp(-x)) 

win = np.random.randn(2,2) 
wout = np.random.randn(2,1) 
eta = 0.15 

# win = [[1,1], [2,2]] 
# wout = [[1],[2]] 

obj = [[0,0],[1,0],[0,1],[1,1]] 
target = [0,1,1,0] 

epoch = int(10000) 
emajor = "" 

for r in range(0,epoch): 
    for xy in range(len(target)): 
     tar = target[xy] 
     fdata = obj[xy] 

     fdata = S(np.dot(1,fdata)) 

     hnw = np.dot(fdata,win) 

     hnw = S(np.dot(fdata,win)) 

     out = np.dot(hnw,wout) 

     out = S(out) 

     diff = tar-out 

     E = 0.5 * np.power(diff,2) 
     emajor += str(E[0]) + ",\n" 

     delta_out = (out-tar)*(out*(1-out)) 
     nindelta_out = delta_out * eta 

     wout_change = np.dot(nindelta_out[0], hnw) 

     for x in range(len(wout_change)): 
      change = wout_change[x] 
      wout[x] -= change 

     delta_in = np.dot(hnw,(1-hnw)) * np.dot(delta_out[0], wout) 
     nindelta_in = eta * delta_in 

     for x in range(len(nindelta_in)): 
      midway = np.dot(nindelta_in[x][0], fdata) 
      for y in range(len(win)): 
       win[y][x] -= midway[y] 



f = open('xor.csv','w') 
f.write(emajor) # python will convert \n to os.linesep 
f.close() # you can omit in most cases as the destructor will call it 

これはラーニングラウンド数によって変化するエラーです。これは正しいです?赤い色の線は、エラーがどのように変化するかを予想していた線です。

enter image description here

私はコードでやっている何か?私は何が原因でエラーが発生しているのか分からないようです。大いに感謝します。各エポックで計算誤差は、すべての和の合計でなければなりません

+0

あなたは私のブログ記事「TensorFlowを使ったXORチュートリアル」(https:// martin-thoma)に興味があるかもしれません。 .com/tf-xor-tutorial /) –

答えて

0

事前に

おかげで2乗誤差(すべてのターゲットのためのすなわちエラー)ここで

import numpy as np 
def S(x): 
    return 1/(1+np.exp(-x)) 
win = np.random.randn(2,2) 
wout = np.random.randn(2,1) 
eta = 0.15 
# win = [[1,1], [2,2]] 
# wout = [[1],[2]] 
obj = [[0,0],[1,0],[0,1],[1,1]] 
target = [0,1,1,0]  
epoch = int(10000) 
emajor = "" 

for r in range(0,epoch): 

    # ***** initialize final error ***** 
    finalError = 0 

    for xy in range(len(target)): 
     tar = target[xy] 
     fdata = obj[xy] 

     fdata = S(np.dot(1,fdata)) 

     hnw = np.dot(fdata,win) 

     hnw = S(np.dot(fdata,win)) 

     out = np.dot(hnw,wout) 

     out = S(out) 

     diff = tar-out 

     E = 0.5 * np.power(diff,2) 

     # ***** sum all errors ***** 
     finalError += E 

     delta_out = (out-tar)*(out*(1-out)) 
     nindelta_out = delta_out * eta 

     wout_change = np.dot(nindelta_out[0], hnw) 

     for x in range(len(wout_change)): 
      change = wout_change[x] 
      wout[x] -= change 

     delta_in = np.dot(hnw,(1-hnw)) * np.dot(delta_out[0], wout) 
     nindelta_in = eta * delta_in 

     for x in range(len(nindelta_in)): 
      midway = np.dot(nindelta_in[x][0], fdata) 
      for y in range(len(win)): 
       win[y][x] -= midway[y] 

    # ***** Save final error ***** 
    emajor += str(finalError[0]) + ",\n" 


f = open('xor.csv','w') 
f.write(emajor) # python will convert \n to os.linesep 
f.close() # you can omit in most cases as the destructor will call it 
+0

答えに感謝しますが、エラーグラフをプロットするとグラフとグラフが違うのはなぜですか?それは可能ですか? – rksh

+0

はい、無作為の初期重量が使用され、プログラムが開始されるたびに初期重量が変化するからです。詳細はこちらバックプロンプトの理解のための良いリンクです - https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/ –

+0

ありがとうございます、 delta_in = np.dot(hnw、(1-hnw))* np.dot(delta_out [0]、wout)行が正しくないと思いませんか?私は手動で計算して、この行のoutfromは、おそらく私は間違った方法でここでnumpy.dotを使用している希望のものではないと思いますか? – rksh

1

は、バックプロパゲーションを持つ1つの隠れ層のネットワークであり、これは、relu、sigmoid、およびその他のアクティベーションを使用して実験を実行するようにカスタマイズすることができます。いくつかの実験の後に、reluでネットワークがより良好に実行され、収束に早く到達し、シグモイドでは損失値が変動すると結論付けられた。これは、 "the gradient of sigmoids becomes increasingly small as the absolute value of x increases"が原因で発生します。

import numpy as np 
import matplotlib.pyplot as plt 
from operator import xor 

class neuralNetwork(): 
    def __init__(self): 
     # Define hyperparameters 
     self.noOfInputLayers = 2 
     self.noOfOutputLayers = 1 
     self.noOfHiddenLayerNeurons = 2 

     # Define weights 
     self.W1 = np.random.rand(self.noOfInputLayers,self.noOfHiddenLayerNeurons) 
     self.W2 = np.random.rand(self.noOfHiddenLayerNeurons,self.noOfOutputLayers) 

    def relu(self,z): 
     return np.maximum(0,z) 

    def sigmoid(self,z): 
     return 1/(1+np.exp(-z)) 

    def forward (self,X): 
     self.z2 = np.dot(X,self.W1) 
     self.a2 = self.relu(self.z2) 
     self.z3 = np.dot(self.a2,self.W2) 
     yHat = self.relu(self.z3) 
     return yHat 

    def costFunction(self, X, y): 
     #Compute cost for given X,y, use weights already stored in class. 
     self.yHat = self.forward(X) 
     J = 0.5*sum((y-self.yHat)**2) 
     return J 

    def costFunctionPrime(self,X,y): 
     # Compute derivative with respect to W1 and W2 
     delta3 = np.multiply(-(y-self.yHat),self.sigmoid(self.z3)) 
     djw2 = np.dot(self.a2.T, delta3) 
     delta2 = np.dot(delta3,self.W2.T)*self.sigmoid(self.z2) 
     djw1 = np.dot(X.T,delta2) 

     return djw1,djw2 


if __name__ == "__main__": 

    EPOCHS = 6000 
    SCALAR = 0.01 

    nn= neuralNetwork()  
    COST_LIST = [] 

    inputs = [ np.array([[0,0]]), np.array([[0,1]]), np.array([[1,0]]), np.array([[1,1]])] 

    for epoch in xrange(1,EPOCHS): 
     cost = 0 
     for i in inputs: 
      X = i #inputs 
      y = xor(X[0][0],X[0][1]) 
      cost += nn.costFunction(X,y)[0] 
      djw1,djw2 = nn.costFunctionPrime(X,y) 
      nn.W1 = nn.W1 - SCALAR*djw1 
      nn.W2 = nn.W2 - SCALAR*djw2 
     COST_LIST.append(cost) 

    plt.plot(np.arange(1,EPOCHS),COST_LIST) 
    plt.ylim(0,1) 
    plt.xlabel('Epochs') 
    plt.ylabel('Loss') 
    plt.title(str('Epochs: '+str(EPOCHS)+', Scalar: '+str(SCALAR))) 
    plt.show() 

    inputs = [ np.array([[0,0]]), np.array([[0,1]]), np.array([[1,0]]), np.array([[1,1]])] 
    print "X\ty\ty_hat" 
    for inp in inputs: 
     print (inp[0][0],inp[0][1]),"\t",xor(inp[0][0],inp[0][1]),"\t",round(nn.forward(inp)[0][0],4) 

最終結果:

enter image description here

X  y  y_hat 
(0, 0) 0  0.0 
(0, 1) 1  0.9997 
(1, 0) 1  0.9997 
(1, 1) 0  0.0005 

トレーニングの後に得られた重みがあった。

nn.w1

[ [-0.81781753 0.71323677] 
    [ 0.48803631 -0.71286155] ] 

nn.w2

[ [ 2.04849235] 
    [ 1.40170791] ] 
私は、ニューラルネットを理解するため、以下のユーチューブシリーズが非常に役に立った:少しだけあり Neural networks demystified

私が知っているし、またそれがこの回答に説明することができました。 cs231n: Modelling one neuron

関連する問題