Python中从头开始实现神经网络 - 介绍
原文出處:
http://www.wildml.com/2015/09/implementing-a-neural-network-from-scratch/
Posted on September 3, 2015 by Denny Britz
這篇文章幫助我們用python實踐一下從零開始訓練一個神經(jīng)網(wǎng)絡(luò)。
以下是中文翻譯:
獲取代碼
在這篇文章中,我們將從頭開始實現(xiàn)一個簡單的3層神經(jīng)網(wǎng)絡(luò)。 我們不會推導出所有需要的數(shù)學運算,但是我會盡量直觀地解釋我們正在做什么。 我也會指點資源給你閱讀細節(jié)。
在這里,我假設(shè)你熟悉基本的微積分和機器學習的概念,例如 你知道什么是分類和正規(guī)化。 理想情況下,您也可以了解梯度下降等優(yōu)化技術(shù)的工作原理。 但是,即使你不熟悉以上任何一點,這篇文章仍然會變得有趣;
但為什么從頭開始實施一個神經(jīng)網(wǎng)絡(luò)呢? 即使您計劃在將來使用像PyBrain這樣的神經(jīng)網(wǎng)絡(luò)庫,從頭開始至少實施一次網(wǎng)絡(luò)也是非常有價值的練習。 它可以幫助您了解神經(jīng)網(wǎng)絡(luò)是如何工作的,這對于設(shè)計有效的模型是至關(guān)重要的。
有一點要注意的是,這里的代碼示例并不是非常有效。 他們的意思是很容易理解。 在即將發(fā)布的文章中,我將探討如何使用Theano編寫高效的神經(jīng)網(wǎng)絡(luò)實現(xiàn)。 (更新:現(xiàn)在可用)
生成數(shù)據(jù)集
讓我們開始生成一個我們可以玩的數(shù)據(jù)集。 幸運的是,scikit-learn有一些有用的數(shù)據(jù)集生成器,所以我們不需要自己編寫代碼。 我們將使用make_moons函數(shù)。
我們生成的數(shù)據(jù)集有兩個類,繪制成紅色和藍色的點。 你可以把藍點看作是男性患者,將紅點看作是女性患者,x軸和y軸是醫(yī)學測量。
我們的目標是訓練一個機器學習分類器,預測給定x和y坐標的正確類別(女性的男性)。 請注意,數(shù)據(jù)不是線性可分的,我們不能繪制一條直線來分隔兩個類。 這意味著線性分類器(如Logistic回歸)將無法適用數(shù)據(jù),除非您手動設(shè)計對于給定數(shù)據(jù)集非常有效的非線性特征(例如多項式)。
事實上,這是神經(jīng)網(wǎng)絡(luò)的主要優(yōu)勢之一。 您不需要擔心功能工程。 神經(jīng)網(wǎng)絡(luò)的隱藏層將為您學習功能。
Logistic回歸
為了證明這一點,讓我們訓練一個Logistic回歸分類器。 它的輸入是x和y值,輸出是預測的類(0或1)。 為了讓我們的生活更輕松,我們使用scikit-learn的Logistic Regression類。
# Train the logistic rgeression classifier clf = sklearn.linear_model.LogisticRegressionCV() clf.fit(X, y)# Plot the decision boundary plot_decision_boundary(lambda x: clf.predict(x)) plt.title("Logistic Regression")該圖顯示了我們的Logistic回歸分類器學到的決策邊界。 它使用直線將數(shù)據(jù)盡可能分離,但無法捕捉數(shù)據(jù)的“月亮形狀”。
訓練一個神經(jīng)網(wǎng)絡(luò)
現(xiàn)在我們來構(gòu)建一個具有一個輸入層,一個隱藏層和一個輸出層的三層神經(jīng)網(wǎng)絡(luò)。 輸入層中節(jié)點的數(shù)量取決于我們數(shù)據(jù)的維數(shù)2.類似地,輸出層中節(jié)點的數(shù)量是由我們所擁有的類的數(shù)量決定的,也是2.(因為我們只有2個類, 實際上只能有一個輸出節(jié)點預測為0或1,但有2個可以使網(wǎng)絡(luò)稍后擴展到更多類)。 網(wǎng)絡(luò)的輸入將是x和y坐標,其輸出將是兩個概率,一個是0級(“女性”),一個是1級(“男性”)。 它看起來像這樣:
我們可以選擇隱藏層的維數(shù)(節(jié)點數(shù))。我們放入隱藏層的節(jié)點越多,我們就可以適應更復雜的功能。但更高的維度是有代價的。首先,需要更多的計算來進行預測并學習網(wǎng)絡(luò)參數(shù)。更多的參數(shù)也意味著我們更容易過擬合我們的數(shù)據(jù)。
如何選擇隱藏層的大小?雖然有一些一般的指導方針和建議,但它總是取決于你的具體問題,更多的是藝術(shù)而不是科學。稍后我們將使用隱藏的節(jié)點數(shù)來看看它是如何影響我們的輸出的。
我們還需要為隱藏層選擇一個激活函數(shù)。激活功能將圖層的輸入轉(zhuǎn)換為其輸出。非線性激活函數(shù)使我們能夠擬合非線性假設(shè)。用于激活功能的常見選擇是tanh,sigmoid函數(shù)或ReLU。我們將使用tanh,在許多場景中表現(xiàn)相當好。這些函數(shù)的一個很好的屬性是可以使用原始函數(shù)值來計算它們的派生值。例如,tanh x的導數(shù)是1- (tanh x)^2。這很有用,因為它可以讓我們計算一次tanh x并稍后重新使用它的值來得到導數(shù)。
因為我們希望我們的網(wǎng)絡(luò)輸出概率,輸出層的激活函數(shù)將是softmax,這只是將原始分數(shù)轉(zhuǎn)換為概率的一種方法。如果您熟悉邏輯功能,您可以將softmax視為對多個類的歸納
總結(jié)
以上是生活随笔為你收集整理的Python中从头开始实现神经网络 - 介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 方舟怎么捡石头(方舟生存进化)
- 下一篇: python set()函数讲解