[機器學習]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
128會員
217內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
Sequential Feature Selection(SFS) 用中文來解釋為,逐一特徵選取訓練,找出最重要的特徵,以提高模型的性能和效率 SFS 的一些用途包括: 維度縮減: 在高維度數據中,許多特徵可能是多餘或不重要的,使用 SFS 可以找到最能代表數據的特徵,從而減少計算和記憶體需求
Sequential Feature Selection(SFS) 用中文來解釋為,逐一特徵選取訓練,找出最重要的特徵,以提高模型的性能和效率 SFS 的一些用途包括: 維度縮減: 在高維度數據中,許多特徵可能是多餘或不重要的,使用 SFS 可以找到最能代表數據的特徵,從而減少計算和記憶體需求
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
作為一名機器學習碩博士生,你的生活可能充滿了訓練模型的長時間等待、GPU 的卡頓、失控的超參數調整,甚至無窮無盡的 Debug。這些日常的壓力,難免會影響你的情緒,而與伴侶的爭吵也變得在所難免。 但即便如此,親密關係的穩定仍然能為你在學術研究中提供巨大支持。而我發現,長期穩定的親密關係
🌟 監督學習演算法(Supervised Learning Algorithms) 1️⃣ 線性回歸(Linear Regression) 應用場景:數值型預測,例如房價預測。 優勢: 簡單易懂,適合初學者。 對於線性關係的數據擬合效果佳。 局限: 無法處理非線性資料。 對異常值敏
最新研究顯示,生物演化的過程比傳統觀點更具可預測性。諾丁漢大學的研究團隊在《美國國家科學院院刊》(PNAS)上發表成果,運用機器學習技術分析細菌基因組,揭示了基因之間的確定性交互作用。研究表明,某些基因在特定環境中會引發可預測的生物反應,挑戰了演化隨機性的傳統觀點。
Thumbnail
**機器學習在蛋白質結構預測中的作用:AlphaFold 案例** 在藥物開發過程中,了解蛋白質的結構至關重要,因為蛋白質的形狀決定了它如何與其他分子互動。傳統方法需要耗費大量時間和資源,通過實驗方式解析蛋白質結構。AlphaFold 作為一款深度學習 AI 算法,突破了這一瓶頸。 **
Thumbnail
本文介紹了人工智慧(AI)及機器學習(ML)的基本概念和關係,探討了數據在機器學習中的重要性,以及深度學習和生成式人工智慧的應用。
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
https://www.youtube.com/watch?v=wjZofJX0v4M 這是我看過最好的AI科普影片了;現在流行的GPT使用的大語言模型 (large language model, LLM), 是把每一個單字都當作一個高維度向量 影片中GPT3共儲存50257個英文單字, 每
Thumbnail
這篇文章討論了自然語言處理技術的發展歷程,從語言模型的引入到深度學習的應用。作者觀察到現今GPT在產出中文國學內容時的深度不足,並提出了自然語言處理領域的倫理使用和版權問題,以及對大眾的影響。最後,作者探討了個人在自然語言領域的發展可能性。
Thumbnail
筆記-曲博談AI模型.群聯-24.05.05 https://www.youtube.com/watch?v=JHE88hwx4b0&t=2034s *大型語言模型 三個步驟: 1.預訓練,訓練一次要用幾萬顆處理器、訓練時間要1個月,ChatGPT訓練一次的成本為1000萬美金。 2.微調(
Thumbnail
前言 上一篇討論到如何訓練出模型,此篇將說明Streamlit建立的簡單Web應用程式的解說 Streamlit網頁App_貓狗辨識 連結 程式碼Github連結 [機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_模型訓練篇 如何連動github與stramlit可以參考
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
作為一名機器學習碩博士生,你的生活可能充滿了訓練模型的長時間等待、GPU 的卡頓、失控的超參數調整,甚至無窮無盡的 Debug。這些日常的壓力,難免會影響你的情緒,而與伴侶的爭吵也變得在所難免。 但即便如此,親密關係的穩定仍然能為你在學術研究中提供巨大支持。而我發現,長期穩定的親密關係
🌟 監督學習演算法(Supervised Learning Algorithms) 1️⃣ 線性回歸(Linear Regression) 應用場景:數值型預測,例如房價預測。 優勢: 簡單易懂,適合初學者。 對於線性關係的數據擬合效果佳。 局限: 無法處理非線性資料。 對異常值敏
最新研究顯示,生物演化的過程比傳統觀點更具可預測性。諾丁漢大學的研究團隊在《美國國家科學院院刊》(PNAS)上發表成果,運用機器學習技術分析細菌基因組,揭示了基因之間的確定性交互作用。研究表明,某些基因在特定環境中會引發可預測的生物反應,挑戰了演化隨機性的傳統觀點。
Thumbnail
**機器學習在蛋白質結構預測中的作用:AlphaFold 案例** 在藥物開發過程中,了解蛋白質的結構至關重要,因為蛋白質的形狀決定了它如何與其他分子互動。傳統方法需要耗費大量時間和資源,通過實驗方式解析蛋白質結構。AlphaFold 作為一款深度學習 AI 算法,突破了這一瓶頸。 **
Thumbnail
本文介紹了人工智慧(AI)及機器學習(ML)的基本概念和關係,探討了數據在機器學習中的重要性,以及深度學習和生成式人工智慧的應用。
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
https://www.youtube.com/watch?v=wjZofJX0v4M 這是我看過最好的AI科普影片了;現在流行的GPT使用的大語言模型 (large language model, LLM), 是把每一個單字都當作一個高維度向量 影片中GPT3共儲存50257個英文單字, 每
Thumbnail
這篇文章討論了自然語言處理技術的發展歷程,從語言模型的引入到深度學習的應用。作者觀察到現今GPT在產出中文國學內容時的深度不足,並提出了自然語言處理領域的倫理使用和版權問題,以及對大眾的影響。最後,作者探討了個人在自然語言領域的發展可能性。
Thumbnail
筆記-曲博談AI模型.群聯-24.05.05 https://www.youtube.com/watch?v=JHE88hwx4b0&t=2034s *大型語言模型 三個步驟: 1.預訓練,訓練一次要用幾萬顆處理器、訓練時間要1個月,ChatGPT訓練一次的成本為1000萬美金。 2.微調(
Thumbnail
前言 上一篇討論到如何訓練出模型,此篇將說明Streamlit建立的簡單Web應用程式的解說 Streamlit網頁App_貓狗辨識 連結 程式碼Github連結 [機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_模型訓練篇 如何連動github與stramlit可以參考