[機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_模型訓練篇

更新於 發佈於 閱讀時間約 10 分鐘

streamlit與github連動程式庫,呈現即時預測手寫英文字母

前言

此篇主要談論如何用CNN學習MNIST訓練出模型

若要看如何Streamlit程式範例 解說如下方連結

[機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_Streamlit Web應用程式篇

整理了一下,先前學的機器學習利用Colab來訓練出能辨識手寫A~Z英文字母的模型,使用的模型是CNN(Convolutional Neural Network,CNN)模型

訓練好的模型,當然是要拿來應用,成果呈現的方式由streamlit網頁呈現手寫英文字母按辨識,即可跑出辨識結果。

結果圖

raw-image

程式碼Github連結

如何連動github與stramlit可以參考一下這個文章解釋的蠻清楚的,我就不要班門弄斧了


Github上檔案說明

raw-image

streamlit 設定中會指定main file path,就是要連動github開啟哪一個檔案

raw-image

訓練模型的程式碼說明

載入資料

!pip install emnist
下載emnist手寫資料,詳細說明如下網址
https://pypi.org/project/emnist/
# pip install emnist
# Import Dataset(s)
from emnist import list_datasets
list_datasets()

會顯示出emnist有哪些類別的資料庫可以做使用

  1. balanced: 這個資料集是 EMNIST 的均衡版本,意味著每個字母類別的樣本數量相對平均。
  2. byclass: 按字母類別組織的資料集。每個字母類別都有自己的資料子集。
  3. bymerge: 將一些形狀相似的字母合併到一個類別。這是為了處理某些字母形狀相似度較高的情況。
  4. digits: 只包含數字的資料集,沒有字母。
  5. letters: 包含所有字母的資料集,但沒有數字。
  6. mnist: 是 MNIST 資料集的一個子集,只包含手寫數字。
#導入使用EMNIST Letters(包含A~Z)26類別的資料
from emnist import extract_training_samples
x_train, y_train = extract_training_samples('letters')
from emnist import extract_test_samples
x_test, y_test = extract_test_samples('letters')

載入EMNIST Letters(包含A~Z)26類別的資料 在拆分成測試與驗證集

import numpy as np
class_names = [chr(ord('A')+i) for i in range(26)]
''.join(class_names)
np.array(class_names)[y_train[0:26]]

將模型訓練數據集中前 26 個樣本的類別標籤轉換為對應的字母

  • chr(ord('A')+i) 會將 ASCII 碼中的 'A' 起始值加上索引 i,得到相應的字母。
  • for i in range(26) 用於迭代 i 從 0 到 25,以包含 A 到 Z 的所有字母。
  • class_names 這個列表最終包含了所有英文字母。
  • ''.join(class_names) 將列表中的字母用空字符串連接在一起,形成一個完整的字串,即 A 到 Z 的英文字母序列。
  • np.array(class_names) 將 class_names 轉換為 NumPy 陣列。
  • y_train[0:26] 取得 y_train 陣列的前 26 個元素。
  • np.array(class_names)[y_train[0:26]] 根據這些標籤從 class_names 中取得相應的字母。
# 顯示第1張圖片圖像
import matplotlib.pyplot as plt

# 第一筆資料
X2 = x_train[47,:,:]

# 繪製點陣圖,cmap='gray':灰階
plt.imshow(X2.reshape(28,28), cmap='gray')

# 隱藏刻度
plt.axis('off')

# 顯示圖形
plt.show()
raw-image

進行特徵工程

# 特徵縮放,使用常態化(Normalization),公式 = (x - min) / (max - min)
# 顏色範圍:0~255,所以,公式簡化為 x / 255
# 注意,顏色0為白色,與RGB顏色不同,(0,0,0) 為黑色。
x_train_norm, x_test_norm = x_train / 255.0, x_test / 255.0
x_train_norm[0]

這段程式碼進行了特徵縮放,使用的方法是歸一化(Normalization)。歸一化的目的是將特徵的值縮放到一個標準範圍,這裡是將顏色值(0~255)縮放到 0 到 1 之間。

建立模型結構

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout

# 建立模型
model = Sequential([
Conv2D(filters=32, kernel_size=3, activation='relu', input_shape=(28, 28, 1)),
MaxPooling2D(pool_size=2),
Conv2D(filters=64, kernel_size=3, activation='relu'),
MaxPooling2D(pool_size=2),
Flatten(),
Dense(units=64, activation='relu'),
Dropout(0.5),
Dense(units=26, activation='softmax')
])
# 設定優化器(optimizer)、損失函數(loss)、效能衡量指標(metrics)的類別
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])

Conv2D 層: 這是卷積層,用於從圖像中學習特徵。filters=32 表示使用 32 個卷積核,kernel_size=3 表示卷積核的大小是 3x3,activation='relu' 使用 ReLU 激活函數。

MaxPooling2D 層: 這是池化層,用於減小圖像的空間尺寸。pool_size=2 表示使用 2x2 的最大池化。

Flatten 層: 將卷積層和池化層的輸出攤平成一維數組,以便與全連接層相連接。

Dense 層 (全連接層): units=64 表示該層有 64 個神經元,activation='relu' 使用 ReLU 激活函數。

Dropout 層: 這是為了防止過擬合,丟棄 50% 的神經元。

Dense 層 (輸出層): units=26 表示輸出層有 26 個神經元activation='softmax' 使用 softmax 激活函數,這對應於多類別分類問題,每個神經元代表一個字母。

最使用 model.compile 配置模型的優化器(optimizer)、損失函數(loss)和效能衡量指標(metrics)。這裡使用了 Adam 優化器,稀疏分類交叉熵作為損失函數,衡量指標是準確度(accuracy)。模型已經建立完成,可以進行訓練了

history = model.fit(x_train_norm, y_train, epochs=100, batch_size=1000, validation_split=0.2)
  • x_train_norm 是經過歸一化的訓練資料,y_train 是相對應的訓練標籤。
  • epochs=100 指定了訓練的輪數,即模型將對整個訓練數據集進行 100 輪訓練。
  • batch_size=1000 定義了每次訓練更新的樣本數,即每次更新模型權重時,使用的樣本數量。
  • validation_split=0.2 表示將訓練數據的 20% 用於驗證,這有助於監控模型的性能。

評分

# 評分(Score Model)
score=model.evaluate(x_test_norm, y_test, verbose=0)

for i, x in enumerate(score):
print(f'{model.metrics_names[i]}: {score[i]:.4f}')

model.evaluate 方法返回模型的損失值和指定的評估指標值

預測

# 顯示第 9 筆的機率
import numpy as np

predictions = model.predict(x_test_norm[8:9])
print(f'0~9預測機率: {np.around(predictions, 2)}')

這段程式碼用於顯示模型對第9筆測試數據的預測機率。model.predict 方法用於獲得模型對輸入數據的預測結果,這裡你取第9筆數據

模型儲存

# 模型存檔
model.save('model.h5')




希望對大家有所幫助,動動小手按下愛心的圖案給點鼓勵



[機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_Streamlit Web應用程式篇

留言
avatar-img
留言分享你的想法!
螃蟹_crab-avatar-img
發文者
2024/01/06
avatar-img
螃蟹_crab的沙龍
141會員
253內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2024/05/18
感知器是一種基本的神經網路模型,用於二分類問題。它模擬了人腦神經元的工作原理,通過調整權重和偏差值來達到預測和分類的目的。 感知器流程 輸入 資料的輸入: 輸入層接受資料的輸入,每個輸入對應一個特徵,還有一個固定的偏差神經元。 資料經過每個神經元時,會乘上相應的
Thumbnail
2024/05/18
感知器是一種基本的神經網路模型,用於二分類問題。它模擬了人腦神經元的工作原理,通過調整權重和偏差值來達到預測和分類的目的。 感知器流程 輸入 資料的輸入: 輸入層接受資料的輸入,每個輸入對應一個特徵,還有一個固定的偏差神經元。 資料經過每個神經元時,會乘上相應的
Thumbnail
2024/01/06
本文會利用sklearn引入breast_cancer datasets來訓練,在處理數據的部份,特徵工程用兩種方式去做處理,分別是特徵選取與特徵萃取的方式去做比較。 特徵選取的方法中,使用了KNN 分類器來選出最重要的兩個特徵 特徵萃取的方法中,使用了PCA降維
Thumbnail
2024/01/06
本文會利用sklearn引入breast_cancer datasets來訓練,在處理數據的部份,特徵工程用兩種方式去做處理,分別是特徵選取與特徵萃取的方式去做比較。 特徵選取的方法中,使用了KNN 分類器來選出最重要的兩個特徵 特徵萃取的方法中,使用了PCA降維
Thumbnail
2024/01/06
前言 上一篇討論到如何訓練出模型,此篇將說明Streamlit建立的簡單Web應用程式的解說 Streamlit網頁App_貓狗辨識 連結 程式碼Github連結 [機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_模型訓練篇 如何連動github與stramlit可以參考
Thumbnail
2024/01/06
前言 上一篇討論到如何訓練出模型,此篇將說明Streamlit建立的簡單Web應用程式的解說 Streamlit網頁App_貓狗辨識 連結 程式碼Github連結 [機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_模型訓練篇 如何連動github與stramlit可以參考
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
本文介紹了人工智慧(AI)及機器學習(ML)的基本概念和關係,探討了數據在機器學習中的重要性,以及深度學習和生成式人工智慧的應用。
Thumbnail
本文介紹了人工智慧(AI)及機器學習(ML)的基本概念和關係,探討了數據在機器學習中的重要性,以及深度學習和生成式人工智慧的應用。
Thumbnail
呈上篇介紹如何訓練模型,此篇就主要介紹如何利用訓練好的模型來生成圖片 [深度學習][Python]DCGAN訓練生成手寫阿拉伯數字_生成篇 生成的結果 生成的圖片大小會根據,當初設置的生成器輸出大小來決定,當你使用生成對抗網絡(GAN)生成圖像時,生成器模型的最後一層通常會決定生成圖
Thumbnail
呈上篇介紹如何訓練模型,此篇就主要介紹如何利用訓練好的模型來生成圖片 [深度學習][Python]DCGAN訓練生成手寫阿拉伯數字_生成篇 生成的結果 生成的圖片大小會根據,當初設置的生成器輸出大小來決定,當你使用生成對抗網絡(GAN)生成圖像時,生成器模型的最後一層通常會決定生成圖
Thumbnail
本文將延續上一篇文章,經由訓練好的GAN模型中的生成器來生成圖片 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 [深度學習][Python]訓練CNN的GAN模型來生成圖片_訓練篇 相較之下CNN的GAN生成的效果比較好,但模型也相對比較複雜,訓練時間花的也比較
Thumbnail
本文將延續上一篇文章,經由訓練好的GAN模型中的生成器來生成圖片 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 [深度學習][Python]訓練CNN的GAN模型來生成圖片_訓練篇 相較之下CNN的GAN生成的效果比較好,但模型也相對比較複雜,訓練時間花的也比較
Thumbnail
這篇文章討論了自然語言處理技術的發展歷程,從語言模型的引入到深度學習的應用。作者觀察到現今GPT在產出中文國學內容時的深度不足,並提出了自然語言處理領域的倫理使用和版權問題,以及對大眾的影響。最後,作者探討了個人在自然語言領域的發展可能性。
Thumbnail
這篇文章討論了自然語言處理技術的發展歷程,從語言模型的引入到深度學習的應用。作者觀察到現今GPT在產出中文國學內容時的深度不足,並提出了自然語言處理領域的倫理使用和版權問題,以及對大眾的影響。最後,作者探討了個人在自然語言領域的發展可能性。
Thumbnail
筆記-曲博談AI模型.群聯-24.05.05 https://www.youtube.com/watch?v=JHE88hwx4b0&t=2034s *大型語言模型 三個步驟: 1.預訓練,訓練一次要用幾萬顆處理器、訓練時間要1個月,ChatGPT訓練一次的成本為1000萬美金。 2.微調(
Thumbnail
筆記-曲博談AI模型.群聯-24.05.05 https://www.youtube.com/watch?v=JHE88hwx4b0&t=2034s *大型語言模型 三個步驟: 1.預訓練,訓練一次要用幾萬顆處理器、訓練時間要1個月,ChatGPT訓練一次的成本為1000萬美金。 2.微調(
Thumbnail
語言模型與文字表示以不同的方式來分析自然語言的詞語分佈及語意關係。本文章簡要介紹了語言模型、Word2vec、FastText、GloVe和Transformer等技術,並提供了實際的應用參考點,幫助讀者深入理解自然語言處理的技術。
Thumbnail
語言模型與文字表示以不同的方式來分析自然語言的詞語分佈及語意關係。本文章簡要介紹了語言模型、Word2vec、FastText、GloVe和Transformer等技術,並提供了實際的應用參考點,幫助讀者深入理解自然語言處理的技術。
Thumbnail
這篇文章介紹瞭如何利用生成式AI(GenAI)來提高學習效率,包括文章重點整理、完善知識體系、客製化學習回饋、提供多元觀點等方法。同時提醒使用者應注意內容的信效度,保持學術誠信,適當運用GenAI能大幅提升工作效率。
Thumbnail
這篇文章介紹瞭如何利用生成式AI(GenAI)來提高學習效率,包括文章重點整理、完善知識體系、客製化學習回饋、提供多元觀點等方法。同時提醒使用者應注意內容的信效度,保持學術誠信,適當運用GenAI能大幅提升工作效率。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News