使用 PyTorch 實現反饋類神經網路程式撰寫的指南

甘果-avatar-img
發佈於程式
更新 發佈閱讀 13 分鐘

透過 PyTorch 這個工具程式庫,相對於過往直接由類神經網路公式來撰寫程式,可以大量減少撰寫的時間以及錯誤;更重要的是,可以透過 PyTorch,很輕易地使用 CUDA 來驅動多核 GPU 的運算能力。目前,多核 GPU 運算幾乎是近十年來標準的人工智慧程式開發及研究的方式。

  • 模型學習目標

首先,先就一個單變數的反饋類神經網路 (backpropagation neural network) 來進行簡單的「墨西哥帽」模型學習;這個模型可以繪出如下:

raw-image

資料的產出可以用簡單的 python 程式來執行。

import numpy as np
import matplotlib.pyplot as plt
x=np.arange(-2*np.pi,2*np.pi,0.1)
y=np.sin(x)*x
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x,y,'b.')
plt.grid()
plt.show()
  • 在 PyTorch 客製類神經網路類別

接下來開始依照 PyTorch 的方式建立類神經網路;首先必須要繼承「torch.nn」的類別原型,然後定義類神經網路的結構以及激發函數,接來來在「forward()」這個函數中,填入類神經網路中層與層之間的關係;這樣就完成了一個常用的「反饋類神經網路」的類別了。

import torch
from torch import nn
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.nn」可以接受的「二維 tensor」型態,所以單變數的訓練資料陣列,轉換成 tensor 之後,要再利用「unsqueeze(dim=1)」增加一個空白的維度;同時,因為 torch.nn 所使用的浮點運算為了計算速度的考量,通常會使用「float32」,而非 numpy default 使用的「float64」,所以也一併在這個階段加入。

#-----------------
X_train=torch.tensor(x.astype('float32')).unsqueeze(dim=1)
Y_train=torch.tensor(y.astype('float32')).unsqueeze(dim=1)
#-----------------
  • 創建類神經網路變數

接下來,我們就創建一個類神經網路,在這裏取名為「neural」;要注意的是,要起始類神經網路時,PyTorch 會將神經網路各個節點的權重設為亂數;為了後續開發或研究的執行追蹤,我們創建類神經網路之前會習慣固定一個亂數種子。

接下來就是設定在「反饋訓練」(backpropagation training) 時所使用的成本函數以及訓練方法;這也就是我覺得使用 PyTorch 的好處之一,只需要作設定而不用寫複雜的程式。

torch.manual_seed(13)
neural=classNeural(1,10,1)
#-----------------
loss_fn=nn.MSELoss() # MSE
optimizer=torch.optim.AdamW(neural.parameters(),lr=0.01)
#-----------------
  • 類神經網路訓練

然後,開始進行類神經網路的訓練;首先,「train()」這個函數通知 PyTorch 接下來進行訓練模式;然後取出在訓練模式下的類神經網路預測值,將預測值與訓練值比較之後計算差異成本「loss_fn()」,然後起啟反饋訓練參數「optimizer.zero_grad()」,進行成本反饋「loss.backward()」,進行反饋訓練「optmizer.step()」;這樣就完成一個「反饋訓練」的迴圈。

neural.train()
n_epoche=5000
mae_x=[]
mae_y=[]
for epoche in range(n_epoche):
Y_pred=neural(X_train)
loss=loss_fn(Y_pred,Y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoche % 100==0:
neural.eval()
with torch.inference_mode():
Y_pred=neural(X_train)
mae=torch.mean(torch.abs(Y_train-Y_pred)).numpy()
mae_x.append(epoche)
mae_y.append(mae)
  • 驗証訓練結果

在這裏我們用了 3000 迴圈的反饋訓練,最後的結果跟原來訓練資料比較可以得來以下的圖形;在使用訓練好的「類神經網路」模式來作預測值計算時,必須要用「eval()」函數來通知 PyTorch,然後在「torch.reference_mode()」的狀態下進行模式運算;以及影響到訓練參數。

raw-image
neural.eval()
with torch.inference_mode():
Y_pred=neural(X_train)
y_pred=Y_pred.numpy()
plt.plot(x,y,'b.',label='training data')
plt.plot(x,y_pred,'r-',label='prediction')
plt.grid()
plt.legend(fontsize=12)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
  • 訓練過程誤差趨勢

如果把不同次迴圈的訓練誤差畫出來,可以得到以下的趨勢圖。

raw-image
torch.manual_seed(13)
neural=classNeural(1,10,1)
#-----------------
loss_fn=nn.MSELoss() # MSE
optimizer=torch.optim.AdamW(neural.parameters(),lr=0.01)
#-----------------
neural.train()
n_epoche=5000
mae_x=[]
mae_y=[]
for epoche in range(n_epoche):
Y_pred=neural(X_train)
loss=loss_fn(Y_pred,Y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoche % 100==0:
neural.eval()
with torch.inference_mode():
Y_pred=neural(X_train)
mae=torch.mean(torch.abs(Y_train-Y_pred)).numpy()
mae_x.append(epoche)
mae_y.append(mae)
#------------
plt.plot(mae_x,mae_y,'b--')
plt.ylabel('mean absolute error')
plt.xlabel('training iteration')
plt.grid()
plt.show()
#------------
  • 訓練過程分析

從誤差趨勢圖上,可以看到有三個不同的訓練階段;如果我們抽樣這三個階段,其實可以觀察到分別在原來訓練資料的不同轉折型態上,有不同的訓練收歛的表現;而且逐步有效的趨近,一直到最後訓練結果接近目標模型後,收歛的進度就會趨緩。

raw-image


#-------------------- 
# 訓練 3 個類神經網路
#--------------------
index_Weighting=[500,1000,5000]
saved_Weighting=[]
for i in range(len(index_Weighting)):
n_epoche=index_Weighting[i]
torch.manual_seed(13)
neural=classNeural(1,10,1)
loss_fn=nn.MSELoss() # MSE
optimizer=torch.optim.AdamW(neural.parameters(),lr=0.01)
neural.train()

for epoche in range(n_epoche):
Y_pred=neural(X_train)
loss=loss_fn(Y_pred,Y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
saved_Weighting.append(neural.state_dict())
#-----------------
# 將訓練好的類神經網路進行預測
#-----------------
y_pred=[]
for i in range(len(index_Weighting)):
neural=classNeural(1,10,1)
neural.load_state_dict(saved_Weighting[i])
neural.eval()
with torch.inference_mode():
Y_pred=neural(X_train)
y_pred.append(Y_pred.numpy())
#----------------
# 畫出預測模型結果
#----------------
index_color=['green','brown','red']
for i in range(len(index_Weighting)):
strLabel='train count:'+str(index_Weighting[i])
plt.plot(x,y_pred[i],linestyle='dashed',color=index_color[i],label=strLabel)
plt.grid()
plt.legend(fontsize=8)
plt.xlabel('x')
plt.ylabel('y')
plt.show()


留言
avatar-img
甘果的沙龍
5會員
33內容數
作者從國內主要的半導體公司退休,重回校園唸書;開始第三人生。分享退休投資規劃、科技產業經驗以及校園學習點滴。
甘果的沙龍的其他內容
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
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
本篇文章介紹如何使用PyTorch構建和訓練圖神經網絡(GNN),並使用Cora資料集進行節點分類任務。通過模型架構的逐步優化,包括引入批量標準化和獨立的消息傳遞層,調整Dropout和聚合函數,顯著提高了模型的分類準確率。實驗結果表明,經過優化的GNN模型在處理圖結構數據具有強大的性能和應用潛力。
Thumbnail
本篇文章介紹如何使用PyTorch構建和訓練圖神經網絡(GNN),並使用Cora資料集進行節點分類任務。通過模型架構的逐步優化,包括引入批量標準化和獨立的消息傳遞層,調整Dropout和聚合函數,顯著提高了模型的分類準確率。實驗結果表明,經過優化的GNN模型在處理圖結構數據具有強大的性能和應用潛力。
Thumbnail
本文參考TensorFlow官網Deep Convolutional Generative Adversarial Network的程式碼來加以實作說明。 示範如何使用深度卷積生成對抗網路(DCGAN) 生成手寫數位影像。
Thumbnail
本文參考TensorFlow官網Deep Convolutional Generative Adversarial Network的程式碼來加以實作說明。 示範如何使用深度卷積生成對抗網路(DCGAN) 生成手寫數位影像。
Thumbnail
延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣 訓練過程,比較圖 是不是CNN的效果比MLP還要好,
Thumbnail
延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣 訓練過程,比較圖 是不是CNN的效果比MLP還要好,
Thumbnail
本文主要介紹,如何利用GAN生成對抗網路來訓練生成圖片。 利用tensorflow,中的keras來建立生成器及鑑別器互相競爭訓練,最後利用訓練好的生成器來生成圖片。 GAN生成對抗網路的介紹 它由生成網路(Generator Network)和鑑別網路(Discriminator Netwo
Thumbnail
本文主要介紹,如何利用GAN生成對抗網路來訓練生成圖片。 利用tensorflow,中的keras來建立生成器及鑑別器互相競爭訓練,最後利用訓練好的生成器來生成圖片。 GAN生成對抗網路的介紹 它由生成網路(Generator Network)和鑑別網路(Discriminator Netwo
Thumbnail
透過這篇文章,我們將瞭解如何使用PyTorch實作圖神經網絡中的訊息傳遞機制,從定義消息傳遞的類別到實作消息傳遞過程。我們也探討了各種不同的消息傳遞機制,並通過對單次和多次傳遞過程的結果,可以看到節點特徵如何逐步傳遞與更新。
Thumbnail
透過這篇文章,我們將瞭解如何使用PyTorch實作圖神經網絡中的訊息傳遞機制,從定義消息傳遞的類別到實作消息傳遞過程。我們也探討了各種不同的消息傳遞機制,並通過對單次和多次傳遞過程的結果,可以看到節點特徵如何逐步傳遞與更新。
Thumbnail
本篇文章專注於消息傳遞(message passing)在圖神經網絡(GNN)中的應用,並以簡單的例子解釋了消息傳遞的過程和機制。
Thumbnail
本篇文章專注於消息傳遞(message passing)在圖神經網絡(GNN)中的應用,並以簡單的例子解釋了消息傳遞的過程和機制。
Thumbnail
本文主要筆記使用pytorch建立graph的幾個概念與實作。在傳統的神經網路模型中,數據點之間往往是互相連接和影響的,使用GNN,我們不僅處理單獨的數據點或Xb,而是處理一個包含多個數據點和它們之間連結的特徵。GNN的優勢在於其能夠將這些連結關係納入模型中,將關係本身作為特徵進行學習。
Thumbnail
本文主要筆記使用pytorch建立graph的幾個概念與實作。在傳統的神經網路模型中,數據點之間往往是互相連接和影響的,使用GNN,我們不僅處理單獨的數據點或Xb,而是處理一個包含多個數據點和它們之間連結的特徵。GNN的優勢在於其能夠將這些連結關係納入模型中,將關係本身作為特徵進行學習。
Thumbnail
本文將展示使用不同激活函數(ReLU 和 Sigmoid)的效果。 一個簡單的多層感知器(MLP)模型來對 Fashion-MNIST 資料集進行分類。 函數定義 Sigmoid 函數 Sigmoid 函數將輸入壓縮到 0到 1 之間: 特性: 輸出範圍是 (0,1)(0, 1)(0,1
Thumbnail
本文將展示使用不同激活函數(ReLU 和 Sigmoid)的效果。 一個簡單的多層感知器(MLP)模型來對 Fashion-MNIST 資料集進行分類。 函數定義 Sigmoid 函數 Sigmoid 函數將輸入壓縮到 0到 1 之間: 特性: 輸出範圍是 (0,1)(0, 1)(0,1
Thumbnail
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
Thumbnail
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
Thumbnail
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
Thumbnail
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News