神經(jīng)網(wǎng)絡(luò)是并行計(jì)算設(shè)備,它們試圖構(gòu)建大腦的計(jì)算機(jī)模型。 背后的主要目標(biāo)是開發(fā)一個(gè)系統(tǒng)來執(zhí)行各種計(jì)算任務(wù)比傳統(tǒng)系統(tǒng)更快。 這些任務(wù)包括模式識(shí)別和分類,近似,優(yōu)化和數(shù)據(jù)聚類。
人工神經(jīng)網(wǎng)絡(luò)(ANN)是一個(gè)高效的計(jì)算系統(tǒng),其核心主題是借用生物神經(jīng)網(wǎng)絡(luò)的類比。人工神經(jīng)網(wǎng)絡(luò)也被稱為人工神經(jīng)系統(tǒng),并行分布式處理系統(tǒng)和連接系統(tǒng)。 ANN獲取了大量以某種模式相互連接的單元,以允許它們之間的通信。這些單元也稱為節(jié)點(diǎn)或神經(jīng)元,是并行操作的簡單處理器。
每個(gè)神經(jīng)元通過連接鏈接與其他神經(jīng)元連接。每個(gè)連接鏈路與具有關(guān)于輸入信號(hào)的信息的權(quán)重相關(guān)聯(lián)。這是神經(jīng)元解決特定問題最有用的信息,因?yàn)轶w重通常會(huì)激發(fā)或抑制正在傳遞的信號(hào)。每個(gè)神經(jīng)元都有其內(nèi)部狀態(tài),稱為激活信號(hào)。在組合輸入信號(hào)和激活規(guī)則之后產(chǎn)生的輸出信號(hào)可以被發(fā)送到其他單元。
如果想詳細(xì)研究神經(jīng)網(wǎng)絡(luò),那么可以參考以下示例 - 人工神經(jīng)網(wǎng)絡(luò)。
在Python中創(chuàng)建神經(jīng)網(wǎng)絡(luò),可以使用一個(gè)強(qiáng)大的NeuroLab神經(jīng)網(wǎng)絡(luò)包。它是一個(gè)基本的神經(jīng)網(wǎng)絡(luò)算法庫,具有靈活的網(wǎng)絡(luò)配置和Python學(xué)習(xí)算法。可以在命令提示符下使用以下命令來安裝此軟件包 -
pip install NeuroLab
如果使用的是Anaconda環(huán)境,請使用以下命令安裝NeuroLab -
conda install -c labfabulous neurolab
在本節(jié)中,讓我們使用NeuroLab軟件包在Python中構(gòu)建一些神經(jīng)網(wǎng)絡(luò)。
感知器是ANN的基石。 如果您想了解更多關(guān)于Perceptron的信息,可以點(diǎn)擊鏈接 - artificial_neural_network
以下是逐步執(zhí)行Python代碼,用于構(gòu)建基于感知器的簡單神經(jīng)網(wǎng)絡(luò)分類器 -
如下所示導(dǎo)入必要的軟件包 -
import matplotlib.pyplot as plt
import neurolab as nl
請注意,這是一個(gè)監(jiān)督學(xué)習(xí)的例子,因此您也必須提供目標(biāo)值。
input = [[0, 0], [0, 1], [1, 0], [1, 1]]
target = [[0], [0], [0], [1]]
用2個(gè)輸入和1個(gè)神經(jīng)元?jiǎng)?chuàng)建網(wǎng)絡(luò) -
net = nl.net.newp([[0, 1],[0, 1]], 1)
現(xiàn)在,訓(xùn)練網(wǎng)絡(luò)。 在這里使用Delta規(guī)則進(jìn)行訓(xùn)練。
error_progress = net.train(input, target, epochs=100, show=10, lr=0.1)
接下來,可視化輸出并繪制圖表 -
plt.figure()
plt.plot(error_progress)
plt.xlabel('Number of epochs')
plt.ylabel('Training error')
plt.grid()
plt.show()
可以看到下圖顯示了使用錯(cuò)誤度量標(biāo)準(zhǔn)的訓(xùn)練進(jìn)度 -

在這個(gè)例子中,我們來創(chuàng)建一個(gè)單層神經(jīng)網(wǎng)絡(luò),它由獨(dú)立的神經(jīng)元組成,這些神經(jīng)元在輸入數(shù)據(jù)上起作用以產(chǎn)生輸出。 請注意,這里使用neural_simple.txt文件作為輸入。
如下所示導(dǎo)入所需的軟件包 -
import numpy as np
import matplotlib.pyplot as plt
import neurolab as nl
加載數(shù)據(jù)集如下代碼 -
input_data = np.loadtxt(“/Users/admin/neural_simple.txt')
以下是我們要使用的數(shù)據(jù)。 請注意,在此數(shù)據(jù)中,前兩列是特征,最后兩列是標(biāo)簽。
array([[2. , 4. , 0. , 0. ],
[1.5, 3.9, 0. , 0. ],
[2.2, 4.1, 0. , 0. ],
[1.9, 4.7, 0. , 0. ],
[5.4, 2.2, 0. , 1. ],
[4.3, 7.1, 0. , 1. ],
[5.8, 4.9, 0. , 1. ],
[6.5, 3.2, 0. , 1. ],
[3. , 2. , 1. , 0. ],
[2.5, 0.5, 1. , 0. ],
[3.5, 2.1, 1. , 0. ],
[2.9, 0.3, 1. , 0. ],
[6.5, 8.3, 1. , 1. ],
[3.2, 6.2, 1. , 1. ],
[4.9, 7.8, 1. , 1. ],
[2.1, 4.8, 1. , 1. ]])
現(xiàn)在,將這四列分成2個(gè)數(shù)據(jù)列和2個(gè)標(biāo)簽 -
data = input_data[:, 0:2]
labels = input_data[:, 2:]
使用以下命令繪制輸入數(shù)據(jù) -
plt.figure()
plt.scatter(data[:,0], data[:,1])
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.title('Input data')
現(xiàn)在,為每個(gè)維度定義最小值和最大值,如下所示 -
dim1_min, dim1_max = data[:,0].min(), data[:,0].max()
dim2_min, dim2_max = data[:,1].min(), data[:,1].max()
接下來,如下定義輸出層中神經(jīng)元的數(shù)量 -
nn_output_layer = labels.shape[1]
現(xiàn)在,定義一個(gè)單層神經(jīng)網(wǎng)絡(luò) -
dim1 = [dim1_min, dim1_max]
dim2 = [dim2_min, dim2_max]
neural_net = nl.net.newp([dim1, dim2], nn_output_layer)
訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時(shí)代數(shù)和學(xué)習(xí)率如下所示 -
error = neural_net.train(data, labels, epochs = 200, show = 20, lr = 0.01)
現(xiàn)在,使用以下命令可視化并繪制訓(xùn)練進(jìn)度 -
plt.figure()
plt.plot(error)
plt.xlabel('Number of epochs')
plt.ylabel('Training error')
plt.title('Training error progress')
plt.grid()
plt.show()
現(xiàn)在,使用上述分類器中的測試數(shù)據(jù)點(diǎn) -
print('\nTest Results:')
data_test = [[1.5, 3.2], [3.6, 1.7], [3.6, 5.7],[1.6, 3.9]] for item in data_test:
print(item, '-->', neural_net.sim([item])[0])
下面是測試結(jié)果 -
[1.5, 3.2] --> [1. 0.]
[3.6, 1.7] --> [1. 0.]
[3.6, 5.7] --> [1. 1.]
[1.6, 3.9] --> [1. 0.]
您可以看到迄今為止討論的代碼的輸出圖表 -


在這個(gè)例子中,我們創(chuàng)建了一個(gè)由多個(gè)層組成的多層神經(jīng)網(wǎng)絡(luò),以提取訓(xùn)練數(shù)據(jù)中的基礎(chǔ)模式。 這個(gè)多層神經(jīng)網(wǎng)絡(luò)將像一個(gè)回歸器一樣工作。 我們將根據(jù)下面等式生成一些數(shù)據(jù)點(diǎn):y = 2x2 + 8。
如下所示導(dǎo)入必要的軟件包 -
import numpy as np
import matplotlib.pyplot as plt
import neurolab as nl
根據(jù)上述公式生成一些數(shù)據(jù)點(diǎn) -
min_val = -30
max_val = 30
num_points = 160
x = np.linspace(min_val, max_val, num_points)
y = 2 * np.square(x) + 8
y /= np.linalg.norm(y)
現(xiàn)在,重塑這個(gè)數(shù)據(jù)集如下 -
data = x.reshape(num_points, 1)
labels = y.reshape(num_points, 1)
使用以下命令可視化并繪制輸入數(shù)據(jù)集 -
plt.figure()
plt.scatter(data, labels)
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.title('Data-points')
現(xiàn)在,構(gòu)建神經(jīng)網(wǎng)絡(luò),其具有兩個(gè)隱藏層,第一隱藏層中具有十個(gè)神經(jīng)元的神經(jīng)元,第二隱藏層中六個(gè),輸出層中一個(gè)神經(jīng)元。
neural_net = nl.net.newff([[min_val, max_val]], [10, 6, 1])
現(xiàn)在使用梯度訓(xùn)練算法 -
neural_net.trainf = nl.train.train_gd
現(xiàn)在訓(xùn)練網(wǎng)絡(luò)的目標(biāo)是學(xué)習(xí)上面生成的數(shù)據(jù) -
error = neural_net.train(data, labels, epochs = 1000, show = 100, goal = 0.01)
訓(xùn)練數(shù)據(jù)點(diǎn)上運(yùn)行神經(jīng)網(wǎng)絡(luò) -
output = neural_net.sim(data)
y_pred = output.reshape(num_points)
現(xiàn)在繪圖并可視化任務(wù) -
plt.figure()
plt.plot(error)
plt.xlabel('Number of epochs')
plt.ylabel('Error')
plt.title('Training error progress')
現(xiàn)在將繪制實(shí)際與預(yù)測輸出關(guān)系圖 -
x_dense = np.linspace(min_val, max_val, num_points * 2)
y_dense_pred = neural_net.sim(x_dense.reshape(x_dense.size,1)).reshape(x_dense.size)
plt.figure()
plt.plot(x_dense, y_dense_pred, '-', x, y, '.', x, y_pred, 'p')
plt.title('Actual vs predicted')
plt.show()
執(zhí)行上述代碼,您可以觀察如下所示的圖形 -


