使用巨量資料及類神經網路進行字元辨識的應用與訓練技巧

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

類神經網路應用在圖形辨識的時候,往往需要大量的資料來進行訓練;一方面,訓練完成所花的時間相當長;另一方面,也常常會在已訓練完成之後,再使用新的資料再「加強」訓練,用來擴展或改善類神經網路的辨識能力;因此,經常會將圖形資料「分批」來進行訓練。在圖形的辨識訓練教學案例上,紐約大學的手寫數字辨資料庫「MNIST」經常作為訓練的開放資料;透過「torchvision」也可以使用這個資料庫,作為訓練文字辨識類神經精神網路的使用。

  • 下載字元辨識資料

「MNIST」問題提供了7,0000 個手寫字元的灰階圖形資料,每個圖形由「28*28」的像素所組成;其中60,000 為訓練資料而10,000組則為測試資料;在這裡,我們將所有的圖形共分成 10 組字元目標,分別由「0」到「9」。可以先透過「torchvision」下載資料後,將前10個圖形資料及對映的字元列出。

raw-image
import torchvision
from torchvision import datasets
from torchvision.transforms import ToTensor
train_data=datasets.MNIST(root="mnistdata",train=True,download=True,
transform=ToTensor(),target_transform=None)
test_data = torchvision.datasets.MNIST(root = 'mnistdata', train = False,download=True,
transform=ToTensor())
print(train_data.train_data.size())
print(test_data.train_data.size())
#-----------
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(9,9))
rows,cols=1,10
for i in range(rows*cols):
fig.add_subplot(rows,cols,i+1)
plt.imshow(train_data.train_data[i].numpy(),cmap='gray')
plt.title('%i' % train_data.train_labels[i])
plt.axis(False)
plt.show()
  • 定義類神經網路

「MNIST」的資料可以使用多種方式來建立辨識機器,反饋類神經網路是其中之一。所以可以使用之前相同叢集類神經網路的方法來定義辨識模型;在這裡,參考紐約大學的作法,將中間層的節點數放大到 800。

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)

#------------
# set clustering neural networks
cluster_neurals=[]
for i in range(nType):
torch.manual_seed(13)
cluster_neurals.append(classNeural(28*28,800,1))
  • 執行迴圈指標工具安裝

因為大量圖形資料的處理往往需要耗費相當多的時間。為了避免在執行過程當中,終端螢幕或 iPad 上沒有任何反應,不知道執行進度而造成人為錯誤;因此,我會安裝一個好用的進度指標小工具「tqdm」來防呆;「tqdm」指的是「taqaddum」也就是阿拉伯語的「進度」的意思,它是一個相當好用的小工具可以使用在觀察程式執行進度。 我們可以在終端機環境上先安裝這個程式庫, 方便在程式執行的時候觀察訓練的進度.

pip install tqdm
  • 準備分批訓練的資料

由於「MNIST」提供的圖形資料量相當地大,為了增加類神經網路調整權重值的速度,同時進一步加速訓練的收歛;在訓練時,我們可以不必一開始就全部作為訓練之用;可以將資料進行「分批」,再進行訓練。PyTorch 提供了「DataLoader」類別方法來協助訓練資料的分批作業;我們將所有的訓練資料每100筆作為一批。

from torch.utils.data import DataLoader
#-------------
trainDataLoader = DataLoader(train_data.data,batch_size=100,shuffle=False)
trainLabelLoader = DataLoader(train_data.targets,batch_size=100,shuffle=False)
#------------
batchTraindata=iter(trainDataLoader)
batchLabel=iter(trainLabelLoader)
#------------
nType=len(train_data.classes)
nBatch=len(batchTraindata)
print('batch count:', nBatch)
  • 進行訓練

叢集類神經網路訓練的方法與之前的文章相同;所不同的是採用不過分批訓練作法,將每一批 (100筆資料) 先進行訓練,之後再換下一批資料來訓練;為了避免類神經網路過於「僵固」而不易訓練,每一批的訓練疊代次數會大量減少;在這裏我們每批訓練的疊代次數僅使用 5 次;再透過多批的資料訓練來趨近訓練目標。

from tqdm import tqdm

device=torch.device('cpu')
if(torch.cuda.is_available()):
device=torch.device('cuda')
#—————————————
nBatch=200
nEpoche=5
for ptBatch in tqdm(range(nBatch)):
Labels=next(batchLabel)
Images=next(batchTraindata)
#------------
Pixels=Images.flatten(start_dim=1,end_dim=2)
nData,nPixel=Pixels.shape
X_train=((Pixels-255/2.0)/(255)).to(device)
# set clustering targets
cluster_y_train=np.zeros((nType,nData,1))
for i in range(nData):
cluster_y_train[Labels[i],i,0]=1.0
cluster_Y_train=torch.tensor(cluster_y_train.astype('float32')).to(device)
#-------------
# training clustering neural network
for ptType in 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(nEpoche):
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())
  • 觀察訓練結果

訓練完之後,可以同樣地使用前10 組圖形資料來看看訓練的結果。

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

fig=plt.figure(figsize=(9,9))
rows,cols=1,10
for ix in range(rows*cols):
#---------- 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[test_data.targets[ix]]
#---------- plot
fig.add_subplot(rows,cols,ix+1)
plt.imshow(ImgInput.to('cpu'),cmap='gray')

plt.title(titlePred[0])
plt.axis(False)
plt.show()

同樣地,也可以使用隨機的測試資料來觀察訓練的結果。

raw-image
fig=plt.figure(figsize=(9,9))
rows,cols=1,10
random.seed(12)

for i in range(rows*cols):
ix=random.randint(0,500)
#---------- handle input tensor
ImgInput=(test_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=test_data.classes[int(labelPred)]
titleTarget=test_data.classes[test_data.targets[ix]]
#---------- plot
fig.add_subplot(rows,cols,i+1)
plt.imshow(ImgInput.to('cpu'),cmap='gray')

plt.title(titlePred[0])
plt.axis(False)
plt.show()
  • 小結

手寫圖形資料有相當程度的主觀性及不確定性;在實際應用上,車牌辨識或印刷體文字的圖形辨識相對一致而更容易執行,準確性也更高。另一方面,由於圖形辨識在實際應用時,會有不斷出現新的圖形資料;透過「分批」訓練的手法,可以在不需要重新訓練的前提下,不斷地更新類神經網路的辨識,達到「不斷學習」的效果。

留言
avatar-img
甘果的沙龍
5會員
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 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
從了解記憶的特性與侷限開始,發現如何利用分段學習與即時複習來強化知識的吸收與保存。我們還會學習靈活的單字與定義記憶技巧,以及間隔複習的方法來對抗遺忘。更進一步,探討睡眠、自信心與多樣化學習方式對記憶提升的影響,帶來更深刻的理解與實用建議,讓我們的學習事半功倍。
Thumbnail
從了解記憶的特性與侷限開始,發現如何利用分段學習與即時複習來強化知識的吸收與保存。我們還會學習靈活的單字與定義記憶技巧,以及間隔複習的方法來對抗遺忘。更進一步,探討睡眠、自信心與多樣化學習方式對記憶提升的影響,帶來更深刻的理解與實用建議,讓我們的學習事半功倍。
Thumbnail
在學習新單字時,字形拆解是一個有效的記憶方式。這種方法透過將新單字與熟悉的字形進行聯想,來增強我們的記憶能力。本文介紹了字形拆解的原理以及具體的應用實例,並強調了持續複習的重要性,以確保記憶的持久性。無論使用何種記憶方法,持之以恆的複習都是學習過程中不可或缺的一環。
Thumbnail
在學習新單字時,字形拆解是一個有效的記憶方式。這種方法透過將新單字與熟悉的字形進行聯想,來增強我們的記憶能力。本文介紹了字形拆解的原理以及具體的應用實例,並強調了持續複習的重要性,以確保記憶的持久性。無論使用何種記憶方法,持之以恆的複習都是學習過程中不可或缺的一環。
Thumbnail
透過自我測試和定期複習,我們可以強化大腦中的神經連結,達到更持久的記憶和更深刻的理解。除了介紹有效的學習方法,文章還提供了具體的實踐建議,如使用線上記憶卡、閉書回憶和問題筆記法來幫助學習。這些技巧能夠幫助我們擺脫低效的學習習慣,讓學習過程更加有系統且高效,並最終在實際應用中取得更好的成果。
Thumbnail
透過自我測試和定期複習,我們可以強化大腦中的神經連結,達到更持久的記憶和更深刻的理解。除了介紹有效的學習方法,文章還提供了具體的實踐建議,如使用線上記憶卡、閉書回憶和問題筆記法來幫助學習。這些技巧能夠幫助我們擺脫低效的學習習慣,讓學習過程更加有系統且高效,並最終在實際應用中取得更好的成果。
Thumbnail
在知識爆炸的時代,有效地吸收與應用閱讀中的信息對學習者來說是一大挑戰。本文探討了三種不同層次的讀書筆記方法,包括局部碎片化的九合一讀書筆記、全局概覽的心智圖筆記及結構內化的閱讀心得文章。這些方法不僅有助於記錄和整理信息,還能促進理解與記憶,幫助學習者將知識內化為智慧,提升學習效果和實用能力。
Thumbnail
在知識爆炸的時代,有效地吸收與應用閱讀中的信息對學習者來說是一大挑戰。本文探討了三種不同層次的讀書筆記方法,包括局部碎片化的九合一讀書筆記、全局概覽的心智圖筆記及結構內化的閱讀心得文章。這些方法不僅有助於記錄和整理信息,還能促進理解與記憶,幫助學習者將知識內化為智慧,提升學習效果和實用能力。
Thumbnail
本篇文章介紹如何使用心智圖和主動回憶的方式來提高讀書效率,包括製作心智圖、使用主動回憶背誦心智圖和進行間隔重複的讀書方法。這些方法可以幫助讀者更有效地學習,並且根據個人的學習節奏進行調整。
Thumbnail
本篇文章介紹如何使用心智圖和主動回憶的方式來提高讀書效率,包括製作心智圖、使用主動回憶背誦心智圖和進行間隔重複的讀書方法。這些方法可以幫助讀者更有效地學習,並且根據個人的學習節奏進行調整。
Thumbnail
這篇文章介紹了《深度學習的技術》中的五大學習部分:記憶力,理解力,知識網,拓展能力與生活應用。作者分享了對於這些學習部分的心得與建議,並提供了主題相關的書籍推薦及閱讀資料。
Thumbnail
這篇文章介紹了《深度學習的技術》中的五大學習部分:記憶力,理解力,知識網,拓展能力與生活應用。作者分享了對於這些學習部分的心得與建議,並提供了主題相關的書籍推薦及閱讀資料。
Thumbnail
先前整理了一篇《邏輯好與不好差在那裡?增強邏輯表現的12種方式》,發現「分析能力」很難用短短的幾行字讓人深入理解,因此興起了撰寫本篇文章的念頭。本文試著用更淺顯的方式,說明分析能力如何運作,期望讀者在深入瞭解之後可以應用在生活中,增強自我的分析能力。
Thumbnail
先前整理了一篇《邏輯好與不好差在那裡?增強邏輯表現的12種方式》,發現「分析能力」很難用短短的幾行字讓人深入理解,因此興起了撰寫本篇文章的念頭。本文試著用更淺顯的方式,說明分析能力如何運作,期望讀者在深入瞭解之後可以應用在生活中,增強自我的分析能力。
Thumbnail
你是否覺得,如果不將知識記在腦袋裡,就等於沒有學習?其實,當我們一再花費心力記憶知識,反而錯失了更多我們可以應用知識及思考的時間,【記憶】這件事,一開始做好,就夠了。
Thumbnail
你是否覺得,如果不將知識記在腦袋裡,就等於沒有學習?其實,當我們一再花費心力記憶知識,反而錯失了更多我們可以應用知識及思考的時間,【記憶】這件事,一開始做好,就夠了。
Thumbnail
先前有寫過一篇用練習,避免書讀不進腦袋的窘境。 https://www.dcard.tw/f/exam/p/241650600?cid=71168FB3-2D1D-4275-A5F5-F93D0A223903 我們還可以用什麼方法,讓自己的記憶更加深呢? 可以透過增加大腦「提取」資訊的次數。 大腦會
Thumbnail
先前有寫過一篇用練習,避免書讀不進腦袋的窘境。 https://www.dcard.tw/f/exam/p/241650600?cid=71168FB3-2D1D-4275-A5F5-F93D0A223903 我們還可以用什麼方法,讓自己的記憶更加深呢? 可以透過增加大腦「提取」資訊的次數。 大腦會
Thumbnail
心智圖筆記【一套簡潔高效的讀書筆記】 傳統的筆記方式,當知識累積越多,會越難有效整理利用。 根據「加工水平模型」,我們對知識的加工水平,會影響對知識的儲存與提取,越複雜、深層的加工,再日後越能提取利用。 因此,本篇作者L先生提出「知識卡片」的作法,透過六個步製作,讓大腦進行深層思考加工,自然而然記
Thumbnail
心智圖筆記【一套簡潔高效的讀書筆記】 傳統的筆記方式,當知識累積越多,會越難有效整理利用。 根據「加工水平模型」,我們對知識的加工水平,會影響對知識的儲存與提取,越複雜、深層的加工,再日後越能提取利用。 因此,本篇作者L先生提出「知識卡片」的作法,透過六個步製作,讓大腦進行深層思考加工,自然而然記
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News