Python進行時:簡単なニューラルネットワークの実現とコードの詳細

1480 ワード

ニューラルネットワークは深い学習の基礎であるので、深い学習には2つの基礎があると思います.すなわち、ニューラルネットワーク理論をマスターし、理論を実現する利器であるPythonをマスターします.
Pythonで簡単なBPニューラルネットワークを記述し、ほとんどのコードを説明した良い文章です.原文リンクは次のとおりです.http://python.jobbole.com/82758/
私は研究の後、自分でそのプログラムを繰り返してみて、考えて、やっと理解しました.次はeclipseで作成したコードです.
#-*-coding:utf-8 -*-
import numpy as np
#    sigmoid  
def nonlin(x,deriv=False):
    if deriv==True:
        return x*(1-x)
    return 1/(1+np.exp(-x))

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

#  syn0,     。    ,        -1 1
syn0=2*np.random.random([3,1])-1

#    ,    。          -  l0   -  n 
for i in xrange(1000):
    #     ,l0 l1.
    l0=x
    l1=nonlin(np.dot(l0,syn0))
    l1_error=y-l1
    l1_delta=l1_error*nonlin(l1,deriv=True)
    syn0+=np.dot(l0.T,l1_delta)
    
print "the training result is:"
print l1
    
は、以下の結果を得た.
the training result is: [[ 0.99849276]  [ 0.04149694]  [ 0.02333249]  [0.96630778]]これは標準的な答え[1,0,0,1]に近いことがわかる.
しかし、このような訓練にも欠陥があり、それは過フィッティングである.(私が最近読んだ関連論文は確かに少なくないことを説明します.ハハ)つまり、別の実例を入力すると、結果は実際の状況とはかけ離れている可能性があります.オーバーフィットを解決するにはもちろん多くの方法があるが,上記の例は操作が簡便であり,すべての基礎であるため,まずそれを実現する.
このような状況は「数値分析」と少し似ている:数値分析の基本思想は線形化であり、1つのラグランジュ補間式は数値微分、数値積分など多くの分野で使用することができる.難しい者はできない、できる者は難しくない.
この数日の学習を通じて、私は深い学習に対しても新しい考えを持っています:深い学習はあれらの明らかではない特徴を発見して、そしてそれらを区別します.これはデジタル画像処理における時間領域から周波数領域への変換と似ており,偶然かどうか分からない.私はまだ詳しく見ていませんが、そのネットワークはこの考えに基づいているのかもしれません.