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

2021-01-11 雷鋒網

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

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

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

Very simple Neural Network

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

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

Two Layer Neural Network

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

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

這裡的f為sigmoid函數:

一個重要的公式:

神經網絡的優化過程是:

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 的向量。

重點理解:

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

#前向計算,反向求導

# update weights

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

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

Output After Training:

Output After Training:[[ 0.00966449]

[ 0.99211957]

[ 0.99358898]

[ 0.00786506]]123456123456

Three Layer Neural Network

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

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

Output After Training:[[ 0.5]

[ 0.5]

[ 0.5]]1234512345

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

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

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

完整的代碼如下:

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

[0,1,1],

[1,1,1]])

y = np.array([[0],

[1],

[0]])

# 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

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?

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 進行全面數據探索

相關焦點

  • 10行Python代碼也能實現,親測好用!
    大數據文摘出品編譯:朱一輝、雪清、小魚短短10行代碼就可以實現目標檢測?!本文作者和他的團隊構建了一個名為ImageAI 的Python庫,集成了現今流行的深度學習框架和計算機視覺庫。本文將手把手教你構建自己的第一個目標檢測應用,而且文摘菌已經幫你踩過坑了,親測有效!
  • 代碼跑得慢甩鍋Python?手把手教你如何給代碼提速30%
    其實某個特定程序(無論使用何種程式語言)的運行速度是快還是慢,在很大程度上取決於編寫該程序的開發人員自身素質,以及他們編寫優化而高效代碼的能力。Medium上一位小哥就詳細講了講如何讓python提速30%,以此證明代碼跑得慢不是python的問題,而是代碼本身的問題。
  • 幾行代碼教你在Pytorch和Python中實現神經風格遷移
    在這個子領域已經取得了一些進展,但最顯著的初步工作(神經類型遷移)是Gatys等人在2015年完成的。以下是應用這種技術的效果圖。從左到右為:內容圖像、風格圖像、生成的圖像這個方法相當直觀,本文是在pytorch和python中實現神經風格遷移的簡單指南,並預先解釋了這個方法。
  • 程式設計師的樂趣,生成自定義二維碼,5行Python代碼就搞定
    那麼有沒有辦法實現自定義生成二維碼呢?近日,一位熱衷於終身學習的工程師兼攝影師 Arindom Bhattacharjee 撰寫了一篇自定義生成二維碼的方法,並且整個生成過程只需要 5 行 Python 代碼即可完成。感興趣的讀者可以自己實現下。
  • 代碼詳解:基於Python建立任意層數的深度神經網絡 - 讀芯術
    圖1 神經網絡構造的例子(符號說明:上標[l]表示與第l層;上標(i)表示第i個例子;下標i表示矢量第i項)單層神經網絡圖2 單層神經網絡示例神經元模型是先計算一個線性函數(z=Wx+b),接著再計算一個激活函數。一般來說,神經元模型的輸出值是a=g(Wx+b),其中g是激活函數(sigmoid,tanh, ReLU, …)。
  • 如何用Python和深度神經網絡識別圖像?
    如果你對原理不感興趣,請跳過這一部分,看「小結」。如果你對知識喜歡刨根問底,那咱們來講講原理。雖然不過寫了10幾行代碼,但是你構建的模型卻足夠複雜和高大上。它就是傳說中的卷積神經網絡(Convolutional Neural Network, CNN)。它是深度機器學習模型的一種。最為簡單的卷積神經網絡大概長這個樣子:
  • 教你用PyTorch實現「看圖說話」(附代碼、學習資源)
    這將會幫助你更深刻地掌握各個主題,成為一名更好的DeepLearning實踐者。這篇文章將和大家一起看一個有趣的多模態主題,我們將結合圖像和文本處理技術來構建一個有用的深度學習應用,即看圖說話(ImageCaptioning)。看圖說話是指從一個圖像中基於其中的對象和動作生成文本描述的過程。例如:
  • 40行Python代碼,實現卷積特徵可視化
    本文將向你解釋如何僅使用 40 行 Python 代碼將卷積特徵可視化。最近在閱讀 Jeremy Rifkin 的書《The End of Work》時,我讀到一個有趣的關於 AI 的定義。深度學習研究的目的是從數據中學習到目前為止還沒有自動化的流程的規則並實現自動化。雖然這聽起來並不是那麼讓人興奮,但它確實是一件好事。舉個例子:深度卷積神經網絡的出現徹底改變了計算機視覺和模式識別,這讓我們在醫療診斷中可以大量地引入自動化;人們可以加速為貧窮國家的人提供頂級醫療診斷,而不需要在本地培訓大量的醫生和專家。
  • 神經網絡初學者指南:基於Scikit-Learn的Python模塊
    ,其最新版本現在已經內置支持神經網絡模型。前幾天最新版本(0.18)剛剛發布,現在已內置支持神經網絡模型。 對 Python 的基本理解對於弄明白這篇文章是必要的,有一些關於Sci-Kit Learn 的使用經驗也是十分有幫助的(但不是必要)。另外,作為一個快速附註,我寫了一篇詳解版的姐妹文章,不過是以 R 語言編寫的(可點擊此處查看)。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    -人工神經網絡1 6-12回歸-分類-人工神經網絡2 6-13回歸-回歸樹與提升樹 6-14聚類-Kmeans1 6-15聚類Kmeans2 6-16聚類DBSCAN 6-17聚類層次聚類 6-18聚類圖分裂 6-19關聯-關聯規則1 6-20關聯-關聯規則2
  • 手把手教你用Keras進行多標籤分類(附代碼)
    或者至少訓練一個神經網絡來完成三項分類任務? 我不想在if / else代碼的級聯中單獨應用它們,這些代碼使用不同的網絡,具體取決於先前分類的輸出。 謝謝你的幫助Switaj提出了一個美妙的問題:Keras深度神經網絡是否有可能返回多個預測?
  • 不到200 行代碼,教你如何用 Keras 搭建生成對抗網絡(GAN)
    它的核心思想是:同時訓練兩個相互協作、同時又相互競爭的深度神經網絡(一個稱為生成器 Generator,另一個稱為判別器 Discriminator)來處理無監督學習的相關問題。在訓練過程中,兩個網絡最終都要學習如何處理任務。通常,我們會用下面這個例子來說明 GAN 的原理:將警察視為判別器,製造假幣的犯罪分子視為生成器。一開始,犯罪分子會首先向警察展示一張假幣。
  • 20行Python代碼實現視頻字符化
    看起來是非常高端,但是實際實現起來確實非常簡單,我們只需要接觸opencv模塊,就能很快的實現視頻字符化。 OpenCV的安裝及圖片讀取 在Python中我們只需要用pip安裝即可,我們在控制臺執行下列語句: pip install opencv-python 安裝完成就可以開始使用
  • 如何用張量分解加速深層神經網絡?(附代碼)
    這幫助我很好的開始學習這塊內容,建議你閱讀一下這些內容。加上裁剪(pruning),張量分解是加快現有深度神經網絡的實用工具,我希望這篇文章能讓這些內容更加容易理解。這些方法需要將一個層分解成幾個更小的層。儘管在分解後會有更多的層,但是浮點運算次數和權重的總數會變小。
  • 神經網絡篇——從代碼出發理解BP神經網絡
    下面小編將以代碼的方式帶著大家一步一步實現BP神經網絡,並且還會再用框架的方式實現BP網絡,用來和源碼作比較,認識一下TensorFlow2.0的強大。我們首先要理清建立BP神經網絡的目的,其次,確定BP神經網絡的結構,簡單地以一個輸入層,一個隱藏層,一個輸出層為例,我們來思考一下寫代碼的思路,然後一步一步實現。
  • 谷歌推出新框架:只需5行代碼,就能提高模型準確度和魯棒性
    曉查 發自 凹非寺量子位 出品 | 公眾號 QbitAI今天,谷歌推出了新開源框架——神經結構學習(NSL),它使用神經圖學習方法,來訓練帶有圖(Graph)和結構化數據的神經網絡,可以帶來更強大的模型。現在,通過TensorFlow就能獲取和使用。NSL有什麼用?
  • 神經網絡篇——用TensorFlow2.0框架實現BP網絡
    熬過了上一篇漫長的代碼,稍微解開了一丟丟疑惑,使得抽象的BP有一點具體化了,可是還是有好多細節的東西沒有講清楚,比如,為什麼要用激活函數?為什麼隨機梯度下降沒有提到?下面我們來一一解開疑惑。首先是為什麼要使用激活函數?這要回顧一下我們在學習BP之前學習的感知器模型。它模仿的是人類體內的信號傳導的過程,當信號達到一定的閾值時,就可以繼續向後傳播。
  • 華為開源只用加法的神經網絡:實習生領銜打造,效果不輸傳統CNN
    曉查 發自 凹非寺量子位 報導 | 公眾號 QbitAI沒有乘法的神經網絡,你敢想像嗎?無論是單個神經元的運算還是卷積運算,都不可避免地要使用乘法。然而乘法對硬體資源的消耗遠大於加法。去年年底,來自北京大學、華為諾亞方舟實驗室、鵬城實驗室的研究人員將這一想法付諸實踐,他們提出了一種只用加法的神經網絡AdderNet(加法器網絡)。一作是華為諾亞方舟實習生,正在北大讀博三。如今,這篇文章已經被CVPR 2020收錄(Oral),官方也在GitHub上開放了原始碼。
  • 神經網絡理論基礎及Python實現
    7月22號,我們等你一起! 一、多層前向神經網絡 多層前向神經網絡由三部分組成:輸出層、隱藏層、輸出層,每層由單元組成; 輸入層由訓練集的實例特徵向量傳入,經過連接結點的權重傳入下一層,前一層的輸出是下一層的輸入;隱藏層的個數是任意的,輸入層只有一層,輸出層也只有一層; 除去輸入層之外,隱藏層和輸出層的層數和為n,則該神經網絡稱為n層神經網絡
  • ...加法的神經網絡:實習生領銜打造,效果不輸傳統CNN | CVPR 2020...
    關注前沿科技 量子位曉查 發自 凹非寺量子位 報導 | 公眾號 QbitAI沒有乘法的神經網絡,你敢想像嗎?無論是單個神經元的運算還是卷積運算,都不可避免地要使用乘法。然而乘法對硬體資源的消耗遠大於加法。如果不用乘法,全部改用加法應該可以讓運算速度大大提升。