反饋類神經網路在二元分類問題中的應用

甘果-avatar-img
發佈於程式
更新於 發佈於 閱讀時間約 10 分鐘

除了單變數及多變數的連續浮點運算問題以外,反饋類神經網路也可以運用在機器學習 (Machine Learning) 中的非線性分類問題上面;有關機器學習的題目,Python 其實有相當多的資源可以用來作為範例。首先,我們先安裝在「scikit-learn」這個經常使用程式庫工具。

pip install scikit-learn
  • 模型學習目標

我們可以在「scikit-learn」這個程式庫中使用「make_circles()」這個函數來建立一個二元分類的問題。在這個函數產生會產生多組座標的資料形成二個圓形,作為二元分類的例子;其中外圓形的資料會標記為「0」,而內圓形的資料則被標記為「1」。內圈資料與外圈資距離中心距離可以使用參數「factor」來指定;而資料的亂數散佈則使用參數「noise」來指定。資料產生之後,再使用「train_test_split()」函數將訓練資料及測試資料依照 「factor」指 的比例來作亂數分割。以下圖來說,藍色的點代表外圓形的訓練資料,綠色的點為外圓形的測試資料;紅色點代表內圓形的訓練資料,褐色點代表內圓形的測試資料。

raw-image



from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import matplotlib.colors as Color

noData = 1000
x, label = make_circles(noData,noise=0.05,factor=0.6, random_state=13)
x_train, x_test, y_train, y_test = train_test_split(x,label,test_size=0.2,random_state=13)

colorTrain=Color.ListedColormap(['blue','red'])
colorTest=Color.ListedColormap(['green','brown'])
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=colorTrain)
plt.scatter(x_test[:,0],x_test[:,1],c=y_test,cmap=colorTest)
plt.grid()
plt.show()
  • 轉換訓練資料

將「train_test_split()」的訓練資料轉換成 PyTorch/CUDA 使用的 tensor 資料型態。

import torch
X_train = torch.from_numpy(x_train.astype('float32')).to(device)
Y_train = torch.from_numpy(y_train.astype('float32')).unsqueeze(dim=1).to(device)
  • 建立類神經網路

在這裏仍然使用反饋類神經網路,並且創建一個 2 維度的類神經網路。

from torch import nn
device=torch.device('cpu')
if torch.cuda.is_available():
device=torch.device('cuda')
#------------
class classNeural(nn.Module):
def __init__(self,n_input,n_hidden,n_output):
super().__init__()
self.n_input=n_input
self.n_hidden=n_hidden
self.n_output=n_output
#--------
self.layer1=nn.Linear(n_input,n_hidden)
self.layer2=nn.Linear(n_hidden,n_output)
self.active=nn.Sigmoid()
#--------
def forward(self,x):
x=self.active(self.layer1(x))
return self.layer2(x)
#-------------
torch.manual_seed(13)
neural=classNeural(2,5,1).to(device)
loss_fn=nn.MSELoss() # MSE
optimizer=torch.optim.AdamW(neural.parameters(),lr=0.01)
  • 訓練類神經網路

反饋類神經網路的訓練與連續數的模型訓練並沒有不同;不過在最輸出預測值來觀察訓練誤差時,則加上「numpy.round()」函數,將類神經網路輸出的連續浮點數,轉換成「0」、「1」的二元分類數值。

raw-image


mae_y,mae_x=[],[]
for epoche in range(1500):
neural.train()
Y_pred=neural(X_train)
loss=loss_fn(Y_pred,Y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoche % 50 ==0:
neural.eval()
with torch.inference_mode():
Y_pred=neural(X_train)
y_pred=np.round(Y_pred.squeeze(dim=1).to('cpu').numpy())

mae_y.append(np.mean(np.abs(y_train-y_pred)))
mae_x.append(epoche)
#---------------
plt.plot(mae_x,mae_y,'b--')
plt.grid()
plt.ylabel('Mean Absolute Error')
plt.show()
  • 訓練及測試結果

最後可以將訓練資料及測試資料輪入訓練好的類神經網路。在訓練的部份,藍色圓代表外圓的訓練資料,黃色「X」代表預測外圓的結果;紅色圓代表內圓的訓練資料,黑色「X」代表預測內圓的結果。

raw-image


neural.eval()
with torch.inference_mode():
Y_pred=neural(X_train)
y_pred=np.round(Y_pred.squeeze(dim=1).to('cpu').numpy())
#---------------
colorPred=Color.ListedColormap(['yellow','black'])
plt.title('Training')
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=colorTrain,marker='o')
plt.scatter(x_train[:,0],x_train[:,1],c=y_pred,cmap=colorPred,marker='x',s=12)
plt.grid()
plt.show()

在測試的部份,藍色圓代表外圓的測試資料,這些資料並沒有參與到訓練的階段,但是類神經網路還是能來預測外圓的結果,而顯示在以黃色「X」的位置;同樣地,紅色圓代表內圓的測試資料,黑色「X」代表預測內圓的結果;可以看到以這個二元分類的問題來說,反饋類神經網路可以獲得相當完美的結果。

raw-image


neural.eval()
X_test=torch.from_numpy(x_test.astype('float32')).to(device)
with torch.inference_mode():
Y_pred=neural(X_test)
y_pred=np.round(Y_pred.squeeze(dim=1).to('cpu').numpy())
#--------------
mae=np.mean(np.abs(y_test-y_pred))
plt.title('Testing')
plt.scatter(x_test[:,0],x_test[:,1],c=y_test,cmap=colorTrain,marker='o')
plt.scatter(x_test[:,0],x_test[:,1],c=y_pred,cmap=colorPred,marker='x',s=12)

plt.grid()
plt.show()
留言
avatar-img
留言分享你的想法!
avatar-img
甘果的沙龍
4會員
25內容數
作者從國內主要的半導體公司退休,重回校園唸書;開始第三人生。分享退休投資規劃、科技產業經驗以及校園學習點滴。
甘果的沙龍的其他內容
2025/04/26
本文章說明如何在已安裝 Python 3.9 的 iMac mini 上設定 Python 虛擬環境,以及如何使用 venv 工具、安裝常用函式庫(如 numpy、pyTorch 等),並設定 Jupyter 連動不同 Python 虛擬環境。
Thumbnail
2025/04/26
本文章說明如何在已安裝 Python 3.9 的 iMac mini 上設定 Python 虛擬環境,以及如何使用 venv 工具、安裝常用函式庫(如 numpy、pyTorch 等),並設定 Jupyter 連動不同 Python 虛擬環境。
Thumbnail
2025/04/19
這篇文章說明如何在iMac mini M4上設定Jupyter Notebook作為遠端程式設計伺服器,方便使用iPad進行程式開發。文章涵蓋Jupyter Notebook的安裝、設定遠端連線以及建立可執行的shell script,讓伺服器能持續運作。
Thumbnail
2025/04/19
這篇文章說明如何在iMac mini M4上設定Jupyter Notebook作為遠端程式設計伺服器,方便使用iPad進行程式開發。文章涵蓋Jupyter Notebook的安裝、設定遠端連線以及建立可執行的shell script,讓伺服器能持續運作。
Thumbnail
2025/04/10
本文介紹如何將蘋果iMac mini作為CP值最高的人工智慧程式設計伺服器,搭配 iPad 進行遠端程式設計工作。文章說明瞭啟動遠端服務、連接SSH伺服器、使用外接硬碟及連接FTP伺服器等步驟,並推薦了相關應用 app。
Thumbnail
2025/04/10
本文介紹如何將蘋果iMac mini作為CP值最高的人工智慧程式設計伺服器,搭配 iPad 進行遠端程式設計工作。文章說明瞭啟動遠端服務、連接SSH伺服器、使用外接硬碟及連接FTP伺服器等步驟,並推薦了相關應用 app。
Thumbnail
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
Thumbnail
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
Thumbnail
在資料結構與演算法裡, 最簡單的線性資料結構除了list之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list 在這篇文章,會從最基礎的Singly linked list開始講起。 定義
Thumbnail
在資料結構與演算法裡, 最簡單的線性資料結構除了list之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list 在這篇文章,會從最基礎的Singly linked list開始講起。 定義
Thumbnail
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
Thumbnail
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
Thumbnail
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
Thumbnail
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
Thumbnail
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
Thumbnail
以一個雜魚測試工程師的角度來看int應用場景
Thumbnail
以一個雜魚測試工程師的角度來看int應用場景
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News