摘要:對神經網路的工作原理感到好奇?動手實踐一下吧,了解神經網路是如何工作的最好方法是自己建立乙個簡單神經網路。神經網路(nn),也被稱為人工神經網路(ann),是機器學習領域中學習演算法的子集,大體上借鑑了生物神經網路的概念。目前,神經網路在計算機視覺、自然語言處理等領域應用廣泛。德國資深機器學習專家andrey bulezyuk說到,「神經網路正在徹底改變機器學習,因為它們能夠有效地模擬各種學科和行業的複雜抽象,且無需太多人工參與。」
大體上,人工神經網路基本包含以下元件:
在本文教程中,使用的是簡單的sigmoid啟用函式,但注意一點,在深層神經網路模型中, sigmoid啟用函式一般不作為首選,原因是其易發生梯度瀰散現象。
此外,人工神經網路有幾種不同型別的神經網路,比如前饋神經網路、卷積神經網路及遞迴神經網路等。本文將以簡單的前饋或感知神經網路為例,這種型別的人工神經網路是直接從前到後傳遞資料的,簡稱前向傳播過程。
而訓練前饋神經元通常需要反向傳播演算法,這就需要為網路提供相應的輸入和輸出集。當輸入資料被傳輸到神經元時,它會經過相應的處理,並將產生的輸出傳輸給下一層。
下圖簡單展示了乙個神經網路結構:
此外,理解神經網路如何工作的最好方法是學習如何在不使用任何工具箱的前提下從頭開始構建乙個。在本文中,我們將演示如何使用python建立乙個簡單的神經網路。
下表顯示了我們將解決的問題:
我們將訓練神經網路,以便在提供一組新資料時可以**出正確的輸出值。
從表中看到,輸出的值始終等於輸入節中的第乙個值。因此,我們可以期望新情形的輸出(?)值為1。
下面讓我們看看是否可以使用一些python**來得到相同的結果。
我們將在python中建立乙個neuralnetwork類來訓練神經元以提供準確的**,該類還包含其他輔助函式。我們不會將神經網路庫用於建立這個簡單的神經網路示例中,但會匯入基本的numpy庫來協助計算。
numpy庫是處理資料的一種基本庫,它具有以下四種重要的計算方法:
我們將使用sigmoid函式,它繪製出乙個「s」形曲線,將其作為本文建立的神經網路的啟用函式。
此函式可以將任何值對映到0到1之間,並能幫助我們規範化輸入的加權和。
此後,我們將建立sigmoid函式的導數,以幫助計算權重的基本調整。
可以使用sigmoid函式的輸出來生成其導數。例如,如果輸出變數是「x」,那麼它的導數將是x *(1-x)。
訓練模型意味著我們將教導神經網路進行準確**的階段。每個輸入都有乙個權重(weights)——正或負的,這意味著具有大值正權重或大值負權重的輸入將多所得到的輸出有更大地影響。
在這裡,我們使用「.t」函式對矩陣求偏置。因此,數字將以這種方式儲存:
最終,神經元的權重將針對所提供的訓練資料進行優化。因此,如果神經網路的輸出與期望的輸出一致時,說明訓練完成,可以進行準確的**,這就是反向傳播的方式。
最後,初始化neuralnetwork類後並執行整個程式,以下是如何在python專案中建立神經網路的完整**:
import numpy as np
class neuralnetwork():
def __init__(self):
# 設定隨機數種子
np.random.seed(1)
# 將權重轉化為乙個3x1的矩陣,其值分布為-1~1,並且均值為0
self.synaptic_weights = 2 * np.random.random((3, 1)) - 1
def sigmoid(self, x):
# 應用sigmoid啟用函式
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
#計算sigmoid函式的偏導數
return x * (1 - x)
def train(self, training_inputs, training_outputs, training_iterations):
# 訓練模型
for iteration in range(training_iterations):
# 得到輸出
output = self.think(training_inputs)
# 計算誤差
error = training_outputs - output
# 微調權重
adjustments = np.dot(training_inputs.t, error * self.sigmoid_derivative(output))
self.synaptic_weights += adjustments
def think(self, inputs):
# 輸入通過網路得到輸出
# 轉化為浮點型資料型別
inputs = inputs.astype(float)
output = self.sigmoid(np.dot(inputs, self.synaptic_weights))
return output
if __name__ == "__main__":
# 初始化神經類
neural_network = neuralnetwork()
print("beginning randomly generated weights: ")
print(neural_network.synaptic_weights)
#訓練資料
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
# 開始訓練
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!")
以下是執行**後產生的輸出:
以上是我們設法建立的乙個簡單的神經網路。首先神經網路開始為自己分配一些隨機權,此後,它使用訓練樣例訓練自身。
因此,如果出現新的樣本輸入[1,0,0],則其輸出值為0.9999584。而期望的的正確答案是1,可以說二者是非常接近了,考慮到sigmoid函式是非線性函式,這點誤差是可以接受的。
此外,本文只使用了一層神經網路來執行簡單的任務。如果我們將數千個這些人工神經網路集合在一起會發生什麼情況呢?我們可以100%模仿人類思維嗎?答案是肯定的,但是目前實現起來是比較困難的,只能說是十分相近。對此感興趣的讀者可以閱讀與深度學習相關的資料。
閱讀原文
使用Python建立自己的Instagram濾鏡
不知道你有沒有使用過instagram濾鏡,它們非常方便,只需單擊幾個按鈕,就可以變換我要發布的 你是否想過自己可以建立乙個?答案是可以的!在本文中,我將向你展示如何使用 和示例影象來建立一些影象處理濾鏡。如果尚未安裝以下python庫,則需要安裝它 建立高斯濾波器 kernel x cv2.get...
如何建立自己的第乙個gem
1 使用bundle gem hhg10建立乙個名為hhg10的資料夾 2 修改檔案為hhg10.gemsepc檔案。在相應的lib hhg10下完成相關功能的rb檔案寫 3 執行打包gem build hhg10.gemspec 會出現success built rubygem字眼成功 接下來就是...
建立自己的第乙個Vue專案
1,需要安裝nodejs,並且npm 版本需要大於 3.0 我的已經安裝過了,檢查一下版本 2,全部安裝vue cli 檢視vue cli是否成功,vue v v必須是大寫的 3,建立專案,首先進入到專案目錄下,然後執行下面的命令 vue init webpack 專案名稱 裡面的參考 4,啟動專案...