瞭解神經網路工作方式的最佳途徑莫過於親自建立一個神經網路,本文將演示如何做到這一點。
神經網路(NN)又稱人工神經網路(ANN),是機器學習領域中基於生物神經網路概念的學習演算法的一個子集。
擁有五年以上經驗的德國機器學習專家Andrey Bulezyuk聲稱:“神經網路正在徹底改變機器學習,因為它們能夠在廣泛的學科和行業中為抽象物件高效建模。”
人工神經網路基本上由以下元件組成:
輸入層:接收並傳遞資料
隱藏層
輸出層
各層之間的權重
每個隱藏層都有一個啟用函式。在這個簡單的神經網路Python教程中,我們將使用Sigmoid啟用函式。
神經網路有多種型別。在本專案中,我們將建立前饋或感知神經網路。這種型別的ANN直接將資料從前向後傳遞。
前饋神經元的訓練往往需要反向傳播,它為網路提供了相應的輸入和輸出集。當輸入資料被傳送到神經元時,經過處理後,產生一個輸出。
下面的圖表顯示了一個簡單的神經網路的結構:
瞭解神經網路如何工作的最佳方法是學習如何從頭開始構建神經網路(而不是採用任何庫)。
在本文中,我們將演示如何利用Python程式語言建立一個簡單的神經網路。
問題
如下是一個展示問題的表格。
我們將提供一個新的資料集,利用它訓練神經網路,從而能夠預測正確的輸出值。
正如上表所示,輸出值總是等於輸入部分中的第一個值。因此,我們期望輸出的值為1。
讓我們看看是否可以使用Python程式碼來得出相同的結果(你可以在本文末尾仔細閱讀這個專案的程式碼,然後再繼續閱讀本文)。
建立一個NeuralNetwork類
我們將用Python建立一個NeuralNetwork類來訓練神經元,以期給出準確的預測。這個類還會有其他的幫助函式。
即使我們不會在這個簡單的神經網路示例中使用神經網路庫,我們也將匯入numpy庫來輔助計算。
numpy庫提供了以下四種重要方法:
exp—用於生成自然指數
array—用於生成矩陣
dot—用於矩陣相乘
random—用於生成隨機數。請注意,我們將生成隨機數,以確保它們的有效分佈。
1. 應用Sigmoid函式
我們將使用Sigmoid函式,來繪製一個特徵“S”型曲線,作為神經網路的啟用函式。
此函式可以將任何值對映到0到1之間的值,它將有助於我們對輸入的加權和歸一化。
此後,我們將建立Sigmoid函式的導數,以幫助計算權重的調整引數。
可以利用Sigmoid函式的輸出來生成它的導數。例如,如果輸出變數為“x”,則其導數為x*(1-x)。
2. 訓練模型
這是我們教神經網路做出準確預測的階段。每個輸入都有一個權重-可為正值或負值。這意味著:有較大的正權重或負權重的輸入會對結果的輸出產生更大的影響。請記住,我們最初是透過為每個隨機數分配一個權重後開始的。
下面是這個神經網路示例的訓練過程:
第一步:從訓練資料集中提取輸入,根據訓練資料集的權重進行調整,並透過一種計算神經網路輸出的方法對其進行篩選。
第二步:計算反向傳播錯誤率。在這種情況下,它是神經元的預測輸出與訓練資料集的期望輸出之間的差異。
第三步:利用誤差加權導數公式,根據所得到的誤差範圍,進行了一些較小的權值調整。
第四步:對這一過程進行15000次迭代。在每次迭代中,整個訓練集被同時處理。
我們使用“.T”函式將矩陣從水平位置轉換為垂直位置。因此,數字將以如下方式儲存:
最終,神經元的權重將根據所提供的訓練資料進行最佳化。隨後,如果讓神經元考慮一個新的狀態,與先前的狀態相同,它便可以作出一個準確的預測。這就是反向傳播的方式。
打包執行
最後,NeuralNetwork類初始化成功後,可以執行程式碼了。
下面是如何在Python專案中建立神經網路的完整程式碼:
import numpy as np
class NeuralNetwork():
def __init__(self):
# seeding for random number generation
np.random.seed(1)
#converting weights to a 3 by 1 matrix with values from -1 to 1 and mean of 0
self.synaptic_weights = 2 * np.random.random((3, 1)) - 1
def sigmoid(self, x):
#applying the sigmoid function
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
#computing derivative to the Sigmoid function
return x * (1 - x)
def train(self, training_inputs, training_outputs, training_iterations):
#training the model to make accurate predictions while adjusting weights continually
for iteration in range(training_iterations):
#siphon the training data via the neuron
output = self.think(training_inputs)
#computing error rate for back-propagation
error = training_outputs - output
#performing weight adjustments
adjustments = np.dot(training_inputs.T, error * self.sigmoid_derivative(output))
self.synaptic_weights += adjustments
def think(self, inputs):
#passing the inputs via the neuron to get output
#converting values to floats
inputs = inputs.astype(float)
output = self.sigmoid(np.dot(inputs, self.synaptic_weights))
return output
if __name__ == "__main__":
#initializing the neuron class
neural_network = NeuralNetwork()
print("Beginning Randomly Generated Weights: ")
print(neural_network.synaptic_weights)
#training data consisting of 4 examples--3 input values and 1 output
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
#training taking place
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函式輸出值在0到1之間。
當然,在這個例子中,我們只使用一個神經元網路來完成簡單的任務。如果我們把幾千個人工神經網路連線在一起,情況將會是怎樣呢?我們能不能完全模仿人類的思維方式呢?
作者簡介:
Michael J.Garbade博士是洛杉磯區塊鏈教育公司(LiveEdu)的創始人和執行長。它是世界領先的教育培訓平臺,為學員培訓實用技能,以期在未來的技術領域(包括機器學習)創造完整的產品。
原文標題:
How to Create a Simple Neural Network in Python
原文連結:
https://www.kdnuggets.com/2018/10/simple-neural-network-python.html