vocus logo

方格子 vocus

使用 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
甘果的沙龍
7會員
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
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
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
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News