檔案建立日期: 2019/12/22
最後修訂日期: None
相關軟體資訊:
| Windows 10 | Python 3.7.2 | matplotlib 3.1.1 | neurolab 0.3.5 | numpy 1.17.3 |
參考檔案: AI with Python Tutorial
說明: 所有內容歡迎引用, 只需註明來源及作者, 本文內容如有錯誤或用詞不當, 敬請指正.
標題: 人工智慧 (11) 神經網路
神經網路 ( Neural Networks )
建立大腦計算機模型的平行計算裝置
- 人工神經網路(ANN, Artificial Neural Networks)
從生物神經網路的類比中借鑑而來的,並行分散式處理系統和連線系統。 - 基於感知器的分類器
- 單層神經網路 - 由作用於輸入資料以產生輸出的獨立神經元組成。
- 多層神經網路 - 網路由一層以上的單層組成,以提取訓練資料中的基礎模式。 這種多層神經網路將像迴歸器一樣工作。
例 1. 基於感知器的分類器
# -----------------------------------------------------------------------------
# Perceptron based Classifier
# -----------------------------------------------------------------------------
import matplotlib.pyplot as plt
import neurolab as nl
input = [[0, 0], [0, 1], [1, 0], [1, 1]]
target = [[0], [0], [0], [1]]
# 建立一層的感知器
# 輸入神經元的數量為 2, 兩個的最小值都是0, 最大值都是1, 神經元數為1
# 預設啟用函式為硬限制傳遞函式 ( Hard limit transfer function )
# 硬限制傳遞函式 - 大於0, 輸出1, 小於等於0, 輸出0
net = nl.net.newp([[0, 1],[0, 1]], 1)
# 訓練100次, 每10次顯示結果, 學習率為0.1, 使用誤差規則 ( Delta Rule )
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()
例 2. 單層神經網路
# -----------------------------------------------------------------------------
# Single-Layer Neural Networks
# -----------------------------------------------------------------------------
import numpy as np
import matplotlib.pyplot as plt
import neurolab as nl
# 每筆資料的前兩個為特性, 後兩個為標籤
input_data = np.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. ]])
data = input_data[:, :2]
labels = input_data[:, 2:]
dim1 = [data[:,0].min(), data[:,0].max()] # 取出各特性的最大, 最小值
dim2 = [data[:,1].min(), data[:,1].max()]
nn_output_layer = labels.shape[1] # 標籤的數目作為輸出層
# 建立一層的感知器
# 輸入神經元的數量為 2, 神經元數為標籤的數目
neural_net = nl.net.newp([dim1, dim2], nn_output_layer)
# 訓練200次, 每20次顯示結果, 學習率為0.01, 使用誤差規則 ( Delta Rule )
error = neural_net.train(data, labels, epochs=200, show=20, lr=0.01)
plt.figure() # 畫出訓練過程中的誤差指數
plt.plot(error)
plt.xlabel('Number of epochs')
plt.ylabel('Training error')
plt.title('Training error progress')
plt.grid()
plt.show()
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]) # 模擬神經網路得到結果
例 3. 多層神經網路
# -----------------------------------------------------------------------------
# Multi-Layer Neural Networks
# -----------------------------------------------------------------------------
import numpy as np
import matplotlib.pyplot as plt
import neurolab as nl
min_val = -30 # x = -30 ~ 30 取160點
max_val = 30
num_points = 160
x = np.linspace(min_val, max_val, num_points)
y = 2 * np.square(x) + 8 # y = 2x^2 + 8
y /= np.linalg.norm(y) # y = y / (y的平方和再開根號)
data = x.reshape(num_points, 1) # reshape作為輸入
labels = y.reshape(num_points, 1)
plt.figure(figsize=(18, 8))
plt.subplot(131) # 畫輸入資料 x, y
plt.scatter(data, labels)
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.title('Data-points')
# 建立多層的感知器, 兩固輸入, 各層神經原數量為 10, 6, 1.
neural_net = nl.net.newff([[min_val, max_val]], [10, 6, 1])
# 感知器的訓練模型設定為nl.train.train_gd函式 ( 梯度下降反向傳播 )
neural_net.trainf = nl.train.train_gd
# 訓練1000次, 每100次顯示結果, 目標為 0.01
error = neural_net.train(data, labels, epochs=1000, show=100, goal=0.01)
# 按輸入資料, 估算結果
output = neural_net.sim(data)
y_pred = output.reshape(num_points)
plt.subplot(132) # 畫預估圖
plt.plot(error)
plt.xlabel('Number of epochs')
plt.ylabel('Error')
plt.title('Training error progress')
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.subplot(133) # # 點數加倍, 重新畫圖
plt.plot(x_dense, y_dense_pred, '-', x, y, '.', x, y_pred, 'p')
plt.title('Actual vs predicted')
plt.tight_layout()
plt.show()