靜態(tài)頁面網(wǎng)站怎么做獨立網(wǎng)站怎么做
Python 深度學(xué)習(xí)項目:手寫數(shù)字識別
為了使機器更加智能,開發(fā)者們正在深入研究機器學(xué)習(xí)和深度學(xué)習(xí)技術(shù)。人類通過不斷練習(xí)和重復(fù)來學(xué)習(xí)執(zhí)行某項任務(wù),從而記住如何完成這些任務(wù)。然后,大腦中的神經(jīng)元會自動觸發(fā),他們能夠快速執(zhí)行已經(jīng)學(xué)到的任務(wù)。深度學(xué)習(xí)與此也非常相似。它使用不同類型的神經(jīng)網(wǎng)絡(luò)架構(gòu)來解決不同類型的問題,例如——對象識別、圖像和聲音分類、對象檢測、圖像分割等。
什么是手寫數(shù)字識別?
手寫數(shù)字識別是指計算機識別手寫數(shù)字的能力。這是一項對機器來說較為困難的任務(wù),因為手寫數(shù)字并不完美,可能有許多不同的書寫風(fēng)格。手寫數(shù)字識別為這個問題提供了解決方案,它使用數(shù)字的圖像來識別圖像中的數(shù)字。
關(guān)于 Python 深度學(xué)習(xí)項目
在本文中,我們將使用 MNIST 數(shù)據(jù)集實現(xiàn)一個手寫數(shù)字識別應(yīng)用程序。我們將使用一種特殊的深度神經(jīng)網(wǎng)絡(luò),即卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks)。最終,我們將構(gòu)建一個 GUI,你可以在這個界面上繪制數(shù)字,并立即識別它們。
預(yù)備知識
這個有趣的 Python 項目要求你具備 Python 編程的基本知識、使用 Keras 庫的深度學(xué)習(xí)知識,以及使用 Tkinter 庫構(gòu)建 GUI 的知識。
安裝必要的庫
使用以下命令安裝該項目所需的庫:
pip install numpy, tensorflow, keras, pillow
MNIST 數(shù)據(jù)集
這可能是機器學(xué)習(xí)和深度學(xué)習(xí)愛好者中最受歡迎的數(shù)據(jù)集之一。MNIST 數(shù)據(jù)集包含 60,000 張用于訓(xùn)練的手寫數(shù)字圖像(從 0 到 9),以及 10,000 張用于測試的圖像。因此,MNIST 數(shù)據(jù)集有 10 個不同的類別。手寫數(shù)字圖像以 28×28 矩陣的形式表示,每個單元格包含灰度像素值。
下載項目的完整源代碼
實現(xiàn)手寫數(shù)字識別項目
以下是實現(xiàn)手寫數(shù)字識別項目的步驟:
-
導(dǎo)入庫并加載數(shù)據(jù)集
首先,我們將導(dǎo)入訓(xùn)練模型所需的所有模塊。Keras 庫中已經(jīng)包含了一些數(shù)據(jù)集,MNIST 就是其中之一。因此,我們可以輕松地導(dǎo)入數(shù)據(jù)集并開始使用它。
mnist.load_data()
方法返回我們訓(xùn)練數(shù)據(jù)、其標簽以及測試數(shù)據(jù)和其標簽。import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras import backend as K # 訓(xùn)練和測試數(shù)據(jù)集 (x_train, y_train), (x_test, y_test) = mnist.load_data() print(x_train.shape, y_train.shape)
-
預(yù)處理數(shù)據(jù)
圖像數(shù)據(jù)不能直接輸入到模型中,因此我們需要執(zhí)行一些操作來處理數(shù)據(jù),使其準備好用于我們的神經(jīng)網(wǎng)絡(luò)。訓(xùn)練數(shù)據(jù)的維度是 (60000,28,28)。CNN 模型需要一個額外的維度,因此我們將矩陣重塑為 (60000,28,28,1) 的形狀。
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1) x_test = x_test.reshape(x_test.shape[0], 28, 28, 1) input_shape = (28, 28, 1) # 將類向量轉(zhuǎn)換為二進制類矩陣 y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 print('x_train shape:', x_train.shape) print(x_train.shape[0], '訓(xùn)練樣本') print(x_test.shape[0], '測試樣本')
-
創(chuàng)建模型
現(xiàn)在我們將在這個 Python 數(shù)據(jù)科學(xué)項目中創(chuàng)建我們的 CNN 模型。CNN 模型通常包含卷積層和池化層。它在處理以網(wǎng)格結(jié)構(gòu)表示的數(shù)據(jù)時效果更好,這也是為什么 CNN 用于圖像分類問題時表現(xiàn)良好的原因。Dropout 層用于停用一些神經(jīng)元,在訓(xùn)練過程中減少模型的過擬合。然后,我們將使用 Adadelta 優(yōu)化器編譯模型。
batch_size = 128 num_classes = 10 epochs = 10 model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(256, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation='softmax')) model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.Adadelta(),metrics=['accuracy'])
-
訓(xùn)練模型
Keras 的
model.fit()
函數(shù)將開始模型的訓(xùn)練。它需要訓(xùn)練數(shù)據(jù)、驗證數(shù)據(jù)、訓(xùn)練輪數(shù)(epochs)和批量大小(batch size)。訓(xùn)練模型需要一些時間。訓(xùn)練完成后,我們將權(quán)重和模型定義保存在 ‘mnist.h5’ 文件中。
hist = model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(x_test, y_test)) print("模型已成功訓(xùn)練") model.save('mnist.h5') print("將模型保存為 mnist.h5")
-
評估模型
我們的數(shù)據(jù)集中有 10,000 張圖像,這些圖像將用于評估我們的模型效果如何。測試數(shù)據(jù)沒有參與訓(xùn)練,因此對于我們的模型來說是全新的數(shù)據(jù)。MNIST 數(shù)據(jù)集平衡性很好,我們可以達到約 99% 的準確率。
score = model.evaluate(x_test, y_test, verbose=0) print('測試損失:', score[0]) print('測試準確率:', score[1])
-
創(chuàng)建用于預(yù)測數(shù)字的 GUI
為了創(chuàng)建 GUI,我們在一個新文件中構(gòu)建了一個交互式窗口,你可以在畫布上繪制數(shù)字,并通過一個按鈕識別數(shù)字。Tkinter 庫包含在 Python 標準庫中。我們創(chuàng)建了一個
predict_digit()
函數(shù),該函數(shù)接收圖像作為輸入,然后使用訓(xùn)練好的模型來預(yù)測數(shù)字。然后,我們創(chuàng)建了
App
類,該類負責(zé)構(gòu)建我們的應(yīng)用程序的 GUI。我們創(chuàng)建了一個畫布,可以在捕獲鼠標事件時進行繪制,通過一個按鈕觸發(fā)predict_digit()
函數(shù)并顯示結(jié)果。以下是我們的
gui_digit_recognizer.py
文件的完整代碼:from keras.models import load_model from tkinter import * import tkinter as tk import win32gui from PIL import ImageGrab, Image import numpy as npmodel = load_model('mnist.h5')def predict_digit(img):# 將圖像調(diào)整為 28x28 像素img = img.resize((28,28))# 將 RGB 轉(zhuǎn)換為灰度img = img.convert('L')img = np.array(img)# 重塑以支持模型輸入并歸一化img = img.reshape(1,28,28,1)img = img/255.0# 預(yù)測類別res = model.predict([img])[0]return np.argmax(res), max(res)class App(tk.Tk):def __init__(self):tk.Tk.__init__(self)self.x = self.y = 0# 創(chuàng)建元素self.canvas = tk.Canvas(self, width=300, height=300, bg = "white", cursor="cross")self.label = tk.Label(self, text="思考中..", font=("Helvetica", 48))self.classify_btn = tk.Button(self, text = "識別", command = self.classify_handwriting) self.button_clear = tk.Button(self, text = "清除", command = self.clear_all)# 網(wǎng)格結(jié)構(gòu)self.canvas.grid(row=0, column=0, pady=2, sticky=W, )self.label.grid(row=0, column=1,pady=2, padx=2)self.classify_btn.grid(row=1, column=1, pady=2, padx=2)self.button_clear.grid(row=1, column=0, pady=2)#self.canvas.bind("<Motion>", self.start_pos)self.canvas.bind("<B1-Motion>", self.draw_lines)def clear_all(self):self.canvas.delete("all")def classify_handwriting(self):HWND = self.canvas.winfo_id() # 獲取畫布的句柄rect = win32gui.GetWindowRect(HWND) # 獲取畫布的坐標im = ImageGrab.grab(rect)digit, acc = predict_digit(im)self.label.configure(text= str(digit)+', '+ str(int(acc*100))+'%')def draw_lines(self, event):self.x = event.xself.y = event.yr=8self.canvas.create_oval(self.x-r, self.y-r, self.x + r, self.y + r, fill='black')app = App() mainloop()
截圖
- Python 機器學(xué)習(xí)項目輸出為數(shù)字 2
- Python 機器學(xué)習(xí)項目輸出為數(shù)字 5
- Python 項目輸出為數(shù)字 6
總結(jié)
在本文中,我們成功構(gòu)建了一個 Python 深度學(xué)習(xí)項目——手寫數(shù)字識別應(yīng)用。我們構(gòu)建并訓(xùn)練了卷積神經(jīng)網(wǎng)絡(luò),該網(wǎng)絡(luò)在圖像分類方面非常有效。隨后,我們構(gòu)建了一個 GUI,你可以在畫布上繪制數(shù)字,然后對其進行分類并顯示結(jié)果。
參考資料
資料名稱 | 鏈接 |
---|---|
Keras 官方文檔 | https://keras.io/ |
TensorFlow 官方文檔 | https://tensorflow.google.cn/ |
MNIST 數(shù)據(jù)集介紹 | http://yann.lecun.com/exdb/mnist/ |
手寫數(shù)字識別教程 | https://data-flair.training/blogs/handwritten-digit-recognition/ |
Python GUI 開發(fā)概述 | https://docs.python.org/3/library/tkinter.html |
Tkinter 詳細介紹 | https://www.tutorialspoint.com/python/python_gui_programming.htm |
深度學(xué)習(xí)入門 | https://deeplearning.ai/ |
卷積神經(jīng)網(wǎng)絡(luò)入門 | https://cs231n.github.io/convolutional-networks/ |
機器學(xué)習(xí)基礎(chǔ) | https://www.coursera.org/courses?query=machine%20learning |
數(shù)據(jù)預(yù)處理技巧 | https://machinelearningmastery.com/preparing-data-for-deep-learning/ |
Python 項目示例 | https://github.com/data-flair-training-deep-learning/ |
手寫數(shù)字識別研究論文 | https://arxiv.org/abs/1509.06322 |
圖像識別技術(shù)綜述 | https://www.sunfounder.com/learn/opencv-101 |