全文共2278字,預計學習時長6分鐘
很長時間以來,我一直對構建神經網路躍躍欲試,現在終於有機會來研究它了。我想我並沒有完全掌握神經網路背後的數學原理,所以先教人工智慧做一些簡單的事情吧。
程式碼原理
神經網路並不是一個新概念,1943年,由沃倫·麥卡洛克(WarrenMcCulloch)和沃爾特·皮茨(Walter Pitts)首次提出。
我們將構建一個沒有隱藏層或感知器的單層神經網路。它由一個包含訓練示例、突觸或權重以及神經元的輸入層和一個含有正確答案的輸出層組成。神經網路圖形如下所示:
此外,需要了解一些如sigmoid和導數之類的數學概念,以清楚神經元的學習方式。神經元只需進行簡單操作,即取一個輸入值,乘以突觸權重。之後,對所有這些乘法結果求和,並使用sigmoid函式獲得0到1內的輸出值。
神經元表示:
Sigmoid函式:
問題界定
輸入層上有數字序列。我們預期的理想結果是,在資料集樣本中,如果輸入第一個數字是1,則神經網路返回1;如果第一個數字是0,則返回0。結果在輸出層中顯示。問題集如下圖:
先決條件
開始編碼的前提——在概念上達到一定程度的理解。
NumPY安裝:
pip install numpy
安裝成功,即可進入編碼部分。首先,將NumPy匯入Python檔案中:
import numpy as np
訓練神經網路
首先,建立一個sigmoid函式:
其次,定義訓練示例、輸入(4×5矩陣)和輸出:
接下來,透過生成隨機值來初始化突觸權重,並將結果排列在4×1的矩陣中:
最後,構建訓練模型。使用for迴圈,所有的訓練都將在此迴圈中進行。呼叫sigmoid函式,並將所有輸入的總和乘以sigmoid權重。然後採用Np.dot進行矩陣乘法。過程如下圖:
輸出結果如下圖:
現在進行神經網路模型訓練,方法是計算sigmoid函式的輸出和實際輸出之間的差值。之後可以根據誤差的嚴重性調整權重。多次重複這個過程,比如說一萬次。定義sigmoid導數:
以下是計算和調整權重的方法:
開始學習,觀察學習時長會如何影響結果。從100次迭代開始:
開始情況比較樂觀——我們的人工智慧已經學會了識別模式,但錯誤率仍然居高不下。現在進行1000次迭代:
情況好轉,繼續進行10000次迭代:
10萬次迭代:
我們可以繼續更多次的學習迭代,但永遠無法達到100%的準確性,因為這需要進行無限次的計算。但即使在最壞的情況下,準確率也達到了99.77%,這相當不錯。
對於最終程式碼,我寫得很漂亮,並透過函式將其分開。除此之外,在文字檔案中,我還添加了一種非常複雜方法以儲存權重。這樣只需進行一次學習,而且需要使用AI時,只需匯入權重並利用sigmoid函式即可。
import numpy as npfrom tempfile import TemporaryFiledef sigmoid(x): return 1 / (1 + np.exp(-x))def sigmoid_der(x): return x * (1 - x)def training(): training_inputs = np.array([[0,0,1,0], [1,1,1,0], [1,0,1,0], [0,1,1,1], [0,1,0,1]]) trainign_outputs = np.array([[0,1,1,0,0]]).T np.random.seed(1) synaptic_weights = 2 * np.random.random((4,1)) - 1 for i in range(50000): inputs = training_inputs outputs = sigmoid(np.dot(inputs, synaptic_weights)) error = trainign_outputs - outputs adjustments = error * sigmoid_der(outputs) synaptic_weights += np.dot(inputs.T, adjustments) data_file = open("data.txt", "w") for row in synaptic_weights: np.savetxt(data_file, row) data_file.close()def thinking(inputs): synaptic_weights = np.loadtxt("data.txt").reshape(4, 1) outputs = sigmoid(np.dot(inputs, synaptic_weights)) print(outputs) return outputstraining()thinking(np.array([1,1,0,1]))
圖源:Pixabay
我的第一個人工智慧已經準備就緒,隨時可以投入生產。即使它只能在極小的資料集上識別非常簡單的模式,但現在我們可以擴充套件它,例如,嘗試教授人工智慧識別圖片中的內容。學無止境,精進不休!
我們一起分享AI學習與發展的乾貨