一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

使用python創(chuàng)建自己的第一個(gè)神經(jīng)網(wǎng)絡(luò)模型吧!

 niudp 2018-10-05

摘要: 對(duì)神經(jīng)網(wǎng)絡(luò)的工作原理感到好奇?動(dòng)手實(shí)踐一下吧,了解神經(jīng)網(wǎng)絡(luò)是如何工作的最好方法是自己創(chuàng)建一個(gè)簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)。

神經(jīng)網(wǎng)絡(luò)(NN),也被稱為人工神經(jīng)網(wǎng)絡(luò)(ANN),是機(jī)器學(xué)習(xí)領(lǐng)域中學(xué)習(xí)算法的子集,大體上借鑒了生物神經(jīng)網(wǎng)絡(luò)的概念。目前,神經(jīng)網(wǎng)絡(luò)在計(jì)算機(jī)視覺(jué)、自然語(yǔ)言處理等領(lǐng)域應(yīng)用廣泛。德國(guó)資深機(jī)器學(xué)習(xí)專家Andrey Bulezyuk說(shuō)到,“神經(jīng)網(wǎng)絡(luò)正在徹底改變機(jī)器學(xué)習(xí),因?yàn)樗鼈兡軌蛴行У啬M各種學(xué)科和行業(yè)的復(fù)雜抽象,且無(wú)需太多人工參與。”

大體上,人工神經(jīng)網(wǎng)絡(luò)基本包含以下組件:

  • 接收數(shù)據(jù)并傳遞數(shù)據(jù)的輸入層(input layer);
  • 隱藏層(hidden layer);
  • 輸出層(output layer);
  • 層與層之間的權(quán)重(weight);
  • 每個(gè)隱藏層使用的激活函數(shù)(activation function);

在本文教程中,使用的是簡(jiǎn)單的Sigmoid激活函數(shù),但注意一點(diǎn),在深層神經(jīng)網(wǎng)絡(luò)模型中, sigmoid激活函數(shù)一般不作為首選,原因是其易發(fā)生梯度彌散現(xiàn)象。

此外,人工神經(jīng)網(wǎng)絡(luò)有幾種不同類型的神經(jīng)網(wǎng)絡(luò),比如前饋神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)及遞歸神經(jīng)網(wǎng)絡(luò)等。本文將以簡(jiǎn)單的前饋或感知神經(jīng)網(wǎng)絡(luò)為例,這種類型的人工神經(jīng)網(wǎng)絡(luò)是直接從前到后傳遞數(shù)據(jù)的,簡(jiǎn)稱前向傳播過(guò)程。

而訓(xùn)練前饋神經(jīng)元通常需要反向傳播算法,這就需要為網(wǎng)絡(luò)提供相應(yīng)的輸入和輸出集。當(dāng)輸入數(shù)據(jù)被傳輸?shù)缴窠?jīng)元時(shí),它會(huì)經(jīng)過(guò)相應(yīng)的處理,并將產(chǎn)生的輸出傳輸給下一層。

下圖簡(jiǎn)單展示了一個(gè)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu):


使用python創(chuàng)建自己的第一個(gè)神經(jīng)網(wǎng)絡(luò)模型吧!


此外,理解神經(jīng)網(wǎng)絡(luò)如何工作的最好方法是學(xué)習(xí)如何在不使用任何工具箱的前提下從頭開(kāi)始構(gòu)建一個(gè)。在本文中,我們將演示如何使用Python創(chuàng)建一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)。

問(wèn)題

下標(biāo)顯示了我們將解決的問(wèn)題:


使用python創(chuàng)建自己的第一個(gè)神經(jīng)網(wǎng)絡(luò)模型吧!


我們將訓(xùn)練神經(jīng)網(wǎng)絡(luò),以便在提供一組新數(shù)據(jù)時(shí)可以預(yù)測(cè)出正確的輸出值。

從表中看到,輸出的值始終等于輸入節(jié)中的第一個(gè)值。因此,我們可以期望新情形的輸出(?)值為1。

下面讓我們看看是否可以使用一些Python代碼來(lái)得到相同的結(jié)果。

創(chuàng)建神經(jīng)網(wǎng)絡(luò)類|NeuralNetwork Class

我們將在Python中創(chuàng)建一個(gè)NeuralNetwork類來(lái)訓(xùn)練神經(jīng)元以提供準(zhǔn)確的預(yù)測(cè),該類還包含其他輔助函數(shù)。我們不會(huì)將神經(jīng)網(wǎng)絡(luò)庫(kù)用于創(chuàng)建這個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)示例中,但會(huì)導(dǎo)入基本的Numpy庫(kù)來(lái)協(xié)助計(jì)算。

Numpy庫(kù)是處理數(shù)據(jù)的一種基本庫(kù),它具有以下四種重要的計(jì)算方法:

  • EXP——用于產(chǎn)生所述自然指數(shù);
  • array——用于生成矩陣;
  • dot——用于矩陣相乘;
  • random——用于生成隨機(jī)數(shù);

應(yīng)用Sigmoid函數(shù)

我們將使用Sigmoid函數(shù),它繪制出一個(gè)“S”形曲線,將其作為本文創(chuàng)建的神經(jīng)網(wǎng)絡(luò)的激活函數(shù)。


使用python創(chuàng)建自己的第一個(gè)神經(jīng)網(wǎng)絡(luò)模型吧!


此函數(shù)可以將任何值映射到0到1之間,并能幫助我們規(guī)范化輸入的加權(quán)和。

此后,我們將創(chuàng)建Sigmoid函數(shù)的導(dǎo)數(shù),以幫助計(jì)算權(quán)重的基本調(diào)整。

可以使用Sigmoid函數(shù)的輸出來(lái)生成其導(dǎo)數(shù)。例如,如果輸出變量是“x”,那么它的導(dǎo)數(shù)將是x *(1-x)。

訓(xùn)練模型

訓(xùn)練模型意味著我們將教導(dǎo)神經(jīng)網(wǎng)絡(luò)進(jìn)行準(zhǔn)確預(yù)測(cè)的階段。每個(gè)輸入都有一個(gè)權(quán)重(weights)——正或負(fù)的,這意味著具有大值正權(quán)重或大值負(fù)權(quán)重的輸入將多所得到的輸出有更大地影響。

注意,模型訓(xùn)練最初時(shí),每個(gè)權(quán)重的初始化都是隨機(jī)數(shù)。

以下是本文構(gòu)建的神經(jīng)網(wǎng)絡(luò)示例問(wèn)題中訓(xùn)練過(guò)程:

  • 1.從訓(xùn)練數(shù)據(jù)集中獲取輸入,根據(jù)它們的權(quán)重進(jìn)行一些調(diào)整,并通過(guò)計(jì)算神經(jīng)網(wǎng)絡(luò)輸出的方法來(lái)一層一層的傳輸;
  • 2.計(jì)算反向傳播的錯(cuò)誤率。在這種情況下,它是神經(jīng)元預(yù)測(cè)得到的輸出與訓(xùn)練數(shù)據(jù)集的預(yù)期輸出之間的誤差;
  • 3.根據(jù)得到的誤差范圍,使用誤差加權(quán)導(dǎo)數(shù)公式進(jìn)行一些小的權(quán)重調(diào)整;
  • 4.將此過(guò)程重復(fù)15,000次,在每次迭代過(guò)程中,同時(shí)處理整個(gè)訓(xùn)練集;

在這里,我們使用“.T”函數(shù)對(duì)矩陣求偏置。因此,數(shù)字將以這種方式存儲(chǔ):


使用python創(chuàng)建自己的第一個(gè)神經(jīng)網(wǎng)絡(luò)模型吧!


最終,神經(jīng)元的權(quán)重將針對(duì)所提供的訓(xùn)練數(shù)據(jù)進(jìn)行優(yōu)化。因此,如果神經(jīng)網(wǎng)絡(luò)的輸出與期望的輸出一致時(shí),說(shuō)明訓(xùn)練完成,可以進(jìn)行準(zhǔn)確的預(yù)測(cè),這就是反向傳播的方式。

封裝

最后,初始化NeuralNetwork類后并運(yùn)行整個(gè)程序,以下是如何在Python項(xiàng)目中創(chuàng)建神經(jīng)網(wǎng)絡(luò)的完整代碼:

import numpy as npclass NeuralNetwork(): def __init__(self): # 設(shè)置隨機(jī)數(shù)種子 np.random.seed(1) # 將權(quán)重轉(zhuǎn)化為一個(gè)3x1的矩陣,其值分布為-1~1,并且均值為0 self.synaptic_weights = 2 * np.random.random((3, 1)) - 1 def sigmoid(self, x): # 應(yīng)用sigmoid激活函數(shù) return 1 / (1 + np.exp(-x)) def sigmoid_derivative(self, x): #計(jì)算Sigmoid函數(shù)的偏導(dǎo)數(shù) return x * (1 - x) def train(self, training_inputs, training_outputs, training_iterations): # 訓(xùn)練模型 for iteration in range(training_iterations): # 得到輸出 output = self.think(training_inputs) # 計(jì)算誤差 error = training_outputs - output # 微調(diào)權(quán)重 adjustments = np.dot(training_inputs.T, error * self.sigmoid_derivative(output)) self.synaptic_weights += adjustments def think(self, inputs): # 輸入通過(guò)網(wǎng)絡(luò)得到輸出 # 轉(zhuǎn)化為浮點(diǎn)型數(shù)據(jù)類型 inputs = inputs.astype(float) output = self.sigmoid(np.dot(inputs, self.synaptic_weights)) return outputif __name__ == '__main__': # 初始化神經(jīng)類 neural_network = NeuralNetwork() print('Beginning Randomly Generated Weights: ') print(neural_network.synaptic_weights) #訓(xùn)練數(shù)據(jù) training_inputs = np.array([[0,0,1], [1,1,1], [1,0,1], [0,1,1]]) training_outputs = np.array([[0,1,1,0]]).T # 開(kāi)始訓(xùn)練 neural_network.train(training_inputs, training_outputs, 15000) print('Ending Weights After Training: ') print(neural_network.synaptic_weights) user_input_one = str(input('User Input One: ')) user_input_two = str(input('User Input Two: ')) user_input_three = str(input('User Input Three: ')) print('Considering New Situation: ', user_input_one, user_input_two, user_input_three) print('New Output data: ') print(neural_network.think(np.array([user_input_one, user_input_two, user_input_three]))) print('Wow, we did it!')

以下是運(yùn)行代碼后產(chǎn)生的輸出:

使用python創(chuàng)建自己的第一個(gè)神經(jīng)網(wǎng)絡(luò)模型吧!

以上是我們?cè)O(shè)法創(chuàng)建的一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)。首先神經(jīng)網(wǎng)絡(luò)開(kāi)始為自己分配一些隨機(jī)權(quán),此后,它使用訓(xùn)練樣例訓(xùn)練自身。

因此,如果出現(xiàn)新的樣本輸入[1,0,0],則其輸出值為0.9999584。而期望的的正確答案是1,可以說(shuō)二者是非常接近了,考慮到Sigmoid函數(shù)是非線性函數(shù),這點(diǎn)誤差是可以接受的。

此外,本文只使用了一層神經(jīng)網(wǎng)絡(luò)來(lái)執(zhí)行簡(jiǎn)單的任務(wù)。如果我們將數(shù)千個(gè)這些人工神經(jīng)網(wǎng)絡(luò)集合在一起會(huì)發(fā)生什么情況呢?我們可以100%模仿人類思維嗎?答案是肯定的,但是目前實(shí)現(xiàn)起來(lái)是比較困難的,只能說(shuō)是十分相近。對(duì)此感興趣的讀者可以閱讀與深度學(xué)習(xí)相關(guān)的資料。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产老女人性生活视频| 91亚洲精品亚洲国产| 夫妻性生活动态图视频| 亚洲视频在线观看免费中文字幕| 国产日韩综合一区在线观看| 国产一区二区三区丝袜不卡 | 富婆又大又白又丰满又紧又硬| 国产精品伦一区二区三区四季| 绝望的校花花间淫事2| 欧美一区二区三区在线播放| 国产午夜在线精品视频| 亚洲熟女诱惑一区二区| 婷婷色国产精品视频一区| 国产成人精品久久二区二区| 国产真人无遮挡免费视频一区| 日韩av亚洲一区二区三区| 午夜亚洲少妇福利诱惑| 91麻豆精品欧美视频| 久久偷拍视频免费观看| 在线观看视频日韩成人| 欧美六区视频在线观看| 日本 一区二区 在线| 午夜精品一区免费视频| 午夜国产精品国自产拍av| 91欧美一区二区三区成人| 精品视频一区二区三区不卡| 久久99一本色道亚洲精品| 都市激情小说在线一区二区三区| 欧美成人免费夜夜黄啪啪| 视频一区中文字幕日韩| 亚洲男人的天堂就去爱| 亚洲最新的黄色录像在线| 人妻偷人精品一区二区三区不卡| 欧美色婷婷综合狠狠爱| 91欧美一区二区三区| 欧美亚洲另类久久久精品| 日韩综合国产欧美一区| 亚洲av日韩一区二区三区四区| 福利视频一区二区在线| 国产精品伦一区二区三区四季| 国产成人精品一区二三区在线观看|