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

甘果-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
4會員
20內容數
作者從國內主要的半導體公司退休,重回校園唸書;開始第三人生。分享退休投資規劃、科技產業經驗以及校園學習點滴。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
甘果的沙龍 的其他內容
本篇文章探討瞭如何透過叢集類神經網路對圖形資料進行分類。叢集類神經網路針對多個相互獨立的分類目標,提升訓練收斂速度。文中說明介紹了叢集類神經網路的建立和訓練過程,最終達成準確的分類預測。透過這種方法,即使處理複雜的分類問題,也能保持較高的訓練效率和準確度。
本文介紹使用 PyTorch 及類神經網路進行圖形資料集的分類。Fashion-MNIST 提供了機器學習研究上的著名範例;服飾的灰階圖像的分類。本文指導讀者從安裝 torchvision 到建立類神經網路,進行圖形分類的完整過程。也詳述了資料處理及訓練過程,幫助理解類神經網路在圖形分類上的應用。
本文探討類神經網路在多元分類問題的應用,以scikit-learn 程式庫中的鳶尾花分類問題為例。該問題涉及三種不同的鳶尾花分類,並詳細說明瞭資料整理、類神經網路的建立及訓練過程,最終達到高準確率的預測結果。本文將幫助讀者理解如何應用類神經網路、PyTorch 及 CUDA 來進行高效的模型訓練。
本文說明反饋類神經網路在機器學習中解決非線性分類問題的方法,並以「PyTorch/CUDA」作為實現工具。介紹如何使用「scikit-learn」生成二元分類問題的數據,將訓練資料轉換為PyTorch/CUDA可用的格式,並搭建類神經網路進行訓練與測試;可用於有效解決各項機器學習的分類問題。
本文介紹如何利用 PyTorch 和 CUDA,建立多變數類神經網路模型。特別的,文章以「Himmelblau function」為例,探討資料正規化及訓練資料型態轉換的過程,並說明如何在 GPU 上訓練類神經網路。分析訓練誤差值及模型的收斂情況,希望幫助讀者深入理解多變數類神經網路的應用與挑戰。
本文將介紹如何在NVIDIA Jetson 人工智慧平台上,利用PyTorch和CUDA實現反饋類神經網路的運算。探討如何將運算任務從 CPU 轉移到 GPU,包括數據搬移和網路訓練的步驟。內容涵蓋建立類神經網路、確認 CUDA裝置、有效地在GPU上進行訓練和運算,充分利用 GPU 的加速優勢。
本篇文章探討瞭如何透過叢集類神經網路對圖形資料進行分類。叢集類神經網路針對多個相互獨立的分類目標,提升訓練收斂速度。文中說明介紹了叢集類神經網路的建立和訓練過程,最終達成準確的分類預測。透過這種方法,即使處理複雜的分類問題,也能保持較高的訓練效率和準確度。
本文介紹使用 PyTorch 及類神經網路進行圖形資料集的分類。Fashion-MNIST 提供了機器學習研究上的著名範例;服飾的灰階圖像的分類。本文指導讀者從安裝 torchvision 到建立類神經網路,進行圖形分類的完整過程。也詳述了資料處理及訓練過程,幫助理解類神經網路在圖形分類上的應用。
本文探討類神經網路在多元分類問題的應用,以scikit-learn 程式庫中的鳶尾花分類問題為例。該問題涉及三種不同的鳶尾花分類,並詳細說明瞭資料整理、類神經網路的建立及訓練過程,最終達到高準確率的預測結果。本文將幫助讀者理解如何應用類神經網路、PyTorch 及 CUDA 來進行高效的模型訓練。
本文說明反饋類神經網路在機器學習中解決非線性分類問題的方法,並以「PyTorch/CUDA」作為實現工具。介紹如何使用「scikit-learn」生成二元分類問題的數據,將訓練資料轉換為PyTorch/CUDA可用的格式,並搭建類神經網路進行訓練與測試;可用於有效解決各項機器學習的分類問題。
本文介紹如何利用 PyTorch 和 CUDA,建立多變數類神經網路模型。特別的,文章以「Himmelblau function」為例,探討資料正規化及訓練資料型態轉換的過程,並說明如何在 GPU 上訓練類神經網路。分析訓練誤差值及模型的收斂情況,希望幫助讀者深入理解多變數類神經網路的應用與挑戰。
本文將介紹如何在NVIDIA Jetson 人工智慧平台上,利用PyTorch和CUDA實現反饋類神經網路的運算。探討如何將運算任務從 CPU 轉移到 GPU,包括數據搬移和網路訓練的步驟。內容涵蓋建立類神經網路、確認 CUDA裝置、有效地在GPU上進行訓練和運算,充分利用 GPU 的加速優勢。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
數據分析是現代社會的核心技能,適用於各行各業。無論是在市場營銷、財務管理,還是產品開發中,數據分析都扮演著至關重要的角色。提升數據敏感度有助於提高分析的準確性和效率,使我們能夠迅速找到關鍵信息,進而做出明智的決策。本文將探討數據分析訓練方法,提供實用案例,幫助初學者快速掌握數據分析技術。
  嗯……這篇是類疊跟設問的場合。也是快變成國文課的場合。 ❈❈❈   ※類疊法:   接二連三地反覆使用相同的一個字詞、語句。可增加文章的節奏感,凸顯文章的重點。   讓句型更加生動,避免枯燥,任何詞性都可以被重疊。名詞重疊常表示數量龐大;動詞重疊表示動作的進行;形容詞或副詞的重疊表示委婉
本文介紹了在深度學習中使用Batch Normalization來解決error surface複雜性的問題。通過特徵歸一化來加速收斂速度和訓練順利程度。同時,也提到了在測試階段使用moving average計算平均值和標準差的方法。
瞭解如何透過Regression實作Classification,使用one-hot vector表示不同的類別,並透過乘上不同的Weight和加上不同的bias來得到三個數值形成向量。同時通過softmax的方式得到最終的y'值,並探討使用Cross-entropy來計算類別的loss。
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
數據分析是現代社會的核心技能,適用於各行各業。無論是在市場營銷、財務管理,還是產品開發中,數據分析都扮演著至關重要的角色。提升數據敏感度有助於提高分析的準確性和效率,使我們能夠迅速找到關鍵信息,進而做出明智的決策。本文將探討數據分析訓練方法,提供實用案例,幫助初學者快速掌握數據分析技術。
  嗯……這篇是類疊跟設問的場合。也是快變成國文課的場合。 ❈❈❈   ※類疊法:   接二連三地反覆使用相同的一個字詞、語句。可增加文章的節奏感,凸顯文章的重點。   讓句型更加生動,避免枯燥,任何詞性都可以被重疊。名詞重疊常表示數量龐大;動詞重疊表示動作的進行;形容詞或副詞的重疊表示委婉
本文介紹了在深度學習中使用Batch Normalization來解決error surface複雜性的問題。通過特徵歸一化來加速收斂速度和訓練順利程度。同時,也提到了在測試階段使用moving average計算平均值和標準差的方法。
瞭解如何透過Regression實作Classification,使用one-hot vector表示不同的類別,並透過乘上不同的Weight和加上不同的bias來得到三個數值形成向量。同時通過softmax的方式得到最終的y'值,並探討使用Cross-entropy來計算類別的loss。
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。