人工智慧 (11) 神經網路

Jason990420發表於2019-12-23

檔案建立日期: 2019/12/22
最後修訂日期: None
相關軟體資訊:

Win 10 Python 3.7.2 Matplotlib 3.1.1 neurolab 0.3.5 Numpy 1.17.3

參考檔案: AI with Python Tutorial

說明: 所有內容歡迎引用, 只需註明來源及作者, 本文內容如有錯誤或用詞不當, 敬請指正.

標題: 人工智慧 (11) 神經網路

神經網路 ( Neural Networks )

建立大腦計算機模型的平行計算裝置

  1. 人工神經網路(ANN, Artificial Neural Networks)
    從生物神經網路的類比中借鑑而來的,並行分散式處理系統和連線系統。
  2. 基於感知器的分類器
  3. 單層神經網路 - 由作用於輸入資料以產生輸出的獨立神經元組成。
  4. 多層神經網路 - 網路由一層以上的單層組成,以提取訓練資料中的基礎模式。 這種多層神經網路將像迴歸器一樣工作。

例 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()

人工智慧 (11) 神經網路

例 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])   # 模擬神經網路得到結果

人工智慧 (11) 神經網路

例 3. 多層神經網路

# -----------------------------------------------------------------------------
# Multi-Layer Neural Networks
# -----------------------------------------------------------------------------

import numpy as np
import matplotlib.pyplot as plt
import neurolab as nl

min_val     = -30                               # x = -30 ~ 30160點
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()

人工智慧 (11) 神經網路

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Jason Yang

相關文章