成人av在线资源一区,亚洲av日韩av一区,欧美丰满熟妇乱XXXXX图片,狠狠做五月深爱婷婷伊人,桔子av一区二区三区,四虎国产精品永久在线网址,国产尤物精品人妻在线,中文字幕av一区二区三区欲色
    您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
    此為臨時鏈接,僅用于文章預覽,將在時失效
    人工智能開發者 正文
    發私信給AI研習社
    發送

    0

    一篇文章教你用 11 行 Python 代碼實現神經網絡

    本文作者: AI研習社 2017-04-20 17:30
    導語:怎樣用最簡單的方式實現神經網絡?

    雷鋒網按:本文作者陶言祺,原文載于作者個人博客,雷鋒網已獲授權。

    聲明:本文是根據英文教程 A Neural Network in 11 lines of Python(用 11 行 Python 代碼實現的神經網絡)學習總結而來,關于更詳細的神經網絡的介紹可以參考我的另一篇博客:從感知機到人工神經網絡

    如果你讀懂了下面的文章,你會對神經網絡有更深刻的認識,有任何問題,請多指教。

      Very simple Neural Network

    首先確定我們要實現的任務:

    一篇文章教你用 11 行 Python 代碼實現神經網絡


    輸出的為樣本為 X 為 4*3,有 4 個樣本 3 個屬性,每一個樣本對于這一個真實值 y,為 4*1 的向量,我們要根據 input 的值輸出與 y 值損失最小的輸出。

      Two Layer Neural Network

    首先考慮最簡單的神經網絡,如下圖所示:

    一篇文章教你用 11 行 Python 代碼實現神經網絡


    輸入層有3個神經元(因為有3個屬性),輸出為一個值,w1,w2,w3為其權重。輸出為: 

    一篇文章教你用 11 行 Python 代碼實現神經網絡

    這里的f為sigmoid函數: 

    一篇文章教你用 11 行 Python 代碼實現神經網絡

    一個重要的公式: 

    一篇文章教你用 11 行 Python 代碼實現神經網絡

    神經網絡的優化過程是:

    1. 前向傳播求損失 
    2. 反向傳播更新w

    簡單是實現過程如下所示:

    import numpy as np

    # sigmoid function

    # deriv=ture 是求的是導數

    def nonlin(x,deriv=False):

        if(deriv==True):

            return x*(1-x)

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

    # input dataset

    X = np.array([  [0,0,1],

                    [1,1,1],

                    [1,0,1],

                    [0,1,1] ])

    # output dataset            

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

    # seed random numbers to make calculation

    np.random.seed(1)

    # initialize weights randomly with mean 0

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

    # 迭代次數

    for iter in xrange(10000):

        # forward propagation

        # l0也就是輸入層

        l0 = X

        l1 = nonlin(np.dot(l0,syn0))

        # how much did we miss?

        l1_error = y - l1

        # multiply how much we missed by the 

        # slope of the sigmoid at the values in l1

        l1_delta = l1_error * nonlin(l1,True)

        # update weights

        syn0 += np.dot(l0.T,l1_delta)

    print "Output After Training:"

    print l1

    注意這里整體計算了損失,X(4*3) dot w(3*1) = 4*1 為輸出的 4 個值,所以 
    l1_error = y - l1 同樣為一個 4*1 的向量。

    重點理解:

       # slope of the sigmoid at the values in l1

       #nonlin(l1,True),這里是對sigmoid求導

       #前向計算,反向求導

       l1_delta = l1_error * nonlin(l1,True)  

      # update weights

       syn0 += np.dot(l0.T,l1_delta)

    下面看一個單獨的訓練樣本的情況,真實值y==1,訓練出來的為0.99已經非常的接近于正確的值了,因此這時應非常小的改動syn0的值,因此:

    一篇文章教你用 11 行 Python 代碼實現神經網絡

    一篇文章教你用 11 行 Python 代碼實現神經網絡

    運行輸出結果為,可以看到其訓練的不錯:

    Output After Training:
    Output After Training:[[ 0.00966449]
    [ 0.99211957]
    [ 0.99358898]
    [ 0.00786506]]123456123456

      Three Layer Neural Network

    我們知道,兩層的神經網絡即為一個小的感知機(參考:感知機到人工神經網絡),它只能出來線性可分的數據,如果線性不可分,則其出來的效果較差,如下圖所示的數據:

     一篇文章教你用 11 行 Python 代碼實現神經網絡

    如果仍用上述的代碼(2層的神經網絡)則其結果為:

    Output After Training:[[ 0.5]
    [ 0.5]
    [ 0.5]
    [ 0.5]]1234512345

    因為數據并不是線性可分的,因此它是一個非線性的問題,神經網絡的強大之處就是其可以搭建更多的層來對非線性的問題進行處理。

    下面我將搭建一個含有5個神經元的隱含層,其圖形如下,(自己畫的,略丑),這來要說下神經網絡其實很簡單,只要你把層次的結果想清楚。

    一篇文章教你用 11 行 Python 代碼實現神經網絡

    要搞清楚w的維度:第一層到第二層的w為3*5,第二層到第三層的W為5*1,因此還是同樣的兩個步驟,前向計算誤差,然后反向求導更新w。 

    完整的代碼如下:

    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([[0,0,1],

                [0,1,1],

                [1,0,1],

                [1,1,1]])

    y = np.array([[0],

                [1],

                [1],

                [0]])

    np.random.seed(1)

    # randomly initialize our weights with mean 0

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

    syn1 = 2*np.random.random((5,1)) - 1

    for j in xrange(60000):

        # Feed forward through layers 0, 1, and 2

        l0 = X

        l1 = nonlin(np.dot(l0,syn0))

        l2 = nonlin(np.dot(l1,syn1))

        # how much did we miss the target value?

        l2_error = y - l2

        if (j% 10000) == 0:

            print "Error:" + str(np.mean(np.abs(l2_error)))

        # in what direction is the target value?

        # were we really sure? if so, don't change too much.

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

        # how much did each l1 value contribute to the l2 error (according to the weights)?

        l1_error = l2_delta.dot(syn1.T)

        # in what direction is the target l1?

        # were we really sure? if so, don't change too much.

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

        syn1 += l1.T.dot(l2_delta)

        syn0 += l0.T.dot(l1_delta)

    print l2

    運行的結果為:

    Error:0.500628229093

    Error:0.00899024507125

    Error:0.0060486255435

    Error:0.00482794013965

    Error:0.00412270116481

    Error:0.00365084766242

    # 這一部分是最后的輸出結果

    [[ 0.00225305]
    [ 0.99723356]
    [ 0.99635205]
    [ 0.00456238]]

    如果上面的代碼看懂了,那么你就可以自己搭建自己的神經網絡了,無論他是多少層,或者每個層有多少個神經元,都能很輕松的完成。當然上面搭建的神經網絡只是一個很簡單的網絡,同樣還有許多的細節需要學習,比如說反向傳回來的誤差我們可以用隨機梯度下降的方法去更新W,同時還可以加上偏置項b,還有學習率 α 等問題。

    雷鋒網相關文章:

    不到 200 行代碼,教你如何用 Keras 搭建生成對抗網絡(GAN)

    如何在 i5 上實現 20 倍的 Python 運行速度?

    詳解 Kaggle 房價預測競賽優勝方案:用 Python 進行全面數據探索

    雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知

    一篇文章教你用 11 行 Python 代碼實現神經網絡

    分享:
    相關文章

    編輯

    聚焦數據科學,連接 AI 開發者。更多精彩內容,請訪問:yanxishe.com
    當月熱門文章
    最新文章
    請填寫申請人資料
    姓名
    電話
    郵箱
    微信號
    作品鏈接
    個人簡介
    為了您的賬戶安全,請驗證郵箱
    您的郵箱還未驗證,完成可獲20積分喲!
    請驗證您的郵箱
    立即驗證
    完善賬號信息
    您的賬號已經綁定,現在您可以設置密碼以方便用郵箱登錄
    立即設置 以后再說