全文共2278字,預計學習時長6分鐘
圖源:Google
很長時間以來,我一直對構建神經網絡躍躍欲試,現在終於有機會來研究它了。我想我並沒有完全掌握神經網絡背後的數學原理,所以先教人工智慧做一些簡單的事情吧。
代碼原理
神經網絡並不是一個新概念,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): return1 / (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)) - 1for 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]))
我的第一個人工智慧已經準備就緒,隨時可以投入生產。即使它只能在極小的數據集上識別非常簡單的模式,但現在我們可以擴展它,例如,嘗試教授人工智慧識別圖片中的內容。學無止境,精進不休!
留言點讚關注
我們一起分享AI學習與發展的乾貨
如轉載,請後臺留言,遵守轉載規範