2017-09-24 27 views
2

私は、2入力、2隠し(シグモイド)、1出力(シグモイド)のような、私の単純なニューラルネットワークにバックプロパゲーションを実装しようとしています。しかし、それは適切に動作していないようです。私は私のエラーを印刷するときバックプロパゲーション:sigmoidの導関数を乗算すると誤差がゼロに近づくのはなぜですか?

import numpy as np 

# Set inputs and labels 
X = np.array([ [0, 1], 
       [0, 1], 
       [1, 0], 
       [1, 0] ]) 

Y = np.array([[0, 0, 1, 1]]).T 

# Make random always the same 
np.random.seed(1) 
# Initialize weights 
w_0 = 2 * np.random.rand(2, 2) - 1 
w_1 = 2 * np.random.rand(1, 2) - 1 

# Learning Rate 
lr = 0.1 

# Sigmoid Function/Derivative of Sigmoid Function 
def sigmoid(x, deriv=False): 
    if(deriv==True): 
     return x * (1 - x) 
    return 1/(1 + np.exp(-x)) 

# Neural network 
def network(x, y, w_0, w_1): 
    inputs = np.array(x, ndmin=2).T 
    label = np.array(y, ndmin=2).T 

    # Forward Pass 
    hidden = sigmoid(np.dot(w_0, inputs)) 
    output = sigmoid(np.dot(w_1, hidden)) 

    # Calculate error and delta 
    error = label - output 
    delta = error * sigmoid(output, True) 

    hidden_error = np.dot(w_1.T, error) 
    delta_hidden = error * sigmoid(hidden, True) 

    # Update weight 
    w_1 += np.dot(delta, hidden.T) * lr 
    w_0 += np.dot(delta_hidden, record.T) * lr 

    return error 

# Train 
for i in range(6000): 
    for j in range(X.shape[0]): 
     error = network(X[j], Y[j], w_0, w_1) 

     if(i%1000==0): 
      print(error) 

私が取得: Figure 1。それは何らかの形で作品

delta = error 

:私はデルタを変更すると、それは0

に閉じていないため、適切ではない

Figure 2

なぜですか?シグモイド関数の微分で誤差を乗算するべきではありませんか?

答えて

1

私は、それが

delta_hidden = hidden_error * sigmoid(hidden, True) 
+0

ええ、私の悪いされるべきだと思います。私はそれをまったく気付かなかった。どうもありがとう! –

関連する問題