使用叢集類神經網路進行圖形影像分類

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

透過「數值化分類目標」的方法可以用來將影像分類,不過如果分類目標較多而且彼此之間並沒有相互關聯性,那麼這樣的方法有可能在訓練的時候遇到無法收歛的瓶頸。因此,有時候也可以利用多個類神網路建立叢集,來進行影像分類;透過單一化訓練目標來加速訓練收歛。

使用叢集類神經網路來進行分類

使用叢集類神經網路來進行分類

  • 下載分類問題資料

在這裏我們使用「Fashion-MNIST」作為分類問題的例子;所以還是先透過「torchvision」下載所需要的資料。

#-----------
import torchvision
from torchvision import datasets
from torchvision.transforms import ToTensor
import numpy as np

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())
  • 建立類神經網路類別

同樣地還是使用反饋類神經網路來進行分類,首先建立類神經網路的類別。

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_output)
self.active=nn.Sigmoid()
#--------
def forward(self,x):
x=self.active(self.layer1(x))
return self.layer2(x)
  • 建立分類問題資料

我們使用「Fashion-MNIST」的前16筆圖形資料來建立叢集類神經網路模型。在輸入圖形資料的處理上並沒有改變,還是原來的 16 組 28*28 畫素的圖形資料。

#-------------    
device=torch.device('cpu')
if(torch.cuda.is_available()):
device=torch.device('cuda')
#------------
Images=train_data.data[0:16]
Labels=train_data.targets[0:16]
nType=len(train_data.classes)
#------------
Pixels=Images.flatten(start_dim=1,end_dim=2)
nData,nPixel=Pixels.shape
X_train=((Pixels-255/2.0)/(255)).to(device)
  • 叢集資料及類神經網路建立

在目標資料變數「cluster_y_train」上,必須要對映到分類目標;因為「Fashion-MNIST」總共有10的分類目標,所以要創建 10 組目標值,而且在依照分類目標的順序,將目標值設為 1,其他則為 0。

另外,利用 python 的物件序列方式,建立 10 個類神經網路「classNeural ()」所組成的叢集物件「cluster_neurals」;要特別注意的是,因為叢集物件是物件序列的形態,所以它的運算只能在「cpu」上進行;但是序列內的類神經網路物件,是由「PyTorch」所建立,因此它可以放在「gpu」來運算。

#------------
# set clustering targets
cluster_y_train=np.zeros((nType,nData,1))
for i in range(nData):
ix=Labels[i]
cluster_y_train[ix,i,0]=1.0
cluster_Y_train=torch.tensor(cluster_y_train.astype('float32')).to(device)
#------------
# set clustering neural networks
cluster_neurals=[]
for i in range(nType):
torch.manual_seed(13)
cluster_neurals.append(classNeural(28*28,10,1))
  • 安裝程式進度工具

因此叢集類神經網路的訓練包含多個類神經網路的運算,訓練過程當中沒有輸出畫面,可能造成一些錯誤判斷;因此訓練迴圈過程中,可以先安裝一個簡單好用的「tqdm」程式庫來即時回映訓練進度。

pip install tqdm 
  • 叢集類神經網路訓練

因為總共有 10 組分類目標以及 10 個類神經網路;因此,依序每個類神網路放入「gpu」進行訓練迴圈執行;各別類神類網路訓練完之後,透過「load_state_dict()」函數將訓練好的類神經網路的權重,在「cpu」上存回叢集類神經網路物件序列「cluster_neurals」。

from tqdm import tqdm
#-------------
# training neural network
for ptType in tqdm(range(nType)):
Y_train=cluster_Y_train[ptType]
imgNeural=cluster_neurals[ptType]
imgNeural.to(device)
optimizer=torch.optim.AdamW(imgNeural.parameters(),lr=0.01)
loss_fn=nn.MSELoss() # MSE

for epoche in range(100):
imgNeural.train()
Y_pred=imgNeural(X_train)
loss=loss_fn(Y_pred,Y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()

imgNeural.to('cpu')
cluster_neurals[ptType].load_state_dict(imgNeural.state_dict())
  • 叢集類神經網路預測

業集類神經網路訓練之後的結果,可以想成是各個分類的機率;因此可以透過「round()」函數來轉換成整數;列出來之後可以看到在 16 筆圖形資料,各個被分類到的目標類別的「布林值」;再利用「where()」函數找到目標位置,整合成預測結果;最後可以看到,預測的分類結果跟目標分類項目值完全一致。

raw-image
import numpy as np
#------------
# predition
y_pred=np.zeros(nData).astype('int')
for ptType in range(nType):
imgNeural=cluster_neurals[ptType]
imgNeural.to(device).eval()
with torch.inference_mode():
Y_output=imgNeural(X_train)
y_output=np.round(Y_output.squeeze(dim=1).to('cpu').numpy()).astype('int')
print('cluster #',(ptType+1),':',y_output)
ix=np.where(y_output==1)
y_pred[ix]=ptType

同樣地隨機選擇影像來進行測試,也可以得到一樣的結果。

raw-image
def clusterPrediction(cluster_neurals,PixelInput,device):
nData,nPixel=PixelInput.shape
y_pred=np.zeros(nData).astype('int')
for ptType in range(nType):
imgNeural=cluster_neurals[ptType]
imgNeural.to(device).eval()
with torch.inference_mode():
Y_output=imgNeural(PixelInput)
y_output=np.round(Y_output.squeeze(dim=1).to('cpu').numpy()).astype('int')
ix=np.where(y_output==1)
y_pred[ix]=ptType
return y_pred
#-------------
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
labelPred=clusterPrediction(cluster_neurals,PixelInput,device)
#---------- 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
甘果的沙龍
6會員
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 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
希望透過條列和簡介,可以更方便讀者選讀自己偏好的主題。
Thumbnail
希望透過條列和簡介,可以更方便讀者選讀自己偏好的主題。
Thumbnail
這篇整理了我這個月讀到一些不在我分類中但很不錯內容,我也都有附上來源,如果你想了解我這個月發現了什麼不錯的內容都可以在這裡找到,而且我還會加上我的一點個人回饋 另外每月資訊量不同,造成每一類的內容不一,有的內容會比較多,如果你只想看精選,我會在每一類中都挑出 3 篇我最推的,前面會有星號
Thumbnail
這篇整理了我這個月讀到一些不在我分類中但很不錯內容,我也都有附上來源,如果你想了解我這個月發現了什麼不錯的內容都可以在這裡找到,而且我還會加上我的一點個人回饋 另外每月資訊量不同,造成每一類的內容不一,有的內容會比較多,如果你只想看精選,我會在每一類中都挑出 3 篇我最推的,前面會有星號
Thumbnail
其實除了研究所需,觀察也是靈感的來源、也可以是日常生活的樂趣。
Thumbnail
其實除了研究所需,觀察也是靈感的來源、也可以是日常生活的樂趣。
Thumbnail
本篇文章介紹如何使用心智圖和主動回憶的方式來提高讀書效率,包括製作心智圖、使用主動回憶背誦心智圖和進行間隔重複的讀書方法。這些方法可以幫助讀者更有效地學習,並且根據個人的學習節奏進行調整。
Thumbnail
本篇文章介紹如何使用心智圖和主動回憶的方式來提高讀書效率,包括製作心智圖、使用主動回憶背誦心智圖和進行間隔重複的讀書方法。這些方法可以幫助讀者更有效地學習,並且根據個人的學習節奏進行調整。
Thumbnail
本文介紹如何結合使用 Readwise 和 Readwise Reader 進行高效的碎片化閱讀與筆記管理。透過 Readwise Reader 閱讀多平台內容並進行高亮和筆記,利用 Readwise 整理和回顧劃線,並匯出至 Heptabase 和 Obsidian,提升學習效率,避免碎片化思考。
Thumbnail
本文介紹如何結合使用 Readwise 和 Readwise Reader 進行高效的碎片化閱讀與筆記管理。透過 Readwise Reader 閱讀多平台內容並進行高亮和筆記,利用 Readwise 整理和回顧劃線,並匯出至 Heptabase 和 Obsidian,提升學習效率,避免碎片化思考。
Thumbnail
在傳統的筆記方法中存在著分類僵化和過度依賴關鍵字的問題。卡片筆記以一張卡片一個知識,確保知識的獨立性,並且建立知識間的多重連接,形成網狀結構。 這本書介紹了用卡片筆記做知識管理的技巧,幫助大家將零散的知識系統化,從而在需要時能夠迅速提取並應用。
Thumbnail
在傳統的筆記方法中存在著分類僵化和過度依賴關鍵字的問題。卡片筆記以一張卡片一個知識,確保知識的獨立性,並且建立知識間的多重連接,形成網狀結構。 這本書介紹了用卡片筆記做知識管理的技巧,幫助大家將零散的知識系統化,從而在需要時能夠迅速提取並應用。
Thumbnail
承繼上一篇我所提到的劇本,我今天意識到「標籤」,其實就是一個簡化版、濃縮版的劇本 什麼是標籤? 像 MBTI、XX症、XX學校畢業的,都是一個標籤 他的詞彙很短,但背後蘊含了大量的價值觀 (應該說,蘊含了大量言談者所「認為」的價值觀)
Thumbnail
承繼上一篇我所提到的劇本,我今天意識到「標籤」,其實就是一個簡化版、濃縮版的劇本 什麼是標籤? 像 MBTI、XX症、XX學校畢業的,都是一個標籤 他的詞彙很短,但背後蘊含了大量的價值觀 (應該說,蘊含了大量言談者所「認為」的價值觀)
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News