使用反饋類神經網路進行圖形分類的基本作法

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

多維度分類問題中,最重要的部份是一部份是透過類神經網路進行圖形的分類;PyTorch 也提供了圖形方面相當多的資源以及資料,其中包括著名的「Fashion-MNIST」問題的圖形資料。

  • Fashion-MNIST 資料集

「Fashion-MNIST」問題提供了7,0000 個服飾的灰階圖形資料,每個服飾圖形由「28*28」的像素所組成;其中60,000 為訓練資料而10,000組則為測試資料;所有的圖形共分成 9 組不同的服飾類別。

raw-image
  • 安裝 torchvision

在 PyTorch 中要使「Fashion-MNIST」資料以及相關的圖形處理工具,首先要先安裝「torchvision」程式庫。由於我們已經透過 nVidia 提供的 wheel 檔安裝過「PyTorch」了,所以只要裝原來的 wheel 檔複製到工作目錄,然後對照「 nVidia PyTorch 軟體工具安裝網頁」確認適當的版本,再下安裝指令就可以了。

raw-image

由於我們安裝的 PyTorch 版本是 2.0,所以安裝指令指定「torchvision==0.15」。

pip3 install ‘torchvision==0.15*.whl
  • 使用「Fashion-MNIST」資料

接下來可以寫程式來使用這組資料,分別將訓練資料及測試資料放在「train_data」及「test_data」這兩個變數;在第一次讀取資料的程式執行時,它會在本機端建立一個「data/FashionMNIST」的資料夾,將資料放在本機端;讀取的資料形態可以直接指定為「tensor」方便接下來類神經網路的訓練使用。

import torchvision
from torchvision import datasets
from torchvision.transforms import ToTensor

train_data=datasets.FashionMNIST(root="data",
train=True,
download=True,
transform=ToTensor(),
target_transform=None)
test_data=datasets.FashionMNIST(root="data",
train=False,
download=True,
transform=ToTensor())
print('train data count:',len(train_data))
print('test data count:',len(test_data))
  • 建立類神經網路類別並指定 CUDA/GPU

這一部份與之前的多維分類問題的類神經網路的作法是一樣的。

import torch
from torch import nn

#-----------------------
# creat neural network class
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_hidden)
self.layer3=nn.Linear(n_hidden,n_output)

self.active=nn.Sigmoid()
#--------
def forward(self,x):
x=self.active(self.layer1(x))
x=self.active(self.layer2(x))

return self.layer3(x)
#-----------------------
# assign CUDA device
device=torch.device('cpu')
if(torch.cuda.is_available()):
device=torch.device('cuda')
  • 資料初步分析

因為「Fashion-MINST」的圖形資料相對於之前的數值資料,資料量相對地比較大。每一個灰階圖形是由「28*28」的圖形點 (pixel) 所形成,每個圖形點的數值由 0 到 255 來形成;在初步的影像分類學習上,我們先使用最前面的 16 組圖形來作分類,如程式中的「Images」及「labels」變數。圖形的 pixel 資料可以使用「train_data.data」變數來取得;圖形的分類結果則以整數的方式,放在「train_data.targets」;分類的標註文字則放在「train_data.classes」文字陣列中。

raw-image
import torch
from torch import nn
import matplotlib.pyplot as plt
import numpy as np
#-----------
print(train_data.data[0].shape)
print('max:',np.max(train_data.data[0].numpy()))
print('min:',np.min(train_data.data[0].numpy()))
#-----------
Images=train_data.data[0:16]
labels=train_data.targets[0:16].numpy()
#-----------------------
fig=plt.figure(figsize=(9,9))
rows,cols=4,4
for i in range(rows*cols):
fig.add_subplot(rows,cols,i+1)
plt.imshow(Images[i],cmap='gray')
plt.title(train_data.classes[labels[i]])
plt.axis(False)
plt.show()
#-----------------
  • 準備訓練資料

由於圖形資料是一個二維的 pixel 所形成的矩陣,所以在進入類神經網路訓練之前,要將二維矩陣轉換成一維的資料。這時候我們可以使用「torchvision」提供的「flatten()」函數,將訓練資料由16個二維變數轉換成16個一維變數;同時將訓練資料成正規化。


raw-image
import torch
from torch import nn
import numpy as np
# setup training data

Pixels=Images.flatten(start_dim=1,end_dim=2)
nData,nPixel=Pixels.shape
X_train=((Pixels-255/2.0)/(255)).to(device)
y_train=(labels-np.mean(labels))/(np.max(labels)-np.min(labels))
Y_train=torch.tensor(y_train.astype('float32')).unsqueeze(dim=1).to(device)


  • 訓練類神經網路

經過改變資料維度的正規化訓練,與多維分類問題同樣地進入類神經網路進行訓練。

raw-image
#-------------
# create neural network model
imgNeural=classNeural(nPixel,28,1).to(device)
torch.manual_seed(13)
loss_fn=nn.MSELoss() # MSE
optimizer=torch.optim.AdamW(imgNeural.parameters(),lr=0.01)
#-------------
# training neural network
import time
for epoche in range(500):
imgNeural.train()
Y_pred=imgNeural(X_train)
loss=loss_fn(Y_pred,Y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
  • 圖形分類預測結果

類神經訓練完之後,將原來的 16 組訓練資料丟進類神經網路預測結果;初步可以看到,類神經網路可以輕易地學習完成這 16 組圖形分類資料;這也說明了類神經網路具備圖形分類學習的基本能力。不過一般的圖形分類問題,資料量都相當地龐大,會需要更多的資料處理工具才能完成。

raw-image
#------------
# prediction
imgNeural.eval()
with torch.inference_mode():
Y_pred=imgNeural(X_train)
y_pred=Y_pred.squeeze(dim=1).to('cpu').numpy()
label_pred=np.round(y_pred*(np.max(labels)-np.min(labels))+np.mean(labels))
#------------
# plot
plt.scatter(range(16),labels,color='red',facecolor='none',label='Target')
plt.scatter(range(16),label_pred,color='blue',marker='x',label='Predition')
plt.xlabel('Sample #')
plt.ylabel('Classes')
showTick=np.arange(0,nData,1)
plt.xticks(ticks=showTick,labels=(showTick+1))
plt.yticks(ticks=range(len(train_data.classes)),labels=train_data.classes,fontsize=8)
plt.legend()
plt.grid()
plt.show()

當然也可以亂數選取圖形來分類,進行確認。

raw-image
import random

random.seed(13)
fig=plt.figure(figsize=(9,9))
rows,cols=4,4
for i in range(rows*cols):
ix=random.randint(0,15)
#---------- handle input tensor
ImgInput=(train_data.data[ix]-255/2.0)/255
PixelInput=ImgInput.flatten().unsqueeze(dim=0).to(device)
#---------- neural network prediction
imgNeural.eval()
with torch.inference_mode():
LabelOutput=imgNeural(PixelInput)
#---------- handle output tensor
labelOutput=LabelOutput.squeeze(dim=1).to('cpu').numpy()
labelPred=np.round(labelOutput*(np.max(labels)-np.min(labels))+np.mean(labels))
#---------- transfer output into label text
titlePred=train_data.classes[int(labelPred)]
titleTarget=train_data.classes[train_data.targets[ix]]
#---------- plot
fig.add_subplot(rows,cols,i+1)
plt.imshow(ImgInput.to('cpu'),cmap='gray')
strTitle=titleTarget+'->'+titlePred
plt.title(strTitle)
plt.axis(False)
plt.show()
留言
avatar-img
留言分享你的想法!
avatar-img
甘果的沙龍
4會員
28內容數
作者從國內主要的半導體公司退休,重回校園唸書;開始第三人生。分享退休投資規劃、科技產業經驗以及校園學習點滴。
甘果的沙龍的其他內容
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
本文介紹使用 PyTorch 及類神經網路進行圖形資料集的分類。Fashion-MNIST 提供了機器學習研究上的著名範例;服飾的灰階圖像的分類。本文指導讀者從安裝 torchvision 到建立類神經網路,進行圖形分類的完整過程。也詳述了資料處理及訓練過程,幫助理解類神經網路在圖形分類上的應用。
Thumbnail
本文介紹使用 PyTorch 及類神經網路進行圖形資料集的分類。Fashion-MNIST 提供了機器學習研究上的著名範例;服飾的灰階圖像的分類。本文指導讀者從安裝 torchvision 到建立類神經網路,進行圖形分類的完整過程。也詳述了資料處理及訓練過程,幫助理解類神經網路在圖形分類上的應用。
Thumbnail
本文探討類神經網路在多元分類問題的應用,以scikit-learn 程式庫中的鳶尾花分類問題為例。該問題涉及三種不同的鳶尾花分類,並詳細說明瞭資料整理、類神經網路的建立及訓練過程,最終達到高準確率的預測結果。本文將幫助讀者理解如何應用類神經網路、PyTorch 及 CUDA 來進行高效的模型訓練。
Thumbnail
本文探討類神經網路在多元分類問題的應用,以scikit-learn 程式庫中的鳶尾花分類問題為例。該問題涉及三種不同的鳶尾花分類,並詳細說明瞭資料整理、類神經網路的建立及訓練過程,最終達到高準確率的預測結果。本文將幫助讀者理解如何應用類神經網路、PyTorch 及 CUDA 來進行高效的模型訓練。
Thumbnail
本文介紹如何利用 PyTorch 和 CUDA,建立多變數類神經網路模型。特別的,文章以「Himmelblau function」為例,探討資料正規化及訓練資料型態轉換的過程,並說明如何在 GPU 上訓練類神經網路。分析訓練誤差值及模型的收斂情況,希望幫助讀者深入理解多變數類神經網路的應用與挑戰。
Thumbnail
本文介紹如何利用 PyTorch 和 CUDA,建立多變數類神經網路模型。特別的,文章以「Himmelblau function」為例,探討資料正規化及訓練資料型態轉換的過程,並說明如何在 GPU 上訓練類神經網路。分析訓練誤差值及模型的收斂情況,希望幫助讀者深入理解多變數類神經網路的應用與挑戰。
Thumbnail
本篇文章介紹如何使用 PyTorch 這個強大的工具程式庫來建立一個反饋類神經網路。從單變數的「墨西哥帽」模型學習,到設定類神經網路的結構和訓練方法,資料轉換、類神經網路創建以及訓練過程的步驟。此外,也分析訓練過程中的誤差趨勢,幫助理解模型性能,適合希望快速掌握 PyTorch 的人工智慧開發者。
Thumbnail
本篇文章介紹如何使用 PyTorch 這個強大的工具程式庫來建立一個反饋類神經網路。從單變數的「墨西哥帽」模型學習,到設定類神經網路的結構和訓練方法,資料轉換、類神經網路創建以及訓練過程的步驟。此外,也分析訓練過程中的誤差趨勢,幫助理解模型性能,適合希望快速掌握 PyTorch 的人工智慧開發者。
Thumbnail
在我的上一篇文章中,我們提到了人工智慧 & 機器學習 & 深度學習跟神經網路的關係,我們也了解到了所謂的深度學習是一種基於神經網路上的機器學習方法。那麼神經網路到底是什麼呢? 我們上一篇文章裡面提到的神經網路的層Layer究竟是什麼呢? 到底為什麼神經網路需要這麼多的神經元(Neurons)跟層數呢
Thumbnail
在我的上一篇文章中,我們提到了人工智慧 & 機器學習 & 深度學習跟神經網路的關係,我們也了解到了所謂的深度學習是一種基於神經網路上的機器學習方法。那麼神經網路到底是什麼呢? 我們上一篇文章裡面提到的神經網路的層Layer究竟是什麼呢? 到底為什麼神經網路需要這麼多的神經元(Neurons)跟層數呢
Thumbnail
要徹底了解深度學習,必須從數學/統計奠定基礎,從張量運算、偏微分、梯度下降優化求解,最後依據機率統計衡量模的效能指標,包括準確率 (Accuracy)、精確率 (Precision)、召回率 (Recall),乃至於混淆矩陣 (Confusion Matrix)。
Thumbnail
要徹底了解深度學習,必須從數學/統計奠定基礎,從張量運算、偏微分、梯度下降優化求解,最後依據機率統計衡量模的效能指標,包括準確率 (Accuracy)、精確率 (Precision)、召回率 (Recall),乃至於混淆矩陣 (Confusion Matrix)。
Thumbnail
TensorFlow、PyTorch 是目前佔有率最高的深度學習框架,初學者常會問『應該選擇PyTorch或 TensorFlow套件』,依個人看法,PyTorch、TensorFlow好比倚天劍與屠龍刀,各有擅場,兩個套件的發展重點有所不同,例如在偵錯方面,PyTorch比較容易,但Tensor
Thumbnail
TensorFlow、PyTorch 是目前佔有率最高的深度學習框架,初學者常會問『應該選擇PyTorch或 TensorFlow套件』,依個人看法,PyTorch、TensorFlow好比倚天劍與屠龍刀,各有擅場,兩個套件的發展重點有所不同,例如在偵錯方面,PyTorch比較容易,但Tensor
Thumbnail
這篇文章從類神經網路的起源,也就是單神經元的感知器。簡單的感知器迭代演算法使單神經元可以學習,但卻無法學習超過非線性,如 XOR 的資料分布。另外,本文還介紹了 Logistic regression,藉由透過非線性轉換來使線性輸出近似於機率分佈。最後則以一場大師賭局結束(SVM vs NN)。
Thumbnail
這篇文章從類神經網路的起源,也就是單神經元的感知器。簡單的感知器迭代演算法使單神經元可以學習,但卻無法學習超過非線性,如 XOR 的資料分布。另外,本文還介紹了 Logistic regression,藉由透過非線性轉換來使線性輸出近似於機率分佈。最後則以一場大師賭局結束(SVM vs NN)。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News