首頁>科技>

全文共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學習與發展的乾貨

9
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 如何設計自己的第一個加密交易機器人?