當前位置:
首頁 > 知識 > 入門級難度構建Pyhton神經網路,矽谷AI網紅手把手帶你入坑

入門級難度構建Pyhton神經網路,矽谷AI網紅手把手帶你入坑

入門級難度構建Pyhton神經網路,矽谷AI網紅手把手帶你入坑



Siraj Raval 作為深度學習領域的自媒體人在歐美可以說是無人不知、無人不曉。


憑藉在 Youtube 上的指導視頻,Siraj Raval 在全世界吸粉無數,堪稱是機器學習界的網紅。說他是全球範圍內影響力最大的 ML 自媒體人,怕也無異議。


因此,雷鋒網 AI 研習社聯繫到了 Siraj 本人,並獲得授權將他最精華的 Youtube 視頻進行字幕漢化,免費推送給大家。我們將不定期更新,敬請關注!

雷鋒字幕組為大家最新譯制了Siraj深度學習系列,從機器學習和神經網路架構類型到數據可視化、小樣本學習等從基礎到應用的技巧,爭取帶領希望掌握神經網路的神奇魔力和想成為深度學習工程師的大傢伙早日入坑!哦不,走向巔峰!!




入門級難度構建Pyhton神經網路,矽谷AI網紅手把手帶你入坑



(建議在 Wi-Fi 環境下觀看視頻,土豪隨意~)


為了方便流量不足的小夥伴們在路上看,我們特意整理出了圖文版:


大腦神經網路機制


在走進機器學習之前,我們回頭想想,作為人類的我們是如何學習的?我們的大腦可以接收五類感知信息(視覺、聽覺、觸覺、嗅覺、味覺)並由其創造出層層概念。但是什麼給了大腦這種特殊的能力,使人腦不同於自然界中的其它生命?所有我們經歷或感受到的想法和記憶、自我認知,都產生於大腦。


在分子層面,大腦由大約1000億個神經細胞(也稱神經元)組成。每個神經元負責三項工作:第一項工作是從樹突上接受一組信號;第二項工作是把這些信號整合在一起以決定是否需要把信息傳遞到細胞體中;最後一項工作是如果信號總和超過了一定閾值就發送動作電位信號,並通過它們的軸突傳給下一組神經元。

神經網路模型發展


在1943年,兩位早期的計算機科學家Warren McCulloch 和Walter Pitts 發明了第一個神經元計算模型。他們的模型演示了一個神經元,可以接收二進位,將它們求和並且如果求和超過了一定的閾值,就輸出1,如果沒有,就輸出0。這是一個簡單的模型,但是在AI 的早期,這可相當了不起。

入門級難度構建Pyhton神經網路,矽谷AI網紅手把手帶你入坑



幾年之後,一個叫Frank Rosenblatt的心理學家對McCulloch-Pitts的模型仍然缺少學習機制而感到失望,所以他在前人的想法之上設想了一個神經模型,稱之為感知器(Perceptron),也稱作單層前饋神經網路。我們稱它為前饋,是因為數據只沿一個方向前進。


感知器引入了輸入的權值概念。給定一些輸入輸出的訓練集,它應該可以通過增大或減少每個連續特徵數據的權值,並依據每個訓練集的輸出值來學習一個函數。這些權重值以數學的形式應用於輸入,這樣在每次迭代之後,輸出預測變得更準確。


使用 Python 構建神經網路


使用Python建立一個單層前饋神經網路(感知器),並且只需用到Numpy!


1. 在主函數中,先初始神經網路,定義成一個類。接下來演示時,為了方便參考,先print初始權重。現在看下數據集:

入門級難度構建Pyhton神經網路,矽谷AI網紅手把手帶你入坑


這4個例子中每個例子都有3個輸入值和1個輸出值,都是1或0,我們將以這些值來訓練神經網路。所以當給定一個新的1和0數列時,訓練後的神經網路將能夠預測輸出是1還是0。因為我們要確定它屬於哪一類,這就是機器學習中的分類任務。我們將利用這些數據作為函數參數來訓練神經網路。主函數代碼和詳細注釋如下:


if __name__ == "__main__":


#神經網路初始化


neural_network=NeuralNetwork()


print"Random starting synaptic weights: "


printneural_network.synaptic_weights


# 訓練數據集. 4個二進位數字的例子


# 每個例子有3個輸入值和一個輸出值


training_set_inputs=array([[,,1], [1,1,1], [1,,1], [,1,1]])

training_set_outputs=array([[,1,1,]]).T


# 用數據集訓練神經網路


# 訓練的迭代次數為10,000


neural_network.train(training_set_inputs, training_set_outputs,10000)


print"New synaptic weights after training: "


printneural_network.synaptic_weights


#用新的輸入值預測輸出值


print"Considering new situation [1, 0, 0] -> ?: "


printneural_network.think(array([1,,]))


2. 現在我們來定義神經網路的類。當初始化類時,首先要做的是選擇seed值(seed是一個任意整數,目的是為了每次都生成一樣的隨機數),接下來隨機初始化權重值,並設置seed值,確保每次程序運行時它會生成相同的數字,這對於以後的調試是很有用。

我們將把隨機權重值分配給3*1的矩陣,權重值的範圍是- 1至1,平均值為0。接下來將寫激活函數,在這個例子中是sigmoid函數,它描述了s形曲線。我們將輸入值乘以權值的總和傳入到神經元,將把它們轉換為在0到1之間的概率值,這一概率將有助於進行預測。


將直接在預測函數中使用sigmoid函數,它把輸入作為參數。為了得到輸入值乘以權值的總和,需要計算輸入值和權重值的標量積(矩陣乘法)。這就是權重值如何控制數據在神經網路中的流動並且返回預測結果。


3. 現在可以編寫訓練函數,這是代碼的核心。我們將編寫一個循環去迭代10000次,然後通過網路使用預測函數來傳遞訓練集獲取輸出值(預測值)。


接下來計算誤差(期望輸出和預期輸出之間的差值)。我們希望隨著不斷訓練來減少誤差,將通過迭代更新權值來實現這一點。我們要通過輸入值轉置矩陣乘以誤差,計算得出調整值,然後乘以sigmoid曲線的梯度值。因此對偏差越大的權重值調整越多。輸入值為0不會導致權重的更改,這個過程稱為梯度下降(gradient descent)。


我們還將編寫計算sigmoid導數的函數,導數給出了梯度或坡度,衡量我們對現有權重值的確信度,並幫助我們在正確的方向上更新預測。最後,一旦進行了調整,我們將用那個值更新權重值,這種將錯誤值反向傳播至網路並調整權重的過程,就叫做"反向傳播"。代碼和注釋如下:


fromnumpyimportexp, array, random, dot


classNeuralNetwork():


def__init__(self):


# seed生成的隨機數


# 確保每次程序運行時它會生成相同的數字

random.seed(1)


# 把隨機權重值分配給3*1的矩陣


# 權重值的範圍是- 1至1,平均值為0


# Sigmoid函數


# 把輸入權重值轉化為0到1的概率


def__sigmoid(self,x):


return1/(1+exp(-x))


# Sigmoid function的導函數


def__sigmoid_derivative(self,x):


returnx*(1-x)

# 通過試錯訓練神經網路


# 每次調整權重值


deftrain(self,training_set_inputs,training_set_outputs,number_of_training_iterations):


foriterationinxrange(number_of_training_iterations):


# 通過神經網路傳遞訓練值


output=self.think(training_set_inputs)


# 計算誤差


error=training_set_outputs-output


# 輸入值轉置矩陣乘以誤差得出調整值,然後乘以sigmoid的梯度值


# 偏差越大的權重值調整越多

# 輸入值為0不會導致權重的更改


adjustment=dot(training_set_inputs.T, error*self.__sigmoid_derivative(output))


# 調整權重


self.synaptic_weights+=adjustment


defthink(self,inputs):


returnself.__sigmoid(dot(inputs,self.synaptic_weights))


作為Rosenblatt的早期想法,以及在其隨後幾十年神經網路並沒有掀起大風大浪,只能完成簡單的事情。但隨著萬維網從CERN項目發展起來,到今天人類的大規模神經系統,我們看到了爆炸性的數據和計算能力。


我們的生物神經網路是基於碳的,而人工神經網路是一個抽象的概念,甚至不存在於物理空間,以編程的方式創建。然而,儘管是完全不同的載體,它們都具有非常相似的處理信息機制。也許有一個智能定律被編碼到我們的宇宙中並且雙方越來越接近。


神經網路是一個受生物學啟發的演算法,這個演算法在數據中學會識別模式。反向傳播是一門流行的技術,通過梯度下降不斷更新權值訓練神經網路。當我們在大量數據上訓練多層深度神經網路,使用大量的計算能力時,我們稱這個過程為深度學習。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 唯物 的精彩文章:

和比特幣關係最緊密的技術:區塊鏈原來是這麼玩的
官方博客:英偉達的新卡如何從硬體上支持了深度學習
Prisma 技術發展的前世今生

TAG:唯物 |

您可能感興趣

手把手教你用Python創建簡單的神經網路
從基礎概念到實現:入門PyTorch深度神經網路框架
NVIDIA也看上了RISC-V架構:融入深度神經網路加速器
PyTorch 60分鐘入門系列之神經網路
Yoshua Bengio團隊通過在網路「隱藏空間」中使用降噪器以提高深度神經網路的「魯棒性」
從零開始用 Python 構建神經網路
從AlexNet到MobileNet,帶你入門深度神經網路
python構造神經網路
單隱層BP神經網路的Python實現
讓手機神經網路速度翻倍:Facebook開源高性能內核庫QNNPACK
推薦!PlayGround:可視化神經網路
卷積神經網路時代要結束!AI教父Hinton的膠囊網路已開源
使用PyTorch從零開始構建Elman循環神經網路
開啟移動AI大門,解讀PowerVR第九代圖形、神經網路產品
谷歌YouTube推薦系統的深度神經網路應用
ICLR oral:清華提出離散化架構WAGE,神經網路訓練推理合二為一
Arteris IP和Synopsys促進神經網路和異構多核系統級晶元的優化
如何在 Scratch 中用 Python 構建神經網路
生物神經網路與機器學習的碰撞,Nature論文提出DNA試管網路識別手寫數字
谷歌 MorphNet:讓你的神經網路更小但更快