主頁 >  其他 > 基于TensorFlow的Keras高級API實作手寫體數字識別

基于TensorFlow的Keras高級API實作手寫體數字識別

2021-10-29 09:10:55 其他

前言

這個專案的話我也是偶然在B站看到一個阿婆主(SvePana)在講解這個,跟著他的視頻敲的代碼并學習起來的,并寫在自己這里做個筆記也為大家提供代碼哈哈哈哈

一、Keras?

1.Keras簡介

Keras是由純python撰寫的基于theano/tensorflow的深度學習框架, Keras是一個高層神經網路API,支持快速實驗,能夠把你的idea迅速轉換為結果,如果有如下需求,可以優先選擇Keras,

2.為什么

目前Keras已經被TensorFlow收錄,添加到TensorFlow 中,成為其默認的框架,成為TensorFlow官方的高級API,Keras簡易和快速的原型設計(keras具有高度模塊化,極簡,和可擴充特性),用戶友好:Keras是為人類而不是天頂星人設計的API,用戶的使用體驗始終是我們考慮的首要和中心內容,Keras遵循減少認知困難的最佳實踐:Keras提供一致而簡潔的API, 能夠極大減少一般應用下用戶的作業量,同時,Keras提供清晰和具有實踐意義的bug反饋,

二、全連接神經網路實作

1.思路

匯入資料-------> 選擇模型------>設計神經網路------->編譯------->訓練權重引數------->預測

2.實作代碼

定義函式 train() 實作(匯入資料———>訓練權重引數),
定義函式 text() 實作 預測及輸出結果,

匯入資料mnist = tf.keras.datasets.mnist #匯入mnist
選擇模型model = tf.keras.models.Sequential()
有兩種型別的模型,序貫模型(Sequential)和函式式模型(Model),函式式模型應用更為廣泛,序貫模型是函式式模型的一種特殊情況,
序貫模型(Sequential) :單輸入單輸出,一條路通到底,層與層之間只有相鄰關系,沒有跨層連接,這種模型編譯速度快,操作也比較簡單;

設計神經網路

		tf.keras.layers.Flatten(input_shape=(28,28)),
        tf.keras.layers.Dense(512,activation='relu'),
        tf.keras.layers.Dense(128,activation='relu'),
        tf.keras.layers.Dense(10,activation='softmax',kernel_regularizer=tf.keras.regularizers.l2())

編譯

model.compile(optimizer = 優化器,

                        loss = 損失函式,

                        metrics = ["準確率”]')

訓練權重引數:

history = model.fit(x_train,y_train,batch_size=每次訓練圖片數量,epochs=訓練次數,
validation_data=(x_test,y_test),validation_freq=1,callbacks=[cp_callback])
model.summary()

train函式全部代碼

def train():
    mnist = tf.keras.datasets.mnist #匯入mnist
    (x_train,y_train),(x_test,y_test) = mnist.load_data() #分割
    x_train,x_test =x_train/255.0, x_test/255.0
    model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(28,28)),
        tf.keras.layers.Dense(512,activation='relu'),
        tf.keras.layers.Dense(128,activation='relu'),
        tf.keras.layers.Dense(10,activation='softmax',kernel_regularizer=tf.keras.regularizers.l2())])
    model.compile(optimizer= 'adam',
                  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
                  metrics=['sparse_categorical_accuracy'])#評價指標 categorical_accuracy和 sparse_categorical_accuracy
                  #注意修改路徑
    checkpoint_save_path="C:/Users/VULCAN/sxti/TEST/Disconnect_detection/mnist.ckpt"
    if os.path.exists(checkpoint_save_path + '.index'):
        print('------load the model--------')
        model.load_weights(checkpoint_save_path)
    cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,
                                                     save_weights_only=True,
                                                     save_best_only=True)#斷點續訓
    history = model.fit(x_train,y_train,batch_size=25,epochs=30,validation_data=(x_test,y_test),validation_freq=1,callbacks=[cp_callback])
    model.summary()
    
    #以下為列印訓練準確率及損失率等
    acc = history.history['sparse_categorical_accuracy']
    val_acc = history.history['val_sparse_categorical_accuracy']
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    f = Figure(figsize=(6,6),dpi=60)
    a = f.add_subplot(1,2,1)
    a.plot(acc,label = 'Training Accuracy')
    a.plot(val_acc,label = 'Validation Accuracy')#驗證精度
    a.legend()   
    b = f.add_subplot(1,2,2)
    b.plot(loss,label = 'Training Loss')
    b.plot(val_loss,label = 'Validation Loss')
    b.legend() 
    canvas = FigureCanvasTkAgg(f,master=root)
    canvas.draw()
    canvas.get_tk_widget().place(x=60,y=100)

test函式全部代碼

#預測結果列印
def text():
	#注意修改路徑與函式train上面保存的路徑一致
    model_save_path = "C:/Users/VULCAN/sxti/TEST/Disconnect_detection/mnist.ckpt"
    model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(28,28)),
        tf.keras.layers.Dense(512,activation='relu'),
        tf.keras.layers.Dense(128,activation='relu'),
        tf.keras.layers.Dense(10,activation='softmax',kernel_regularizer=tf.keras.regularizers.l2())])
    model.load_weights(model_save_path)
    for i in range(1):
        img = Image.open("tem2.png")
        #強制壓縮為28,28
        img = img.resize((28,28),Image.ANTIALIAS)
        #將原有影像轉換為灰度圖
        img_arr = np.array(img.convert("L"))
        #圖片反相
        for i in range(28):
            for  j in range(28):
                if img_arr[i][j]<100:
                    img_arr[i][j]=255
                else:
                    img_arr[i][j]= 0
        img_arr = img_arr/255.0
        x_predict = img_arr[tf.newaxis,...]
        result = model.predict(x_predict)
        pred = np.argmax(result , axis = 1)
        #在GUI界面顯示結果
        e4 = l = tk.Label(root,text = pred, bg="white",font=("Arial,12"),width=8)
        e4.place(x=990,y=440)

三、GUI設計

這部分我直接附上代碼并在代碼中作必要的注釋,

全部所需的庫函式:

#使用Tkinter前需要先匯入
import tkinter as tk
#匯入對話框模塊
import tkinter.filedialog
#創建畫布需要的庫
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
#創建工具列需要的庫
from matplotlib.backends.backend_tkagg import NavigationToolbar2Tk
#快捷鍵需要的模塊2
from matplotlib.backend_bases import key_press_handler
#匯入繪圖需要的模塊
from matplotlib.figure import Figure
import cv2
import tensorflow as tf
import os
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image,ImageTk

其他關于圖片檔案的匯入及攝像頭呼叫的函式定義代碼:

#調取攝像頭并拍攝圖片
def buttonl():
    capture = cv2.VideoCapture(0)   #cv2模塊調取攝像頭
    while(capture.isOpened()):
        ret,frame = capture.read() #ret表示捕獲是否成功
        frame = frame[:,80:560] #拍照默認為640*480
        cv2.imwrite("tem1.png",frame)
        dig_Gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        ref2,dig_Gray = cv2.threshold(dig_Gray,100,255,cv2.THRESH_BINARY)
        cv2.imwrite("tem2.png",dig_Gray)
        break
    global photo1,photo2
    #將圖片顯示到界面上
    img1 = Image.open("tem1.png")
    img1 = img1.resize((128,128))
    photo1 = ImageTk.PhotoImage(img1)
    l1 = tk.Label(root,bg="red",image = photo1).place(x=950,y=100)
    img2 = Image.open("tem2.png")
    img2 = img2.resize((128,128))
    photo2 = ImageTk.PhotoImage(img2)
    l2 = tk.Label(root,bg="red",image = photo2).place(x=950,y=250)
    
 #保存當前攝像頭畫面
def frame():
    capture = cv2.VideoCapture(0)
    #控制元件定義
    while(capture.isOpened()):
        ref,frame = capture.read()
        frame = frame[:,80:560]
        cvimage = cv2.cvtColor(frame,cv2.COLOR_BGR2RGBA)
        pilImage = Image.fromarray(cvimage)
        pilImage = pilImage.resize((360,360),Image.ANTIALIAS)
        tkImage = ImageTk.PhotoImage(image = pilImage)
        canvas.create_image(0,0,anchor = "nw",image = tkImage)
        root.update()
        root.after(10)
#選擇檔案
def select_pic():
    file_path = tk.filedialog.askopenfilename(title="選擇檔案",initialdir = (os.path.expanduser(r"")))
    image = Image.open(file_path)
    image.save("tem1.png")
    gray = image.convert("L")
    gray.save("tem2.png")
    global photo3,photo4
#將圖片顯示在界面上
    img3 = Image.open("tem1.png")
    img3 = image.resize((128,128))
    photo3 = ImageTk.PhotoImage(img3)
    l3 = tk.Label(root,bg="red",image = photo3).place(x=950,y=100)
    img4 = Image.open("tem2.png")
    img4 = img4.resize((128,128))
    photo4 = ImageTk.PhotoImage(img4)
    l4 = tk.Label(root,bg="red",image = photo4).place(x=950,y=250)

主函式部分:

if __name__ =='__main__':
    root = tk.Tk()
    #第二步,給視窗的可視化起名字
    root.title('手寫體數字識別')
    #第三步,設定視窗的大小(長*寬)
    root.geometry('1176x520')  #這里的乘是小x
    root.configure(bg = "#C0C0C0")
    f = Figure(figsize=(6,6), dpi=60)
    a=f.add_subplot(1,2,1)  #添加子圖:1行1列第一個
    a.plot(0,0)
    b=f.add_subplot(1,2,2)  #添加子圖,1行1列第二個
    b.plot(0,0)
    #將繪制的圖形顯示到tkinter:創建屬于root的canvas畫布,并將圖f置于畫布上 
    canvas=FigureCanvasTkAgg(f,master=root)
    canvas.draw()#注意show方法已經過時,改用draw
    canvas.get_tk_widget().place(x=60,y=100)
    b1 = tk.Button(root,text='訓練',bg='white',font=('Arial',12),width=12,height=1,command=train).place(x=168,y=35)
    b2 = tk.Button(root,text='拍照',bg='white',font=('Arial',12),width=12,height=1,command=frame).place(x=550,y=35)
    b3 = tk.Button(root,text='測驗',bg='white',font=('Arial',12),width=12,height=1,command=text).place(x=960,y=35)
    b4 = tk.Button(root,text='匯入圖片',bg='white',font=('Arial',12),width=12,height=1,command=select_pic).place(x=680,y=35)
    b5 = tk.Button(root,text='識別結果',font=('Arial',12),bg='white',command=text).place(x=990,y=400)
    canvas=tk.Canvas(root,bg="white",width=360,height=360)  #繪制畫布
    #控制元件位置設定
    canvas.place(x=500,y=100)
    b6=tk.Button(root,text="保存",bg="white",width=15,height=2,command=buttonl).place(x=620,y=420)
    #第六步,主視窗回圈顯示
    root.mainloop()

最后附上界面

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340634.html

標籤:AI

上一篇:FastAPI 學習之路(六十一)使用mysql資料庫替換sqlite資料庫

下一篇:人工智能之數學基礎篇—高等數學基礎中

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more