2016-10-26 13 views
1
import numpy as np 

def nonlin(x, deriv=False): 
    if (deriv == True): 
     return (x * (1 - x)) 
    return 1/(1 + np.exp(-x)) 

X = np.array([[1,1,1], 
       [3,3,3], 
       [2,2,2] 
       [2,2,2]]) 

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

np.random.seed(1) 

syn0 = 2 * np.random.random((3, 4)) - 1 
syn1 = 2 * np.random.random((4, 1)) - 1 

for j in xrange(100000): 
    l0 = X 
    l1 = nonlin(np.dot(l0, syn0)) 
    l2 = nonlin(np.dot(l1, syn1)) 
    l2_error = y - l2 
    if (j % 10000) == 0: 
     print "Error: " + str(np.mean(np.abs(l2_error))) 

    l2_delta = l2_error * nonlin(l2, deriv=True) 

    l1_error = l2_delta.dot(syn1.T) 

    l1_delta = l1_error * nonlin(l1, deriv=True) 

    syn1 += l1.T.dot(l2_delta) 
    syn0 += l0.T.dot(l1_delta) 

print "Output after training" 
print l2 

誰かがそれが印刷されている理由と重要な理由を説明することができますか。このコードは私にとって意味をなさないようです。 forループは、与えられたデータセットのネットワーク内のニューロンを最適化することになっています。しかし、これはどのようにして行われますか?ノンリン関数とは何ですか?これは?:誰かがこの神経回路網の学習コードを説明できますか?

syn0 = 2 * np.random.random((3, 4)) - 1 
syn1 = 2 * np.random.random((4, 1)) - 1 

答えて

2

何をやるんこれは、ニューラルネットワークを訓練するための簡単なコードです:

これは、ニューロンの活性化である、機能が活性化関数またはその誘導体を返します(それがS字状であります関数)。あなたがニューロンを見ることができます。この絵では

def nonlin(x, deriv=False): 
    if (deriv == True): 
     return (x * (1 - x)) 
    return 1/(1 + np.exp(-x)) 

は、この機能は絵にステップ関数のように表示されます。

https://blog.dbrgn.ch/images/2013/3/26/perceptron.png

これらは雨データ、3つの機能

X = np.array([[1,1,1], 
      [3,3,3], 
      [2,2,2] 
      [2,2,2]]) 
を持つ4件のデータがあります

すべてのデータのラベル(バイナリ分類タスク)

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

このコードは、(それが重みの2層ニューラルネットワークである)、ニューラルネットワークの重みを初期化する:この写真で

np.random.seed(1) 

syn0 = 2 * np.random.random((3, 4)) - 1 
syn1 = 2 * np.random.random((4, 1)) - 1 

重みはすべての値(VNMとWKNであり、マトリックスでありますリンク)。あなたのケースでは

https://www.google.es/search?q=multilayer+perceptron&espv=2&biw=1920&bih=964&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjtjP6jr_jPAhUHORoKHbiACdsQ_AUIBigB#imgrc=5npsALleN2cFQM%3A

あなたは3個の入力ニューロン、4個の隠されたニューロンと1個の出力ニューロンを持っています。すべてのリンクの値は、syn0とsyn1に格納されます。

このコードは、ニューラルネットワークを訓練し、それは、すべてのデータを渡し、エラーを評価し、伝播バック使用して重みを更新:

for j in xrange(100000): 
    l0 = X 
    l1 = nonlin(np.dot(l0, syn0)) 
    l2 = nonlin(np.dot(l1, syn1)) 
    l2_error = y - l2 
    if (j % 10000) == 0: 
     print "Error: " + str(np.mean(np.abs(l2_error))) 

    l2_delta = l2_error * nonlin(l2, deriv=True) 

    l1_error = l2_delta.dot(syn1.T) 

    l1_delta = l1_error * nonlin(l1, deriv=True) 

    syn1 += l1.T.dot(l2_delta) 
    syn0 += l0.T.dot(l1_delta) 
関連する問題