Python 提供了強大的工具和函式庫,方便我們建構和訓練神經網路模型。首先,我們需要定義神經網路的架構,包括輸入層、隱藏層和輸出層的神經元數量,並初始化權重和偏差。接著,我們實作前向傳播演算法,計算每個神經元的輸出值,並使用啟用函式引入非線性特性。為了訓練模型,我們需要定義損失函式來衡量預測值與真實值之間的差異,並使用反向傳播演算法計算梯度,更新權重和偏差以最小化損失。最後,我們可以使用訓練好的模型對新的資料進行預測,並評估模型的效能。
初始化環境
首先,我們需要匯入必要的函式庫:
import matplotlib.pyplot as plt
import numpy as np
定義啟用函式和其導數
接下來,我們定義啟用函式和其導數。在這個例子中,我們使用雙曲正切函式(tanh)作為啟用函式:
def tanh(x):
return (1.0 - np.exp(-2 * x)) / (1.0 + np.exp(-2 * x))
def tanh_derivative(x):
return (1 + tanh(x)) * (1 - tanh(x))
定義神經網路類別
現在,我們開始定義神經網路類別和其建構子:
class NeuralNetwork:
# net_arch 是一個列表,表示每層的單元數量
def __init__(self, net_arch):
self.activation_func = tanh
self.activation_derivative = tanh_derivative
self.layers = len(net_arch)
self.steps_per_epoch = 1000
# 初始化權重為隨機值,範圍在 (-1, 1)
self.weights = []
for layer in range(len(net_arch) - 1):
w = 2 * np.random.rand(net_arch[layer] + 1, net_arch[layer + 1]) - 1
self.weights.append(w)
內容解密:
在上面的程式碼中,我們首先定義了啟用函式和其導數。然後,我們定義了神經網路類別和其建構子。在建構子中,我們初始化了啟用函式、導數、層數、每個 epoch 的步數等屬性。同時,我們也初始化了權重為隨機值,範圍在 (-1, 1)。
Mermaid 圖表:
flowchart TD A[初始化環境] --> B[定義啟用函式和其導數] B --> C[定義神經網路類別] C --> D[初始化權重] D --> E[開始訓練]
圖表翻譯:
這個圖表展示了我們建立神經網路的步驟。首先,我們初始化環境,然後定義啟用函式和其導數。接下來,我們定義神經網路類別和初始化權重。最後,我們開始訓練神經網路。
在下一節中,我們將繼續實作神經網路的前向傳播和反向傳播演算法。同時,我們也會實作損失函式和最佳化器,以完成神經網路的訓練。
神經網路架構與訓練
神經網路是一種複雜的系統,能夠學習和記憶資料。下面是神經網路架構的實作:
import numpy as np
class NeuralNetwork:
def __init__(self, net_arch):
self.net_arch = net_arch
self.weights = []
for layer in range(len(net_arch) - 1):
w = np.random.uniform(-1, 1, (net_arch[layer] + 1, net_arch[layer + 1]))
self.weights.append(w)
在這個例子中,net_arch
是一維陣列,包含每層的單位數。例如,[2, 4, 1]
代表輸入層有兩個單位,隱藏層有四個單位,輸出層有一個單位。
訓練神經網路
要訓練神經網路,我們需要定義fit
方法:
def fit(self, data, labels, learning_rate=0.1, epochs=10):
bias = np.ones((1, data.shape[0]))
for k in range(epochs * self.steps_per_epoch):
print('epochs: {}'.format(k / self.steps_per_epoch))
for s in data:
print(s, self.predict(s))
sample = np.random.randint(data.shape[0])
y = [data[sample]]
for i in range(len(self.weights) - 1):
activation = np.dot(y[i], self.weights[i])
activation_f = self.activation_func(activation)
y.append(activation_f)
# calculate the last layer output and the error
在這個方法中,我們首先初始化偏差項bias
,然後進行迭代訓練。在每次迭代中,我們選擇一個隨機樣本,將其傳遞透過隱藏層,計算啟用函式和輸出。
內容解密:
上述程式碼中,np.random.uniform(-1, 1, (net_arch[layer] + 1, net_arch[layer + 1]))
用於初始化權重,np.ones((1, data.shape[0]))
用於初始化偏差項。np.dot(y[i], self.weights[i])
用於計算啟用函式,self.activation_func(activation)
用於計算啟用函式的輸出。
Mermaid 圖表
graph LR A[輸入層] --> B[隱藏層] B --> C[輸出層] C --> D[錯誤計算] D --> E[權重更新]
圖表翻譯:
這個圖表展示了神經網路的架構,包括輸入層、隱藏層、輸出層、錯誤計算和權重更新。輸入層接收輸入資料,隱藏層進行資料處理,輸出層產生輸出結果。錯誤計算用於計算預測結果和真實結果之間的差異,權重更新用於調整神經網路的權重以提高預測準確度。
神經網路訓練過程
在訓練神經網路的過程中,我們需要進行前向傳播(forward pass)和反向傳播(backward pass)。以下是訓練神經網路的步驟:
前向傳播
首先,我們需要計算輸出層的啟用值。假設 y
是輸出層的啟用值,self.weights
是權重矩陣,self.activation_func
是啟用函式。則:
activation = np.dot(y[-1], self.weights[-1])
activation_f = self.activation_func(activation)
y.append(activation_f)
反向傳播
接下來,我們需要計算輸出層的誤差。假設 labels
是真實標籤,sample
是樣本索引。則:
error = y[-1] - labels[sample]
delta_vec = [error * self.activation_derivative(y[-1])]
然後,我們需要將誤差反向傳播到隱藏層。假設 self.layers
是層數,self.weights
是權重矩陣,self.activation_derivative
是啟用函式的導數。則:
for i in range(self.layers - 2, 0, -1):
error = delta_vec[-1].dot(self.weights[i][1:].T)
error = error * self.activation_derivative(y[i][1:])
delta_vec.append(error)
最後,我們需要反轉誤差向量:
delta_vec.reverse()
更新權重
接下來,我們需要更新權重。假設 learning_rate
是學習率,layer
是層。則:
for i in range(len(self.weights)):
self.weights[i] -= learning_rate * layer.T.dot(delta)
預測函式
最後,我們需要實作預測函式,以便對輸入資料進行預測。預測函式傳回神經網路的輸出結果。
def predict(self, input_data):
# 前向傳播
y = [input_data]
for i in range(self.layers - 1):
activation = np.dot(y[-1], self.weights[i])
activation_f = self.activation_func(activation)
y.append(activation_f)
# 傳回輸出結果
return y[-1]
這樣就完成了神經網路的訓練過程和預測函式的實作。
神經網路預測與決策區域繪製
預測方法
神經網路的預測方法是透過對輸入資料進行一系列的計算和轉換,最終得到預測結果。這個過程可以透過以下步驟實作:
def predict(self, x):
# 對輸入資料進行轉換和計算
for i in range(0, len(self.weights)):
val = self.activation_func(
np.dot(val, self.weights[i])
)
val = np.array(val)
return val[1]
繪製決策區域
決策區域是指神經網路根據輸入資料進行預測的結果。這個結果可以透過繪製決策區域來視覺化。以下是繪製決策區域的步驟:
def plot_decision_regions(self, X, y, points=200):
# 定義標記和顏色
markers = ('o', '^')
colors = ('red', 'blue')
cmap = ListedColormap(colors)
# 取得輸入資料的範圍
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
# 取得決策區域的解析度
resolution = max(x1_max - x1_min, x2_max - x2_min) / float(points)
# 建立網格
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
np.arange(x2_min, x2_max, resolution))
# 對網格進行預測
input = np.array([xx1.ravel(), xx2.ravel()]).T
Z = np.empty(0)
內容解密:
在上面的程式碼中,我們首先定義了預測方法 predict
,這個方法對輸入資料進行了一系列的計算和轉換,最終得到預測結果。然後,我們定義了繪製決策區域的方法 plot_decision_regions
,這個方法首先定義了標記和顏色,然後取得輸入資料的範圍和決策區域的解析度。接著,我們建立了網格,並對網格進行預測,最終得到決策區域的結果。
圖表翻譯:
以下是決策區域的視覺化圖表:
flowchart TD A[輸入資料] --> B[預測方法] B --> C[決策區域] C --> D[視覺化] D --> E[結果]
在這個圖表中,我們可以看到輸入資料經過預測方法之後,得到決策區域的結果,最終得到視覺化的結果。這個圖表可以幫助我們更好地理解神經網路的預測過程和決策區域的視覺化。
內容解密:
上述程式碼片段主要用於視覺化二元分類別模型的決策邊界和樣本點。以下是逐步解說:
迴圈迭代:程式碼使用
for
迴圈來迭代輸入資料的每一行(input.shape[0]
)。對於每一行資料,程式碼會使用神經網路模型 (nn
) 進行預測,得到預測值val
。預測值處理:如果預測值
val
小於 0.5,則將其設定為 0;否則,如果val
大於或等於 0.5,則設定為 1。這是一種簡單的二元分類別閾值處理。結果儲存:處理後的預測值被追加到陣列
Z
中。最後,Z
被重塑以匹配xx1
的形狀,準備用於繪製決策邊界。繪製決策邊界:使用
plt.pcolormesh
函式來繪製決策邊界,xx1
和xx2
是網格的 x 和 y 座標,Z
是預測值,cmap
是色彩對映。設定繪圖範圍:使用
plt.xlim
和plt.ylim
函式來設定繪圖的 x 和 y 軸範圍,確保所有資料點都在視野中。繪製樣本點:程式碼接著繪製所有樣本點。它使用
np.unique(y)
來獲取類別標籤的唯一值,然後迭代這些類別。對於每一類別,程式碼使用plt.scatter
函式來繪製對應的樣本點,使用不同的顏色和標記來區分類別。增加軸標籤和圖例:最後,程式碼增加 x 軸標籤和圖例,以便更好地理解繪圖的含義。
這段程式碼展示瞭如何使用 Python 和 Matplotlib 函式庫來視覺化二元分類別模型的決策邊界和樣本點,提供了一種直觀的方式來理解模型的行為和資料的分佈。
圖表翻譯:
此圖表展示了二元分類別模型的決策邊界和樣本點的分佈。圖中,x 軸和 y 軸代表輸入資料的兩個維度,顏色代表預測的類別。決策邊界是根據模型的預測結果繪製的,樣本點的顏色和標記則代表其真實類別。這種視覺化方式可以幫助我們瞭解模型的效能和資料的特性,從而進行進一步的分析和改進。
flowchart TD A[資料預處理] --> B[模型訓練] B --> C[模型預測] C --> D[決策邊界繪製] D --> E[樣本點繪製] E --> F[圖表生成]
此流程圖描述了從資料預處理到圖表生成的整個過程,展示了二元分類別模型視覺化的步驟。
人工神經網路實作
在本文中,我們將實作一個簡單的神經網路,以解決XOR(異或)問題。XOR是一個基本的邏輯運算,輸入兩個布林值,輸出為true如果兩個輸入不同,否則為false。
神經網路架構
我們的神經網路將由三層組成:輸入層、隱藏層和輸出層。輸入層有兩個神經元,代表XOR的兩個輸入。隱藏層有兩個神經元,代表我們的神經網路的隱藏層。輸出層有一個神經元,代表XOR的輸出。
實作
import numpy as np
import matplotlib.pyplot as plt
class NeuralNetwork:
def __init__(self, layers):
self.layers = layers
self.weights = [np.random.rand(layers[i], layers[i+1]) for i in range(len(layers)-1)]
self.biases = [np.zeros((1, layers[i+1])) for i in range(len(layers)-1)]
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
return x * (1 - x)
def fit(self, X, y, epochs):
for _ in range(epochs):
for x, target in zip(X, y):
# 前向傳播
outputs = [x]
for i in range(len(self.layers) - 1):
output = self.sigmoid(np.dot(outputs[-1], self.weights[i]) + self.biases[i])
outputs.append(output)
# 反向傳播
errors = [target - outputs[-1]]
for i in range(len(self.layers) - 2, -1, -1):
error = errors[-1] * self.sigmoid_derivative(outputs[i+1])
errors.append(error)
# 更新權重和偏差
for i in range(len(self.layers) - 1):
self.weights[i] += 0.1 * np.dot(outputs[i].reshape(-1, 1), errors[-i-1].reshape(1, -1))
self.biases[i] += 0.1 * errors[-i-1]
def predict(self, x):
outputs = [x]
for i in range(len(self.layers) - 1):
output = self.sigmoid(np.dot(outputs[-1], self.weights[i]) + self.biases[i])
outputs.append(output)
return outputs[-1]
def plot_decision_regions(self, X, y):
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.xlabel('x1')
plt.ylabel('x2')
plt.legend(loc='upper left')
plt.show()
# 初始化神經網路
np.random.seed(0)
nn = NeuralNetwork([2, 2, 1])
# 定義訓練資料
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 1, 1, 0])
# 訓練神經網路
nn.fit(X, y, epochs=10)
# 預測
print("Final prediction")
for s in X:
print(s, nn.predict(s))
# 繪製決策區域
nn.plot_decision_regions(X, y)
結果
在上述程式碼中,我們實作了一個簡單的神經網路,以解決XOR問題。神經網路由三層組成:輸入層、隱藏層和輸出層。輸入層有兩個神經元,代表XOR的兩個輸入。隱藏層有兩個神經元,代表我們的神經網路的隱藏層。輸出層有一個神經元,代表XOR的輸出。
我們使用numpy.random.seed(0)來確保權重初始化的一致性,然後定義訓練資料和標籤。接著,我們訓練神經網路10個epoch,然後預測輸出。最後,我們繪製決策區域。
內容解密:
NeuralNetwork
類別:定義神經網路的架構和行為。sigmoid
方法:實作 sigmoid 啟用函式。sigmoid_derivative
方法:實作 sigmoid 啟用函式的導數。fit
方法:訓練神經網路。predict
方法:預測輸出。plot_decision_regions
方法:繪製決策區域。
圖表翻譯:
此圖示為決策區域的繪製,展示了神經網路的輸出結果。圖中,x 軸代表輸入 x1,y 軸代表輸入 x2。不同顏色的點代表不同類別的輸出結果。圖中還繪製了決策區域的邊界,展示了神經網路的分類別結果。
深度學習基礎
深度學習(Deep Learning,DL)是一種機器學習(Machine Learning,ML)技術,利用多層神經網路(Neural Networks,NNs)來學習和表示資料。深度學習的目的是讓機器能夠自動學習和理解資料的特徵和模式,從而實作高精確度的預測和分類別。
深度學習的基本概念
深度學習的基本概念包括:
- 多層神經網路:深度學習使用多層神經網路來學習和表示資料。每一層神經網路都可以學習到資料的不同特徵和模式。
- 特徵學習:深度學習可以自動學習到資料的特徵和模式,無需人工定義特徵。
- 分層表示:深度學習可以將資料表示為多個分層的特徵和模式,從而實作高精確度的預測和分類別。
深度學習的應用
深度學習的應用包括:
- 影像分類別:深度學習可以用於影像分類別,例如識別影像中的物體和場景。
- 語音識別:深度學習可以用於語音識別,例如識別語音中的單詞和句子。
- 自然語言處理:深度學習可以用於自然語言處理,例如文字分類別和情感分析。
深度學習的優點
深度學習的優點包括:
- 高精確度:深度學習可以實作高精確度的預測和分類別。
- 自動學習:深度學習可以自動學習到資料的特徵和模式,無需人工定義特徵。
- 分層表示:深度學習可以將資料表示為多個分層的特徵和模式,從而實作高精確度的預測和分類別。
深度學習的挑戰
深度學習的挑戰包括:
- 資料品質:深度學習需要高品質的資料來學習和表示。
- 計算資源:深度學習需要大量的計算資源來學習和表示資料。
- 過度擬合:深度學習容易過度擬合,需要正則化和早停來避免過度擬合。
圖表翻譯:
上述程式碼定義了一個簡單的神經網路,使用 PyTorch 框架。神經網路包含兩個全連線層(fc1 和 fc2),分別連線輸入層和輸出層。啟用函式使用 ReLU。損失函式使用交叉熵損失,最佳化器使用隨機梯度下降法。程式碼訓練了神經網路 10 個 epoch,輸出每個 epoch 的損失值。
graph LR A[輸入層] --> B[全連線層 fc1] B --> C[ReLU 啟用函式] C --> D[全連線層 fc2] D --> E[輸出層] E --> F[交叉熵損失] F --> G[隨機梯度下降法] G --> H[訓練神經網路]
深度學習基礎
深度學習(DL)是一種機器學習(ML)技術,能夠自動從資料中學習和提取特徵。與傳統的機器學習方法不同,深度學習不需要人工特徵工程,而是透過多層神經網路自動學習和提取特徵。
深度學習的優勢
深度學習具有多個優勢,包括:
- 自動特徵學習:深度學習可以自動從資料中學習和提取特徵,無需人工特徵工程。
- 高容量:深度學習模型可以處理大量的資料和特徵,從而實作更好的效能。
- 強大的表達能力:深度學習模型可以學習和表達複雜的資料關係和模式。
深度學習的應用
深度學習已經被廣泛應用於各個領域,包括:
- 電腦視覺:深度學習可以用於影像分類別、物體檢測、語音識別等電腦視覺任務。
- 自然語言處理:深度學習可以用於語言模型、文字分類別、情感分析等自然語言處理任務。
- 語音識別:深度學習可以用於語音識別、語音合成等語音相關任務。
深度神經網路
深度神經網路(DNN)是一種多層神經網路,可以用於深度學習任務。深度神經網路可以分為多種型別,包括:
- 多層感知器(MLP):是一種基本的深度神經網路,可以用於分類別和迴歸任務。
- 卷積神經網路(CNN):是一種特殊的深度神經網路,可以用於影像和語音相關任務。
- 迴圈神經網路(RNN):是一種特殊的深度神經網路,可以用於序列資料相關任務。
訓練深度神經網路
訓練深度神經網路需要大量的資料和計算資源。深度神經網路可以透過反向傳播和梯度下降演算法進行訓練。然而,訓練深度神經網路也面臨著多個挑戰,包括:
- 梯度消失:深度神經網路的梯度可能會消失,從而導致訓練過程中出現問題。
- 過擬合:深度神經網路可能會過擬合訓練資料,從而導致泛化效能不佳。
改進啟用函式
改進啟用函式可以幫助解決梯度消失和過擬合等問題。常用的啟用函式包括ReLU、Sigmoid和Tanh等。然而,這些啟用函式也存在著一些問題,例如Sigmoid函式的梯度可能會消失。
從技術架構視角來看,本文逐步闡述了建構和訓練基本神經網路的過程,涵蓋了從初始化環境、定義啟用函式、搭建網路層級到前向傳播、反向傳播及權重更新等關鍵步驟。程式碼範例清晰地展現了利用 Python 和 NumPy 構建神經網路的實作細節,同時輔以 Mermaid 圖表,有效地闡明瞭資料流程和網路架構。然而,範例程式碼目前僅涵蓋了基礎的神經網路架構和訓練過程,缺乏對更進階議題的探討,例如不同最佳化器的選擇、正則化技術的應用以及如何避免過擬合等。對於想深入理解神經網路的讀者,需要進一步探索這些進階主題。展望未來,隨著深度學習技術的持續發展,更高效的網路架構、更最佳化的訓練策略以及更廣泛的應用場景將不斷湧現。對於開發者而言,持續學習並掌握這些新技術將是保持競爭力的關鍵。玄貓認為,掌握這些基礎知識,並持續關注深度學習領域的最新進展,將有助於開發者更好地應對未來的挑戰。