BP神经网络python代码详细解答(来自原文翻译)
翻譯如下
**
**
? ? ? ? 注: Scratch是一款由麻省理工學(xué)院(MIT) 設(shè)計(jì)開(kāi)發(fā)的一款面向少年的簡(jiǎn)易編程工具。這里寫(xiě)鏈接內(nèi)容 ? ? ? ? 本文翻譯自“IMPLEMENTING A NEURAL NETWORK FROM SCRATCH IN PYTHON – AN INTRODUCTION”,原文鏈接為這里寫(xiě)鏈接內(nèi)容。并且,我在這里給出原文數(shù)學(xué)公式的推導(dǎo)和對(duì)原文一些概念的修正;
? ? ? ? 在這里,我將展示一種簡(jiǎn)單的三層神經(jīng)網(wǎng)絡(luò),我不會(huì)詳細(xì)推導(dǎo)出與本文有關(guān)的所有數(shù)學(xué)公式,我將我的想法以一種直觀的形式展示出來(lái),我也會(huì)提供一些相關(guān)鏈接,來(lái)讓讀者能更好的理解本文的細(xì)節(jié)。
我認(rèn)為,你們對(duì)于基本的微積分知識(shí)和機(jī)器學(xué)習(xí)的概念有一定的認(rèn)識(shí)。同樣你們應(yīng)該能理解分類(lèi)和回歸的概念,如果你們能夠理解最優(yōu)化的概念,如梯度下降法的原理,那就更好了。如果你對(duì)本文的概念都不了解,你同樣可以發(fā)現(xiàn)這篇文章還是很有意思的。
但是為什么用scratch來(lái)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò) ,即使你在以后采用其他軟件平臺(tái)如PyBrain,僅僅用scratch 做一次神經(jīng)網(wǎng)絡(luò)都是非常有價(jià)值的,他幫助你理解神經(jīng)網(wǎng)絡(luò)的運(yùn)作原理,這種原理對(duì)于建立模型是至關(guān)重要的。
我要指出的是這里的代碼例子不是非常高效,但是他容易理解,在以后的文章中,我將用Theano.展示一種更加高效的神經(jīng)網(wǎng)絡(luò)。
產(chǎn)生一組數(shù)據(jù)
? ? ? ? 讓我們產(chǎn)生一組數(shù)據(jù)來(lái)開(kāi)始,幸運(yùn)的是scikit-learn 有非常有用的數(shù)據(jù)發(fā)生器,我們沒(méi)有必要自己寫(xiě)代碼來(lái)產(chǎn)生數(shù)據(jù)了。我們用make_moons function.來(lái) 出數(shù)據(jù)
? ? ? ? 我們得到兩類(lèi)數(shù)據(jù),分別以紅點(diǎn)和藍(lán)點(diǎn)畫(huà)出,你可以認(rèn)為藍(lán)色的點(diǎn)代表男性病人,紅點(diǎn)代表女性病人,X,Y軸分別代表治療措施。我們的目標(biāo)是訓(xùn)練機(jī)器分類(lèi)器,讓機(jī)器來(lái)分類(lèi),然后給出想X,Y的坐標(biāo)。需要指出的是這些數(shù)據(jù)不是線(xiàn)性可分的。我們不能用一條直線(xiàn)來(lái)將這兩組數(shù)據(jù)分成兩類(lèi)。這就意味著,像Logistic Regression這樣的算法不能用于這樣數(shù)據(jù)的分類(lèi),除非你采用對(duì)于分類(lèi)比較好的,手動(dòng)非線(xiàn)性回歸(如多項(xiàng)式回歸)算法,
事實(shí)上,神經(jīng)網(wǎng)絡(luò)的一個(gè)優(yōu)勢(shì)就是你沒(méi)有必要擔(dān)心特征的收集,隱藏層就會(huì)自動(dòng)學(xué)習(xí)特征。
LOGISTIC REGRESSION(邏輯斯提克回歸)
為了證明這一點(diǎn),我們來(lái)訓(xùn)練Logistic Regression 分類(lèi)器,輸入X,Y值和輸出分類(lèi)(0 or 1)
import numpy as np from sklearn import datasets, linear_model import matplotlib.pyplot as pltdef generate_data():np.random.seed(0)X, y = datasets.make_moons(200, noise=0.20)return X, ydef visualize(X, y, clf):# plt.scatter(X[:, 0], X[:, 1], s=40, c=y, cmap=plt.cm.Spectral)# plt.show()plot_decision_boundary(lambda x: clf.predict(x), X, y)plt.title("Logistic Regression")def plot_decision_boundary(pred_func, X, y):# Set min and max values and give it some paddingx_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5h = 0.01# Generate a grid of points with distance h between themxx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))# Predict the function value for the whole gidZ = pred_func(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)# Plot the contour and training examplesplt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)plt.show()def classify(X, y):clf = linear_model.LogisticRegressionCV()clf.fit(X, y)return clf? ? ? ? 圖片顯示,分類(lèi)邊界已經(jīng)被Logistic Regression classifier畫(huà)出,他將數(shù)據(jù)盡其所能按直線(xiàn)分成兩類(lèi),但是他不能捕捉月亮形狀的數(shù)據(jù)。
TRAINING A NEURAL NETWORK(訓(xùn)練一種神經(jīng)網(wǎng)絡(luò))
? ? ? ? 我們將建立一個(gè)三層神經(jīng)網(wǎng)絡(luò),這個(gè)網(wǎng)絡(luò)包括一個(gè)輸入層,一個(gè)輸出層和一個(gè)隱藏層。輸入層的節(jié)點(diǎn)數(shù)(2)由數(shù)據(jù)的維度確定(數(shù)據(jù)時(shí)二維的,包括X,Y的坐標(biāo) ),輸出層的節(jié)點(diǎn)數(shù)(2)由所分的種類(lèi)確定(我們只有兩類(lèi)數(shù)據(jù),我們實(shí)際上可以只設(shè)置一個(gè)輸出節(jié)點(diǎn)來(lái)預(yù)測(cè)0或者1,但是當(dāng)設(shè)置兩個(gè)節(jié)點(diǎn)時(shí),該神經(jīng)網(wǎng)絡(luò)可以擴(kuò)展,使該網(wǎng)絡(luò)可以計(jì)算更多的分類(lèi)),輸入層只要輸入X,Y的坐標(biāo),輸出層要輸出兩種分類(lèi)的概率。
? ? ? ? 我們可以設(shè)置隱藏層的節(jié)點(diǎn)數(shù),隱藏層的節(jié)點(diǎn)數(shù)越多,分類(lèi)的效果越好。但是這樣做的代價(jià)也比較大,首先,該網(wǎng)絡(luò)的在預(yù)測(cè)是需要學(xué)習(xí)的參數(shù)就比較多,導(dǎo)致計(jì)算量的增加。其次,大量的參數(shù)也容易導(dǎo)致過(guò)擬合。怎樣去確定隱藏層的規(guī)模呢? 盡管有一些大致的規(guī)則和建議,更多時(shí)候取決于實(shí)際問(wèn)題的情況。隱藏層的節(jié)點(diǎn)數(shù)更多時(shí)候是一個(gè)藝術(shù)的問(wèn)題而不是一個(gè)科學(xué)的問(wèn)題,我們將改變隱藏層的 節(jié)點(diǎn)數(shù)來(lái)看看輸出 的效果
我們需要為隱藏層選取一個(gè)激活函數(shù),這個(gè)激活函數(shù)將層的輸入值轉(zhuǎn)化為輸出值,非線(xiàn)性的激活函數(shù)允許我們完成非線(xiàn)性的預(yù)測(cè),激活函數(shù)一般選取,tanh, the sigmoid function, or ReLUs. /font>
? ? ? ? 我們將使用tanh,tanh在很多情況下表現(xiàn)都很好。這些函數(shù)都有一個(gè)很好的優(yōu)點(diǎn),即他們的導(dǎo)數(shù)可以用他們的原函數(shù)來(lái)表示。例如 這樣的函數(shù)非常有用,因?yàn)槲覀冎恍枰?jì)算一次函數(shù)值,然后再次利用函數(shù)值來(lái)得到他的導(dǎo)數(shù)值
? ? ? ? 因?yàn)槲覀兿M摼W(wǎng)絡(luò)最后輸出概率,所以我們將輸出層的激活函數(shù)選為 softmax,softmax可以將原始數(shù)據(jù)轉(zhuǎn)化為概率,如果你對(duì)logistic function 比較熟悉的話(huà)你可以把它看做logistic function 的推廣。
? ? ? ? 譯者說(shuō)明:本神經(jīng)網(wǎng)絡(luò)在算法本質(zhì)上是BP 神經(jīng)網(wǎng)絡(luò),但是他與一般的BP網(wǎng)又存在不同點(diǎn):
? ? ? ? 1. 一般教科書(shū)上的BP網(wǎng)都采用同一個(gè)激活函數(shù),下文的代碼中,隱藏層的激活函數(shù)為tanh ,輸出層的激活函數(shù)為softmax.為什么采用softmax 作為輸出層的激活函數(shù),我會(huì)在下文中進(jìn)行說(shuō)明。
HOW OUR NETWORK MAKES PREDICTIONS (我們的網(wǎng)絡(luò)如何預(yù)測(cè))
? ? ? ?我們的網(wǎng)絡(luò)采用前饋神經(jīng)網(wǎng)絡(luò),即一串矩陣相乘,然后再利用我們之前定義的激活函數(shù)。如果x是一個(gè)二維數(shù)組,輸入到神經(jīng)網(wǎng)絡(luò),輸出值為 同樣是二維數(shù)據(jù)。
\begin{aligned} z_1 & = xW_1 + b_1 \ a_1 & = \tanh(z_1) \ z_2 & = a_1W_2 + b_2 \ a_2 & = \hat{y} = \mathrm{softmax}(z_2) \end{aligned}
zi 是第i層的輸入值,ai是第i層通過(guò)激活函數(shù)的輸出值,w1,b1,w2,b2,為該神經(jīng)網(wǎng)絡(luò)的參數(shù),這些參數(shù)同對(duì)數(shù)據(jù)的學(xué)習(xí)來(lái)不斷的修正(w1為輸入層和隱藏層之間的權(quán)矩陣,b1為隱藏層的偏置,w2為隱藏層和輸出層之間的權(quán)矩陣,b1為輸出層的偏置)。你也可以認(rèn)為他是各層之間的轉(zhuǎn)換矩陣。通過(guò)對(duì)上面矩陣相乘我們可以看出各個(gè)矩陣的維度,如果我們?cè)陔[藏層設(shè)置500個(gè)節(jié)點(diǎn),那么
? ? ? ?? ? ? ?
? ? ? ? 現(xiàn)在你可以看出,如果我們?cè)黾与[藏層的節(jié)點(diǎn),我們將需要更多的參數(shù)
LEARNING THE PARAMETERS
? ? ? ?通過(guò)最小化誤差來(lái)不斷的修正各層的參數(shù)(w1,b1,w2,b2,)。但是如何定義誤差呢,我們把這個(gè)函數(shù)叫作誤差損失函數(shù);關(guān)于softmax 函數(shù)的誤差函數(shù)叫做叫做交叉熵?fù)p失(也叫做log似然代價(jià)函數(shù)),如果我們有N個(gè)訓(xùn)練例子和C個(gè)人分類(lèi),那么log似然代價(jià)函數(shù)如下, 是我們的預(yù)測(cè)值(計(jì)算值),而y是標(biāo)簽值,(目標(biāo)值)
? ? ? ? ? ? ? ?
? ? ? ?這個(gè)公式看起來(lái)非常復(fù)雜,但是他只是將所有例子的誤差加起來(lái),如果我們預(yù)測(cè)分類(lèi)不正確,y 是(目標(biāo)值),是預(yù)測(cè)值(計(jì)算值),如果這兩個(gè)值相差越大,則誤差函數(shù)就越大。通過(guò)訓(xùn)練數(shù)據(jù)最大化似然函數(shù),來(lái)最小化誤差,同時(shí)不斷修正網(wǎng)絡(luò)參數(shù)。
? ? ? ? 我們可以用梯度下降法來(lái),尋求最小值,我將常用的梯度下降法,也叫采用固定學(xué)習(xí)速度的批量梯度下降法。他的變種是隨機(jī)梯度下降法和 minibatch gradient descent,表現(xiàn)都很好,如果你對(duì)這種算法感興趣,你可以嘗試一下各種算法。
? ? ? ?輸入時(shí),梯度下降法需要輸入梯度,(),損失函數(shù)的向量導(dǎo)數(shù)。為了計(jì)算梯度我們運(yùn)用著名的BP算法。該算法是一種計(jì)算梯度的有效算法。我不想展示BP算法的的求導(dǎo)細(xì)節(jié)。
? ? ? ? 譯者注釋:
1.BP 神經(jīng)網(wǎng)絡(luò)求導(dǎo)細(xì)節(jié)請(qǐng)看這里這里寫(xiě)鏈接內(nèi)容這是一篇非常好的文章還有這篇這里寫(xiě)鏈接內(nèi)容
2.在下面代碼中還涉及到softmax的求導(dǎo),這里寫(xiě)鏈接內(nèi)容請(qǐng)好好看看上面三篇文章,你就對(duì)BP 算法有比較深刻的認(rèn)識(shí)。
? ? ? ?通過(guò)誤差反向傳播算法,我們可以得到如下公式(相信我,下面的公式是正確的)
? ? ? ?? ? ? ?? ? ? ?
? ? ? ? 譯者注釋:那我就將推導(dǎo)上面所有公式!!!
BP算法
1.0
? ? ? ?? 表示第 L-1層的第i個(gè)神經(jīng)元連接到第層的第j個(gè)神經(jīng)元的連接權(quán)重;
? ? ? ?? ? 表示第L層的第i個(gè)神經(jīng)元的輸入
? ? ? ?
? ? ? ?? ? 表示第L層的第i個(gè)神經(jīng)元的輸出
? ? ? ?
? ? ? ?? ? 表示輸出層的激活函數(shù),在本文中,激活函數(shù)為softmax函數(shù)。
2.0
代價(jià)函數(shù)為最大似然函數(shù),如下: 是我們的預(yù)測(cè)值(計(jì)算值),而y是標(biāo)簽值,(目標(biāo)值)
? ? ? ? ? ? ? ?
3.0
首先,將第L層第i個(gè)神經(jīng)元中產(chǎn)生的錯(cuò)誤對(duì)第i層的倒數(shù)定義為
? ? ? ? ? ? ? ?
方程一(計(jì)算損失函數(shù)對(duì)輸出層某個(gè)節(jié)點(diǎn)輸入值的導(dǎo)數(shù))
方程2(由后往前,計(jì)算損失函數(shù)對(duì)前一層某個(gè)節(jié)點(diǎn)輸入值的導(dǎo)數(shù)):
方程3(計(jì)算損失函數(shù)對(duì)最靠近當(dāng)前層與當(dāng)前層某個(gè)權(quán)值的偏導(dǎo)數(shù)):
方程4(計(jì)算損失函數(shù)對(duì)當(dāng)前層某個(gè)偏置的偏導(dǎo)數(shù)):
4.0
BP算法偽代碼
1,輸入數(shù)據(jù)
2,初始化權(quán)值和偏置我w,b
3,前向傳播
3,計(jì)算損失函數(shù)對(duì)輸出層某個(gè)節(jié)點(diǎn)輸入值的偏導(dǎo)數(shù)
4,計(jì)算損失函數(shù)對(duì)隱藏層某個(gè)節(jié)點(diǎn)輸入值的偏導(dǎo)數(shù)
5,計(jì)算損失函數(shù)對(duì)各層各個(gè)節(jié)點(diǎn)的權(quán)值,和偏置的梯度,采用梯度下降法最小化似然函數(shù)
在這里我們已經(jīng)清楚BP算法的的原理,我們要感謝這里寫(xiě)鏈接內(nèi)容這位博主,他用精細(xì)化的數(shù)學(xué)語(yǔ)言向我們展示了BP算法。他的推到有點(diǎn)問(wèn)題,我已經(jīng)在我的文章中糾正了。
但是要理解下面的代碼,有一個(gè)很重要的問(wèn)題就是softmax函數(shù)求導(dǎo)的問(wèn)題,這里我們將探討這個(gè)問(wèn)題。
1. softmax函數(shù)及其求導(dǎo);我們要感謝這里寫(xiě)鏈接內(nèi)容內(nèi)容這位博主,他用精細(xì)化的數(shù)學(xué)語(yǔ)言向我們展示了softmax求導(dǎo)算法。
softmax的函數(shù)
其中,表示第L層(通常是最后一層)第j個(gè)神經(jīng)元的輸入,表示第L層第j個(gè)神經(jīng)元的輸出,e表示自然常數(shù)。注意看,表示了第L層所有神經(jīng)元的輸入之和。
softmax函數(shù)最明顯的特點(diǎn)在于:它把每個(gè)神經(jīng)元的輸入占當(dāng)前層所有神經(jīng)元輸入之和的比值,當(dāng)作該神經(jīng)元的輸出。這使得輸出更容易被解釋:神經(jīng)元的輸出值越大,則該神經(jīng)元對(duì)應(yīng)的類(lèi)別是真實(shí)類(lèi)別的可能性更高。
另外,softmax不僅把神經(jīng)元輸出構(gòu)造成概率分布,而且還起到了歸一化的作用,適用于很多需要進(jìn)行歸一化處理的分類(lèi)問(wèn)題。
由于softmax在ANN算法中的求導(dǎo)結(jié)果比較特別,分為兩種情況。希望能幫助到正在學(xué)習(xí)此類(lèi)算法的朋友們。求導(dǎo)過(guò)程如下所示:
二次代價(jià)函數(shù)在訓(xùn)練ANN時(shí)可能會(huì)導(dǎo)致訓(xùn)練速度變慢的問(wèn)題。那就是,初始的輸出值離真實(shí)值越遠(yuǎn),訓(xùn)練速度就越慢。這個(gè)問(wèn)題可以通過(guò)采用交叉熵代價(jià)函數(shù)來(lái)解決。其實(shí),這個(gè)問(wèn)題也可以采用另外一種方法解決,那就是采用softmax激活函數(shù),并采用log似然代價(jià)函數(shù)(log-likelihood cost function)來(lái)解決。
log似然代價(jià)函數(shù)的公式為:
在上一篇博文“交叉熵代價(jià)函數(shù)”中講到,二次代價(jià)函數(shù)在訓(xùn)練ANN時(shí)可能會(huì)導(dǎo)致訓(xùn)練速度變慢的問(wèn)題。那就是,初始的輸出值離真實(shí)值越遠(yuǎn),訓(xùn)練速度就越慢。這個(gè)問(wèn)題可以通過(guò)采用交叉熵代價(jià)函數(shù)來(lái)解決。其實(shí),這個(gè)問(wèn)題也可以采用另外一種方法解決,那就是采用softmax激活函數(shù),并采用log似然代價(jià)函數(shù)(log-likelihood cost function)來(lái)解決。
log似然代價(jià)函數(shù)的公式為:
下面為羅干注釋的代碼
# -*- coding: utf-8 -*- """ Created on Sun Feb 12 14:57:00 2017@author: Denny Britz @Translater:luogan 羅干 @luogan has make some coment on the code @ 我愛(ài)婷婷和臭臭 """import numpy as np from sklearn import datasets, linear_model import matplotlib.pyplot as pltclass Config:nn_input_dim = 2 #數(shù)組輸入的維度是2(x,y兩個(gè)坐標(biāo)當(dāng)然是二維啊)nn_output_dim = 2#數(shù)組輸出的維度是2(分為兩類(lèi)當(dāng)然是二維啊) epsilon = 0.01 # 梯度下降學(xué)習(xí)步長(zhǎng)reg_lambda = 0.01 # 修正的指數(shù)?def generate_data():np.random.seed(0)#偽隨機(jī)數(shù)的種子0,當(dāng)然也可以是1,2啊X, y = datasets.make_moons(200, noise=0.20)#產(chǎn)生200個(gè)數(shù)據(jù),噪聲誤差為0.2return X, ydef visualize(X, y, model):plot_decision_boundary(lambda x:predict(model,x), X, y)#好好看這個(gè)代碼,函數(shù)名字做參數(shù)哦plt.title("Logistic Regression")def plot_decision_boundary(pred_func, X, y):#把X的第一列的最小值減掉0.5賦值給x_min,把X的第一列的最大值加0.5賦值給x_maxx_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5h = 0.01# 根據(jù)最小最大值和一個(gè)網(wǎng)格距離生成整個(gè)網(wǎng)格,就是在圖上細(xì)分好多個(gè)點(diǎn),畫(huà)分類(lèi)邊界的時(shí)候要用這些點(diǎn)xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))Z = pred_func(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)plt.show()def predict(model, x):#這是字典啊W1, b1, W2, b2 = model['W1'], model['b1'], model['W2'], model['b2']z1 = x.dot(W1) + b1# 輸入層向隱藏層正向傳播a1 = np.tanh(z1) # 隱藏層激活函數(shù)使用tanh = (exp(x) - exp(-x)) / (exp(x) + exp(-x))z2 = a1.dot(W2) + b2# 隱藏層向輸出層正向傳播exp_scores = np.exp(z2)#這兩步表示輸出層的激活函數(shù)為softmax函數(shù)哦probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)return np.argmax(probs, axis=1)def build_model(X, y, nn_hdim, num_passes=20000, print_loss=False):num_examples = len(X)np.random.seed(0)#初始化權(quán)值和偏置W1 = np.random.randn(Config.nn_input_dim, nn_hdim) / np.sqrt(Config.nn_input_dim)b1 = np.zeros((1, nn_hdim))W2 = np.random.randn(nn_hdim, Config.nn_output_dim) / np.sqrt(nn_hdim)b2 = np.zeros((1, Config.nn_output_dim))model = {}for i in range(0, num_passes):z1 = X.dot(W1) + b1# 輸入層向隱藏層正向傳播a1 = np.tanh(z1)# 隱藏層激活函數(shù)使用tanh = (exp(x) - exp(-x)) / (exp(x) + exp(-x))z2 = a1.dot(W2) + b2# 隱藏層向輸出層正向傳播exp_scores = np.exp(z2)#這兩步表示輸出層的激活函數(shù)為softmax函數(shù)哦probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)delta3 = probs#下面這才是delta3,為損失函數(shù)對(duì)z2求偏導(dǎo)數(shù),y-y^delta3[range(num_examples), y] -= 1dW2 = (a1.T).dot(delta3)#損失函數(shù)對(duì)w2的偏導(dǎo)數(shù)db2 = np.sum(delta3, axis=0, keepdims=True)#損失函數(shù)對(duì)b2的偏導(dǎo)數(shù)delta2 = delta3.dot(W2.T) * (1 - np.power(a1, 2))#損失函數(shù)對(duì)z1的偏導(dǎo)數(shù)dW1 = np.dot(X.T, delta2)#損失函數(shù)對(duì)w1的偏導(dǎo)數(shù)db1 = np.sum(delta2, axis=0)#損失函數(shù)對(duì)b1的偏導(dǎo)數(shù)#個(gè)人認(rèn)為下面兩行代碼完全沒(méi)有必要存在dW2 += Config.reg_lambda * W2#w2梯度增量的修正 屁話(huà)dW1 += Config.reg_lambda * W1#w1梯度增量的修正 屁話(huà)#更新權(quán)值和偏置W1 += -Config.epsilon * dW1b1 += -Config.epsilon * db1W2 += -Config.epsilon * dW2b2 += -Config.epsilon * db2model = {'W1': W1, 'b1': b1, 'W2': W2, 'b2': b2}return modeldef main():X, y = generate_data()model = build_model(X, y, 8)visualize(X, y, model)if __name__ == "__main__":main()#2017.3.20 羅干注釋于同濟(jì)大學(xué)圖書(shū)館[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-yTVs91UX-1596200021425)(https://img-blog.csdn.net/20170320100022990?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvZ2FudHRjYw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
在這里首先要感謝dennybritz這里是dennybritz的github
(High-school dropout. Google Brain, Stanford, Berkeley. Into Startups, Deep Learning. Writing at wildml.com and dennybritz.com. Lived in 日本 and ??)
操,高中輟學(xué)都這么屌,還上了斯坦福,和伯克利。
dennybritz在GitHub上分享了他的代碼和文章。我的這篇博客就是對(duì)dennybritz原文的翻譯,但是他的文章中沒(méi)有BP網(wǎng)絡(luò)和softmax函數(shù)的求導(dǎo)。
我在這篇文章中插入數(shù)學(xué)推導(dǎo),主要參考這里天才的博客這位天才的文章,為了讓讀者更好的理解BP,我就直接引用了。
特碼的,搞神經(jīng)網(wǎng)絡(luò),畢業(yè)都延期了,不過(guò)也是值得的
未完待續(xù),我還會(huì)修改的
總結(jié)
以上是生活随笔為你收集整理的BP神经网络python代码详细解答(来自原文翻译)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python 程序开机自启动,亲测可用
- 下一篇: python filter