2017-06-07 144 views
0

我已經實現了下面的神經網絡來解決Python中的異或問題。我的神經網絡由3個神經元的輸入層,2個神經元的1個隱藏層和1個神經元的輸出層組成。我使用的S型函數作爲隱含層和輸出層的激活功能:神經網絡XOR-蟒蛇

import numpy as np 

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


np.random.seed(1) 
weights1 = np.random.random((3,2)) - 1 
weights2 = np.random.random((2,1)) - 1 


def nonlin(x,deriv=False): 
    if(deriv==True): 
     return x*(1-x) 

return 1/(1+np.exp(-x)) 

for iter in xrange(10000): 
    z2 = np.dot(x,weights1) 

    a2 = nonlin(z2) 

    z3 = np.dot(a2,weights2) 

    a3 = nonlin(z3) 

    error = y- a3 

    delta3 = error * nonlin(z3,deriv=True) 
    l1error = delta3.dot(weights2.T) 
    delta2 = l1error *nonlin(z2, deriv=True) 

    weights2 += np.dot(a2.T, delta3) 
    weights1 += np.dot(x.T,delta2) 



print(a3) 

的backpropogation似乎是正確的,但我不斷收到這個錯誤,所有的值成爲「南」,OUTPUT:

RuntimeWarning: overflow encountered in exp 
return 1/(1+np.exp(-x)) 

RuntimeWarning: overflow encountered in multiply 
return x*(1-x) 
[[ nan] 
[ nan] 
[ nan] 
[ nan]] 

你能幫我解決這個問題嗎?謝謝。

+0

調試,找出引入NaN被地方。一旦將NaN用於數學方程式,其他一切涉及NaN,並污染你的結果。查看導致NaN出現在Python數學中的原因,並找出導致它出現的位置。 – Carcigenicate

+0

噢,再次閱讀它,它會告訴你它到底發生了什麼。你的指數溢出。你的指數可能太大了。發生溢出時檢查'x'的值。這可能是出於某種原因。 – Carcigenicate

+0

你不需要那麼多的神經元來解決異或。它可以用2個輸入,隱藏層中的2個神經元和輸出層中的一個來解決 – SumNeuron

回答

0

你有一些問題與權爆炸:

weight1 = [[ -6.25293101e+194 -2.22527234e+000] 
      [ 2.24755436e+193 -2.44789058e+000] 
      [ -2.40600808e+194 -1.62490517e+000]] 

發生這種情況,因爲當你計算反向傳播增量錯誤,您使用的點陣產品的輸出,而不是激活函數的輸出。

校正代碼:

delta3 = error * nonlin(a3,deriv=True) 
l1error = delta3.dot(weights2.T) 
delta2 = l1error *nonlin(a2, deriv=True) 
+0

輸出後10000 ITER會聚:「[[0.01139139] [0.98615801] [0.98615404] [0.50073101]] ' – Abdu307

+0

100000 iter後輸出:'[[0.01087608] [0.99134548] [0.99134548] [0.0117681]]' – Abdu307