机器学习项目实战(六) MNIST数字分类

机器学习项目实战系列   MNIST数字分类

目录

机器学习项目实战系列   MNIST数字分类

一、概述

二、分析数据

1.数据导入

2.数据预处理

3.构建模型

4.训练模型

5.生成GUI进行预测


一、概述

MNIST数字分类python项目使机器能够识别手写数字,该项目对于计算机视觉可能非常有用,这里我们将使用MNIST数据集使用卷积神经网络训练模型。

数据集:MNIST数字识别数据集 https://drive.google.com/file/d/1hJiOlxctFH3uL2yTqXU_1f6c0zLr8V_K/view

机器学习项目实战(六) MNIST数字分类_第1张图片


二、分析数据

1.数据导入

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

# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

print(x_train.shape, y_train.shape)

机器学习项目实战(六) MNIST数字分类_第2张图片

2.数据预处理

分为训练集和测试集

机器学习项目实战(六) MNIST数字分类_第3张图片

3.构建模型

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'])

4.训练模型

hist = model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(x_test, y_test))
print("The model has successfully trained")

model.save('mnist.h5')
print("Saving the model as mnist.h5")

发现报了一个Error:Initializing libiomp5.dylib, but found libiomp5.dylib already initialized.

查了一下加了import os可以解决

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

机器学习项目实战(六) MNIST数字分类_第4张图片

机器学习项目实战(六) MNIST数字分类_第5张图片

机器学习项目实战(六) MNIST数字分类_第6张图片

5.生成GUI进行预测

from keras.models import load_model
from tkinter import *
import tkinter as tk
import win32gui
from PIL import ImageGrab, Image
import numpy as np

model = load_model('mnist.h5')

def predict_digit(img):
    #resize image to 28x28 pixels
    img = img.resize((28,28))
    #convert rgb to grayscale
    img = img.convert('L')
    img = np.array(img)
    #reshaping to support our model input and normalizing
    img = img.reshape(1,28,28,1)
    img = img/255.0
    #predicting the class
    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

        # Creating elements
        self.canvas = tk.Canvas(self, width=300, height=300, bg = "white", cursor="cross")
        self.label = tk.Label(self, text="Thinking..", font=("Helvetica", 48))
        self.classify_btn = tk.Button(self, text = "Recognise", command =         self.classify_handwriting) 
        self.button_clear = tk.Button(self, text = "Clear", command = self.clear_all)

        # Grid structure
        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("", self.start_pos)
        self.canvas.bind("", self.draw_lines)

    def clear_all(self):
        self.canvas.delete("all")

    def classify_handwriting(self):
        HWND = self.canvas.winfo_id() # get the handle of the canvas
        rect = win32gui.GetWindowRect(HWND) # get the coordinate of the canvas
        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.x
        self.y = event.y
        r=8
        self.canvas.create_oval(self.x-r, self.y-r, self.x + r, self.y + r, fill='black')

app = App()
mainloop()

模板代码生成了一个application,因为代码中有用到win32而我本地是Mac所以无法在本地真实演示,就上几张截图

机器学习项目实战(六) MNIST数字分类_第7张图片

 

 

你可能感兴趣的:(机器学习,机器学习,MNIST,实战)