利用 PyTorch 和 CUDA 建立多變數類神經網路模型

更新於 2024/11/14閱讀時間約 15 分鐘

在真實世界中,大多數需要利用人工智慧處理的問題,都不會是單純的單變數問題。透過 PyToch 以及 CUDA 來使用多核 CPU 最主要的最大好處之一,是可以透過平行加速運算的能力,來處理複雜的多變數系統;我們可以利用類神經網路來建立多變數模型,瞭解各種情況下,系統的變化及反應,進一步找到方法使得我們面對的複雜系統達到我們所希望的最佳的效能。

  • 模型學習目標

在許多研究中,「Himmelblau function」是被拿來當作多變數模型的建立的典型例子。它是一個二維的函數,總共有四個極點。程式可以如下所表示;在這裏,我們利用「numpy.meshgrid()」 函數簡化產生資料的過程。

raw-image
import numpy as np
import matplotlib.pyplot as plt
#-----------
def himmFun(x,y):
return (x**2+y-11)**2+(x+y**2-7)**2
#-----------
points=np.arange(-6,6,0.1)
nPoint=len(points)
x1,x2=np.meshgrid(points,points)
y=himmFun(x1,x2)
#-----------
fig = plt.figure(figsize=(9,4))

ax1 = fig.add_subplot(121, projection='3d')
plt.title('surface')
ax1.view_init(45,30)
ax1.plot_surface(x1,x2,y,cmap='gist_rainbow')

ax2 = fig.add_subplot(122)
plt.title('contour')
ax2.contour(x1,x2,y,100,cmap='gist_rainbow')
plt.show()
  • 資料正規化

從上面的資料圖形當中,可以看到 X/Y/Z 軸變數的資料的範圍其實相當地分散;在類神經網路模型的建立上,我們通常會 X/Y/Z 軸變數的資料分佈儘量接近;這個過程一般叫做「㠪規化」;例如以下的程式,將變數資料分佈以零值為中心作數值正規化。

raw-image
#----------
# normalized data
#----------
x_1=(x1-np.mean(x1))/(np.max(x1)-np.min(x1))
x_2=(x2-np.mean(x2))/(np.max(x2)-np.min(x2))
y_0=(y-np.mean(y))/(np.max(y)-np.min(y))
  • 建立類神經網路類別

接下來,按照原來的反饋類神經網路建立類神經網路類別。

#----------------
# create neural network model
#----------------
import torch
from torch import nn
#---------
# create neural network model
#---------
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)
  • 訓練資料型態轉換

由於「Himmelblau function」有兩個自變數(x1, x2),每個自變數資料又都是透過「meshgrid()」函數產生的二維陣列的形式;因此,在訓練類神經網路之前,我們要將這自變數的二維矩陣形態,透過「reshape()」變成單維矩陣形態;然後再轉換成「torch.tensor」型態,以方便訓練類神經網路。

要注意,在 PyTorch 的使用上,訓練資料的第一個維數指的是訓練資料數的指標,而第二個維度則是不同變數的數目。

import torch
#--------
device=torch.device('cpu')
if torch.cuda.is_available():
device=torch.device('cuda')
#--------
nData=len(y_0)**2
x=np.zeros((nData,2))
x[:,0]=x_1.reshape(nData,1)[:,0]
x[:,1]=x_2.reshape(nData,1)[:,0]
y=y_0.reshape(nData,1)
X_train=torch.tensor(x.astype('float32')).to(device)
Y_train=torch.tensor(y.astype('float32')).to(device)
  • 在 GPU 進行類神經網路訓練

這一段的訓練類神經網路,與之前的單變數訓練程式的寫法是一樣的,而且因為訓練資料以及類神經網路變數都在 GPU 上,所以整個運算也就會在 GPU 上面執行。

#---------
# training
#---------
torch.manual_seed(13)
neural=classNeural(2,10,1).to(device)
#---------
# set training condition
#---------
loss_fn=nn.MSELoss() # MSE
optimizer=torch.optim.AdamW(neural.parameters(),lr=0.01)
neural.train()
n_epoche=3000
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()
  • 輸出在訓練好的模型的預測數值

最後,在輸出訓練好的類神經網路模型進行預測值的輸出。要注意的是所有的輸出到人機界面的數值,都必須要透過函數「to(‘cpu’)」由 GPU 搬到 CPU 上,才能進行。

#------------
# prediction
#------------
neural.eval()
with torch.inference_mode():
Y_pred=neural(X_train)
#----------------
# output 結果轉換到 CPU 的 numpy 型態
#----------------
x_train=X_train.to('cpu').numpy()
x1_train=x_train[:,0].reshape(nPoint,nPoint)
x2_train=x_train[:,1].reshape(nPoint,nPoint)

y_train=Y_train.to('cpu').numpy().reshape(nPoint,nPoint)
y_pred=Y_pred.to("cpu").numpy().reshape(nPoint,nPoint)
#----------------
# 3D/contour 繪圖
#———————————————
fig = plt.figure(figsize=(9,4))

ax1 = fig.add_subplot(121, projection='3d')
plt.title('surface')
ax1.plot_wireframe(x1_train,x2_train,y_pred,color='blue',rstride=5, cstride=5,label='predicton')
ax1.plot_wireframe(x1_train,x2_train,y_train,color='red',linestyle='dotted',rstride=5, cstride=5,label='target')
plt.legend()

ax2 = fig.add_subplot(122)
plt.title('prediction contour')
ax2.contour(x1_train,x2_train,y_pred,100,cmap='gist_rainbow')
plt.show()
raw-image


  • 觀察多變數類神經網路的訓練收歛情況

在執行類神經網路訓練時,觀察訓練誤差值的變化,我們可以看到有三段不同的收歛區間。我們可以看看在不同訓練疊代次數時,預測的資料所繪出不同的模式圖形;可以更瞭解多變數類神經網路模型的變化如下。

raw-image


raw-image
raw-image
raw-image
raw-image
runs=[10,1000,1500,3000]
n_Run=len(runs)
for i in range(n_Run):
n_epoche=runs[i]
torch.manual_seed(13)
neural=classNeural(2,10,1).to(device)
#---------
# training
#---------
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()
#----------
# predicton
#----------
neural.eval()
with torch.inference_mode():
Y_pred=neural(X_train)
#----------
# handle data from CUDA tensor
#----------
x_train=X_train.to('cpu').numpy()
x1_train=x_train[:,0].reshape(nPoint,nPoint)
x2_train=x_train[:,1].reshape(nPoint,nPoint)

y_train=Y_train.to('cpu').numpy().reshape(nPoint,nPoint)
y_pred=Y_pred.to("cpu").numpy().reshape(nPoint,nPoint)
#----------
# plot
#----------
fig = plt.figure(figsize=(9,4*n_Run))
frame1=((i+1)*2-1)+20+n_Run*100
frame2=(i+1)*2+20+n_Run*100

ax1 = fig.add_subplot(frame1, projection='3d')
plt.title('iteration count:'+str(runs[i]))
ax1.plot_wireframe(x1_train,x2_train,y_pred,color='blue',rstride=5, cstride=5,label='predicton')
ax1.plot_wireframe(x1_train,x2_train,y_train,color='red',linestyle='dotted',rstride=5, cstride=5,label='target')
plt.legend()

ax2 = fig.add_subplot(frame2)
plt.title('prediction contour')
ax2.contour(x1_train,x2_train,y_pred,100,cmap='gist_rainbow')
plt.show()




avatar-img
4會員
17內容數
作者從國內主要的半導體公司退休,重回校園唸書;開始第三人生。分享退休投資規劃、科技產業經驗以及校園學習點滴。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
甘果的沙龍 的其他內容
本文將介紹如何在NVIDIA Jetson 人工智慧平台上,利用PyTorch和CUDA實現反饋類神經網路的運算。探討如何將運算任務從 CPU 轉移到 GPU,包括數據搬移和網路訓練的步驟。內容涵蓋建立類神經網路、確認 CUDA裝置、有效地在GPU上進行訓練和運算,充分利用 GPU 的加速優勢。
本篇文章介紹如何使用 PyTorch 這個強大的工具程式庫來建立一個反饋類神經網路。從單變數的「墨西哥帽」模型學習,到設定類神經網路的結構和訓練方法,資料轉換、類神經網路創建以及訓練過程的步驟。此外,也分析訓練過程中的誤差趨勢,幫助理解模型性能,適合希望快速掌握 PyTorch 的人工智慧開發者。
本文說明在安裝實體具有多核 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 Jetson 人工智慧平台上,利用PyTorch和CUDA實現反饋類神經網路的運算。探討如何將運算任務從 CPU 轉移到 GPU,包括數據搬移和網路訓練的步驟。內容涵蓋建立類神經網路、確認 CUDA裝置、有效地在GPU上進行訓練和運算,充分利用 GPU 的加速優勢。
本篇文章介紹如何使用 PyTorch 這個強大的工具程式庫來建立一個反饋類神經網路。從單變數的「墨西哥帽」模型學習,到設定類神經網路的結構和訓練方法,資料轉換、類神經網路創建以及訓練過程的步驟。此外,也分析訓練過程中的誤差趨勢,幫助理解模型性能,適合希望快速掌握 PyTorch 的人工智慧開發者。
本文說明在安裝實體具有多核 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開發流程的讀者。
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
前言 最近在研究GAT,在網路上看到使用torch和DGL實作的GAT模型的程式碼,就想說下載下來自己跑跑看,這篇文章:Understand Graph Attention Network。途中遇到問題,把找到的解法記錄下來,給也有一樣問題的朋友參考。 正文 在Colab直接使用: !p
Thumbnail
本系列將討論 LLM 時代中,分散 ML workload 的各種方法。作為系列的第一篇,我們將提及 High-level 的概論,譬如分散式訓練的各種切法、Model Parallelism 的相依問題,以及改善 Network Topology 等課題。
Thumbnail
本篇文章介紹如何使用PyTorch構建和訓練圖神經網絡(GNN),並使用Cora資料集進行節點分類任務。通過模型架構的逐步優化,包括引入批量標準化和獨立的消息傳遞層,調整Dropout和聚合函數,顯著提高了模型的分類準確率。實驗結果表明,經過優化的GNN模型在處理圖結構數據具有強大的性能和應用潛力。
Thumbnail
本文參考TensorFlow官網Deep Convolutional Generative Adversarial Network的程式碼來加以實作說明。 示範如何使用深度卷積生成對抗網路(DCGAN) 生成手寫數位影像。
Thumbnail
延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣 訓練過程,比較圖 是不是CNN的效果比MLP還要好,
Thumbnail
透過這篇文章,我們將瞭解如何使用PyTorch實作圖神經網絡中的訊息傳遞機制,從定義消息傳遞的類別到實作消息傳遞過程。我們也探討了各種不同的消息傳遞機制,並通過對單次和多次傳遞過程的結果,可以看到節點特徵如何逐步傳遞與更新。
Thumbnail
本篇文章專注於消息傳遞(message passing)在圖神經網絡(GNN)中的應用,並以簡單的例子解釋了消息傳遞的過程和機制。
Thumbnail
本文主要筆記使用pytorch建立graph的幾個概念與實作。在傳統的神經網路模型中,數據點之間往往是互相連接和影響的,使用GNN,我們不僅處理單獨的數據點或Xb,而是處理一個包含多個數據點和它們之間連結的特徵。GNN的優勢在於其能夠將這些連結關係納入模型中,將關係本身作為特徵進行學習。
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 下游任務是一個 Fine-Tuned 的 Transformer 任務,它從預先訓練的 Transformer 模型繼承模型和參數,故,下游任務是運行微調任務的預訓練模
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 接著來談 Transformer 架構中的 Feedforward Network (FFN): 其為全連接的神經網路架構 回顧 AI說書 - 從0開始 - 64
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
前言 最近在研究GAT,在網路上看到使用torch和DGL實作的GAT模型的程式碼,就想說下載下來自己跑跑看,這篇文章:Understand Graph Attention Network。途中遇到問題,把找到的解法記錄下來,給也有一樣問題的朋友參考。 正文 在Colab直接使用: !p
Thumbnail
本系列將討論 LLM 時代中,分散 ML workload 的各種方法。作為系列的第一篇,我們將提及 High-level 的概論,譬如分散式訓練的各種切法、Model Parallelism 的相依問題,以及改善 Network Topology 等課題。
Thumbnail
本篇文章介紹如何使用PyTorch構建和訓練圖神經網絡(GNN),並使用Cora資料集進行節點分類任務。通過模型架構的逐步優化,包括引入批量標準化和獨立的消息傳遞層,調整Dropout和聚合函數,顯著提高了模型的分類準確率。實驗結果表明,經過優化的GNN模型在處理圖結構數據具有強大的性能和應用潛力。
Thumbnail
本文參考TensorFlow官網Deep Convolutional Generative Adversarial Network的程式碼來加以實作說明。 示範如何使用深度卷積生成對抗網路(DCGAN) 生成手寫數位影像。
Thumbnail
延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣 訓練過程,比較圖 是不是CNN的效果比MLP還要好,
Thumbnail
透過這篇文章,我們將瞭解如何使用PyTorch實作圖神經網絡中的訊息傳遞機制,從定義消息傳遞的類別到實作消息傳遞過程。我們也探討了各種不同的消息傳遞機制,並通過對單次和多次傳遞過程的結果,可以看到節點特徵如何逐步傳遞與更新。
Thumbnail
本篇文章專注於消息傳遞(message passing)在圖神經網絡(GNN)中的應用,並以簡單的例子解釋了消息傳遞的過程和機制。
Thumbnail
本文主要筆記使用pytorch建立graph的幾個概念與實作。在傳統的神經網路模型中,數據點之間往往是互相連接和影響的,使用GNN,我們不僅處理單獨的數據點或Xb,而是處理一個包含多個數據點和它們之間連結的特徵。GNN的優勢在於其能夠將這些連結關係納入模型中,將關係本身作為特徵進行學習。
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 下游任務是一個 Fine-Tuned 的 Transformer 任務,它從預先訓練的 Transformer 模型繼承模型和參數,故,下游任務是運行微調任務的預訓練模
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 接著來談 Transformer 架構中的 Feedforward Network (FFN): 其為全連接的神經網路架構 回顧 AI說書 - 從0開始 - 64