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

更新於 2024/01/06閱讀時間約 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
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
Sequential Feature Selection(SFS) 用中文來解釋為,逐一特徵選取訓練,找出最重要的特徵,以提高模型的性能和效率 SFS 的一些用途包括: 維度縮減: 在高維度數據中,許多特徵可能是多餘或不重要的,使用 SFS 可以找到最能代表數據的特徵,從而減少計算和記憶體需求
Sequential Feature Selection(SFS) 用中文來解釋為,逐一特徵選取訓練,找出最重要的特徵,以提高模型的性能和效率 SFS 的一些用途包括: 維度縮減: 在高維度數據中,許多特徵可能是多餘或不重要的,使用 SFS 可以找到最能代表數據的特徵,從而減少計算和記憶體需求
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
Thumbnail
機器學習(Machine Learning,ML)已經在各個領域實現了令人印象深刻的成就,但同時也帶來了一系列重大的倫理挑戰。本文將深入探討這些挑戰,包括AI的偏見和公平性問題、隱私保護和數據安全,以及AI倫理的國際標準。 AI的偏見和公平性問題 1. 偏見的數據: ML模型的訓練數據可能包含偏
Thumbnail
在機器學習中,我們的目標是找到一種能夠最好地描述數據的模型。例如,在迴歸問題中,我們希望找到一種函數,該函數能以一種對我們的目標變數(例如:銷售量、股票價格等) 的最佳估計的方式,描述輸入特徵(例如:廣告支出、市場狀況等)。
Thumbnail
現在可以靠機器學習的演算法,幫助自己找到筆記中有價值的洞見了。近期 Obsidian 社群出現了一款非常有意思的插件 — Graph Analysis,它能依靠筆記之間的內部連結 (internal link) 計算相關性,讓我們在自己寫下的筆記中 “挖寶”。我發現這對於寫「人物筆記」非常有幫助,這
這篇文章主要是紀錄筆者在2022上半年尋找機器學習工程師(ML Engineer)的一些經驗和心得. 雖然網路上已經有非常多相關的資源和分享, 但鑑於在親身經歷的過程中仍舊學習到很多新的觀念和想法, 也受到非常多的幫助, 希望透過分享這些經驗能夠回饋給大家, 並或多或少的幫助有類似目標和想法的朋友.
Thumbnail
Google 一直致力於透過機器學習改善自家翻譯系統的準確度,利用人工智慧的力量提升機器翻譯品質,並於今年八月發表新機器學習模型 Universal Transformer。隨著機器學習模型不斷演進,AI 處理翻譯時的邏輯和策略也與真人譯者越來越相似。 原文連結
Thumbnail
兼回答觀眾來信問題 經過上一次的文章之後,棒棒的觀眾們依然有問題丟過來 有些觀眾的問題都滿認真的,也不好像其他節目一樣 在節目上講講就沒了,所以依然用文章的方式帶給大家一點東西。 我們先來看看觀眾疑問: 1. 是不是機器人預測的結果,都是依照revenue? 特徵是什麼? 特徵提取又是什麼?
Thumbnail
我之所以大膽的把股價預測稱之為「最強」,因為這本身就是一個可以變現的專案,並且可以同時累積數據分析及投資操作經驗,在投資與程式設計同時躍升為顯學的時代,把這兩條學習路徑融合在一起,似乎自然而然,也合情合理。當然,這條路的學習成本非常高,但翻山越嶺之後的美景也同樣讓人心神嚮往。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
Thumbnail
機器學習(Machine Learning,ML)已經在各個領域實現了令人印象深刻的成就,但同時也帶來了一系列重大的倫理挑戰。本文將深入探討這些挑戰,包括AI的偏見和公平性問題、隱私保護和數據安全,以及AI倫理的國際標準。 AI的偏見和公平性問題 1. 偏見的數據: ML模型的訓練數據可能包含偏
Thumbnail
在機器學習中,我們的目標是找到一種能夠最好地描述數據的模型。例如,在迴歸問題中,我們希望找到一種函數,該函數能以一種對我們的目標變數(例如:銷售量、股票價格等) 的最佳估計的方式,描述輸入特徵(例如:廣告支出、市場狀況等)。
Thumbnail
現在可以靠機器學習的演算法,幫助自己找到筆記中有價值的洞見了。近期 Obsidian 社群出現了一款非常有意思的插件 — Graph Analysis,它能依靠筆記之間的內部連結 (internal link) 計算相關性,讓我們在自己寫下的筆記中 “挖寶”。我發現這對於寫「人物筆記」非常有幫助,這
這篇文章主要是紀錄筆者在2022上半年尋找機器學習工程師(ML Engineer)的一些經驗和心得. 雖然網路上已經有非常多相關的資源和分享, 但鑑於在親身經歷的過程中仍舊學習到很多新的觀念和想法, 也受到非常多的幫助, 希望透過分享這些經驗能夠回饋給大家, 並或多或少的幫助有類似目標和想法的朋友.
Thumbnail
Google 一直致力於透過機器學習改善自家翻譯系統的準確度,利用人工智慧的力量提升機器翻譯品質,並於今年八月發表新機器學習模型 Universal Transformer。隨著機器學習模型不斷演進,AI 處理翻譯時的邏輯和策略也與真人譯者越來越相似。 原文連結
Thumbnail
兼回答觀眾來信問題 經過上一次的文章之後,棒棒的觀眾們依然有問題丟過來 有些觀眾的問題都滿認真的,也不好像其他節目一樣 在節目上講講就沒了,所以依然用文章的方式帶給大家一點東西。 我們先來看看觀眾疑問: 1. 是不是機器人預測的結果,都是依照revenue? 特徵是什麼? 特徵提取又是什麼?
Thumbnail
我之所以大膽的把股價預測稱之為「最強」,因為這本身就是一個可以變現的專案,並且可以同時累積數據分析及投資操作經驗,在投資與程式設計同時躍升為顯學的時代,把這兩條學習路徑融合在一起,似乎自然而然,也合情合理。當然,這條路的學習成本非常高,但翻山越嶺之後的美景也同樣讓人心神嚮往。