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

閱讀時間約 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()


3會員
12內容數
作者從國內主要的半導體公司退休,重回校園唸書;開始第三人生。分享退休投資規劃、科技產業經驗以及校園學習點滴。
留言0
查看全部
發表第一個留言支持創作者!
甘果的沙龍 的其他內容
本文說明在安裝實體具有多核 GPU 的環境下,可以透過 Python 「多執行緒的」程式,讓 CPU 及 GPU 依照特性,各自同時進行運算,得到最好的算力配置。
本文描敘如何配合 nVidia Jetson Orin Nano 的多核心 GPU 的裝置,利用 PyTorch 來作 CUDA python 程式開發。
本篇文章介紹如何在 Jetson Nano 環境 Ubuntu 2.0 使用 git 及 github.com 進行版本控管。文章快速說明如何安裝、建立版本控管目錄及使用常用的指令。透過簡單的步驟,讀者將能夠有效地管理其程式碼版本,提升開發效率。
本文介紹如何在Python開發過程中建立虛擬環境以避免程式庫衝突,並使用Jupyter Notebook切換不同的虛擬環境。讓開發者能夠輕鬆地在不同環境中工作,提升開發效率。本文涵蓋從建立虛擬環境到管理Jupyter核心的完整步驟,適合希望優化其Python開發流程的讀者。
本文介紹如何在 nVidia Nano Python/CUDA 伺服器,遠端使用 Jupyter Notebook 編輯和執行程式。包括Jupyter Notebook 的安裝過程及其配置文件的修改,和遠端存取的機制。本文藉由接近大型公司使用的資訊安全環境的架設,期待相關學生縮短進入業界的學習曲線。
本文介紹如何在 nVidia Jetson Orin Nano 裝置上安裝 PyTorch,並運用其 Python 及 CUDA 環境進行機器學習和人工智慧的開發。提供詳細步驟。適合希望在該平臺上開展研究與開發的使用者。
本文說明在安裝實體具有多核 GPU 的環境下,可以透過 Python 「多執行緒的」程式,讓 CPU 及 GPU 依照特性,各自同時進行運算,得到最好的算力配置。
本文描敘如何配合 nVidia Jetson Orin Nano 的多核心 GPU 的裝置,利用 PyTorch 來作 CUDA python 程式開發。
本篇文章介紹如何在 Jetson Nano 環境 Ubuntu 2.0 使用 git 及 github.com 進行版本控管。文章快速說明如何安裝、建立版本控管目錄及使用常用的指令。透過簡單的步驟,讀者將能夠有效地管理其程式碼版本,提升開發效率。
本文介紹如何在Python開發過程中建立虛擬環境以避免程式庫衝突,並使用Jupyter Notebook切換不同的虛擬環境。讓開發者能夠輕鬆地在不同環境中工作,提升開發效率。本文涵蓋從建立虛擬環境到管理Jupyter核心的完整步驟,適合希望優化其Python開發流程的讀者。
本文介紹如何在 nVidia Nano Python/CUDA 伺服器,遠端使用 Jupyter Notebook 編輯和執行程式。包括Jupyter Notebook 的安裝過程及其配置文件的修改,和遠端存取的機制。本文藉由接近大型公司使用的資訊安全環境的架設,期待相關學生縮短進入業界的學習曲線。
本文介紹如何在 nVidia Jetson Orin Nano 裝置上安裝 PyTorch,並運用其 Python 及 CUDA 環境進行機器學習和人工智慧的開發。提供詳細步驟。適合希望在該平臺上開展研究與開發的使用者。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
前言 最近在研究GAT,在網路上看到使用torch和DGL實作的GAT模型的程式碼,就想說下載下來自己跑跑看,這篇文章:Understand Graph Attention Network。途中遇到問題,把找到的解法記錄下來,給也有一樣問題的朋友參考。 正文 在Colab直接使用: !p
Thumbnail
本篇文章介紹如何使用PyTorch構建和訓練圖神經網絡(GNN),並使用Cora資料集進行節點分類任務。通過模型架構的逐步優化,包括引入批量標準化和獨立的消息傳遞層,調整Dropout和聚合函數,顯著提高了模型的分類準確率。實驗結果表明,經過優化的GNN模型在處理圖結構數據具有強大的性能和應用潛力。
Thumbnail
本文參考TensorFlow官網Deep Convolutional Generative Adversarial Network的程式碼來加以實作說明。 示範如何使用深度卷積生成對抗網路(DCGAN) 生成手寫數位影像。
Thumbnail
延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣 訓練過程,比較圖 是不是CNN的效果比MLP還要好,
Thumbnail
本文主要介紹,如何利用GAN生成對抗網路來訓練生成圖片。 利用tensorflow,中的keras來建立生成器及鑑別器互相競爭訓練,最後利用訓練好的生成器來生成圖片。 GAN生成對抗網路的介紹 它由生成網路(Generator Network)和鑑別網路(Discriminator Netwo
Thumbnail
透過這篇文章,我們將瞭解如何使用PyTorch實作圖神經網絡中的訊息傳遞機制,從定義消息傳遞的類別到實作消息傳遞過程。我們也探討了各種不同的消息傳遞機制,並通過對單次和多次傳遞過程的結果,可以看到節點特徵如何逐步傳遞與更新。
Thumbnail
本篇文章專注於消息傳遞(message passing)在圖神經網絡(GNN)中的應用,並以簡單的例子解釋了消息傳遞的過程和機制。
Thumbnail
本文主要筆記使用pytorch建立graph的幾個概念與實作。在傳統的神經網路模型中,數據點之間往往是互相連接和影響的,使用GNN,我們不僅處理單獨的數據點或Xb,而是處理一個包含多個數據點和它們之間連結的特徵。GNN的優勢在於其能夠將這些連結關係納入模型中,將關係本身作為特徵進行學習。
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 xxx ,ChatGPT 除了產生程式周邊的文字描述,事實上它還會回覆程式語法的指令 : !pip install scikit-learn import nu
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 接著來談 Transformer 架構中的 Feedforward Network (FFN): 其為全連接的神經網路架構 回顧 AI說書 - 從0開始 - 64
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
前言 最近在研究GAT,在網路上看到使用torch和DGL實作的GAT模型的程式碼,就想說下載下來自己跑跑看,這篇文章:Understand Graph Attention Network。途中遇到問題,把找到的解法記錄下來,給也有一樣問題的朋友參考。 正文 在Colab直接使用: !p
Thumbnail
本篇文章介紹如何使用PyTorch構建和訓練圖神經網絡(GNN),並使用Cora資料集進行節點分類任務。通過模型架構的逐步優化,包括引入批量標準化和獨立的消息傳遞層,調整Dropout和聚合函數,顯著提高了模型的分類準確率。實驗結果表明,經過優化的GNN模型在處理圖結構數據具有強大的性能和應用潛力。
Thumbnail
本文參考TensorFlow官網Deep Convolutional Generative Adversarial Network的程式碼來加以實作說明。 示範如何使用深度卷積生成對抗網路(DCGAN) 生成手寫數位影像。
Thumbnail
延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣 訓練過程,比較圖 是不是CNN的效果比MLP還要好,
Thumbnail
本文主要介紹,如何利用GAN生成對抗網路來訓練生成圖片。 利用tensorflow,中的keras來建立生成器及鑑別器互相競爭訓練,最後利用訓練好的生成器來生成圖片。 GAN生成對抗網路的介紹 它由生成網路(Generator Network)和鑑別網路(Discriminator Netwo
Thumbnail
透過這篇文章,我們將瞭解如何使用PyTorch實作圖神經網絡中的訊息傳遞機制,從定義消息傳遞的類別到實作消息傳遞過程。我們也探討了各種不同的消息傳遞機制,並通過對單次和多次傳遞過程的結果,可以看到節點特徵如何逐步傳遞與更新。
Thumbnail
本篇文章專注於消息傳遞(message passing)在圖神經網絡(GNN)中的應用,並以簡單的例子解釋了消息傳遞的過程和機制。
Thumbnail
本文主要筆記使用pytorch建立graph的幾個概念與實作。在傳統的神經網路模型中,數據點之間往往是互相連接和影響的,使用GNN,我們不僅處理單獨的數據點或Xb,而是處理一個包含多個數據點和它們之間連結的特徵。GNN的優勢在於其能夠將這些連結關係納入模型中,將關係本身作為特徵進行學習。
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 xxx ,ChatGPT 除了產生程式周邊的文字描述,事實上它還會回覆程式語法的指令 : !pip install scikit-learn import nu
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 接著來談 Transformer 架構中的 Feedforward Network (FFN): 其為全連接的神經網路架構 回顧 AI說書 - 從0開始 - 64