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

甘果-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
留言分享你的想法!
avatar-img
甘果的沙龍
4會員
27內容數
作者從國內主要的半導體公司退休,重回校園唸書;開始第三人生。分享退休投資規劃、科技產業經驗以及校園學習點滴。
甘果的沙龍的其他內容
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
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 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