日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习数字仪表盘识别_深度学习之手写数字识别项目(Sequential方法amp;Class方法进阶版)...

發(fā)布時(shí)間:2023/12/15 pytorch 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习数字仪表盘识别_深度学习之手写数字识别项目(Sequential方法amp;Class方法进阶版)... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

此項(xiàng)目使用LeNet模型針對手寫數(shù)字進(jìn)行分類。項(xiàng)目中我們分別采用了順序式API和子類方法兩種方式構(gòu)建了LeNet模型訓(xùn)練mnist數(shù)據(jù)集,并編寫了給圖識物應(yīng)用程序用于手寫數(shù)字識別。

一、LeNet模型

LeNet由Yan?LeCun于20世紀(jì)90年代提出,主要用于手寫字符的識別與分類。受限于當(dāng)時(shí)大規(guī)模訓(xùn)練數(shù)據(jù)的缺乏,以及較低的計(jì)算機(jī)硬件性能,所以LeNet神經(jīng)網(wǎng)絡(luò)在當(dāng)時(shí)處理復(fù)雜問題的效果并不理想。但對于初學(xué)者來說,LeNet是一個(gè)比較理想的入門模型。

LeNet模型分為卷積層塊和全連接層塊兩個(gè)部分。下面我們分別介紹這兩個(gè)模塊。

卷積層塊里的基本單位是卷積層后接最大池化層:卷積層用來識別圖像里的空間模式,如線條和物體局部,之后的最大池化層則用來降低卷積層對位置的敏感性。卷積層塊由兩個(gè)這樣的基本單位重復(fù)堆疊構(gòu)成。

在卷積層塊中,每個(gè)卷積層都使用5×5的窗口,并在輸出上使用sigmoid激活函數(shù)。第一個(gè)卷積層輸出通道數(shù)為6,第二個(gè)卷積層輸出通道數(shù)則增加到16。這是因?yàn)榈诙€(gè)卷積層比第一個(gè)卷積層的輸入的高和寬要小,所以增加輸出通道使兩個(gè)卷積層的參數(shù)尺寸類似。卷積層塊的兩個(gè)最大池化層的窗口形狀均為2×2,且步幅為2。由于池化窗口與步幅形狀相同,池化窗口在輸入上每次滑動所覆蓋的區(qū)域互不重疊。

卷積層塊的輸出形狀為(批量大小, 通道, 高, 寬)。當(dāng)卷積層塊的輸出傳入全連接層塊時(shí),全連接層塊會將小批量中每個(gè)樣本變平(flatten)。也就是說,全連接層的輸入形狀將變成二維,其中第一維是小批量中的樣本,第二維是每個(gè)樣本變平后的向量表示,且向量長度為通道、高和寬的乘積。全連接層塊含3個(gè)全連接層。它們的輸出個(gè)數(shù)分別是120、84和10,其中10為輸出的類別個(gè)數(shù)。

二、順序API

tf.keras.Sequential模型可以讓你以更少的代碼和更優(yōu)雅的方式通過堆疊tf.keras.layers的方式定義Keras模型。因?yàn)橐?xùn)練一個(gè)分類器,我們可以用Keras模型的compile和fit方法來分別構(gòu)建訓(xùn)練循環(huán)并執(zhí)行它。

下面我們通過Sequential類來實(shí)現(xiàn)LeNet模型。代碼如下:

# 在 Sequential 中搭建網(wǎng)絡(luò)結(jié)構(gòu):定義卷積層、池化層,把輸入特征拉直為一維數(shù)組,即784個(gè)數(shù)值、定義網(wǎng)絡(luò)層、定義神經(jīng)元個(gè)數(shù)、定義激活函數(shù)model=tf.keras.models.Sequential([ tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), activation='sigmoid'), tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2), tf.keras.layers.Conv2D(filters=16, kernel_size=(5, 5), activation='sigmoid'), tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(120, activation='sigmoid'), tf.keras.layers.Dense(84, activation='sigmoid'), tf.keras.layers.Dense(10,activation='softmax')])

三、子類方法

Keras還提供了另一種定義模型的方法。這種方法是面向?qū)ο蟮那腋`活,但是更容易出錯(cuò),并且難以調(diào)試。實(shí)際中,可以通過在__init__中定義層并在call方法中前向傳遞的方式生成tf.keras.Model的子類。我們不推薦使用子類方法,因?yàn)樗鼘佣x和使用分開了,使得重構(gòu)代碼時(shí)容易出錯(cuò)。但是有時(shí)候只能用這種方法定義前向傳遞,尤其是當(dāng)使用循環(huán)神經(jīng)網(wǎng)絡(luò)時(shí)。

tf.keras.Model的子類Generator對象自身仍然是一個(gè)tf.keras.Model對象,因此,它可以用先前介紹的compile和fit方法來訓(xùn)練。

下面我們通過Class類來實(shí)現(xiàn)LeNet模型。代碼如下:

# 定義 LeNet 類class LeNet(Model): def __init__(self): super(LeNet, self).__init__() self.c1 = Conv2D(filters=6, kernel_size=(5, 5),?????????????????????????activation='relu') self.p1 = MaxPool2D(pool_size=(2, 2), strides=2) self.c2 = Conv2D(filters=16, kernel_size=(5, 5),?????????????????????????activation='relu') self.p2 = MaxPool2D(pool_size=(2, 2), strides=2) self.flatten = Flatten()????????self.f1?=?Dense(120,?activation='relu')????????self.f2?=?Dense(84,?activation='relu') self.f3 = Dense(10, activation='softmax') def call(self, x): x = self.c1(x) x = self.p1(x) x = self.c2(x) x = self.p2(x) x = self.flatten(x) x = self.f1(x) x = self.f2(x) y = self.f3(x) return ymodel = LeNet()

四、實(shí)施預(yù)測:識別手寫數(shù)字

TensorFlow給出了predict函數(shù),它可以根據(jù)輸入特征輸出預(yù)測結(jié)果。有了predict函數(shù),實(shí)現(xiàn)前向傳播執(zhí)行識圖應(yīng)用僅需三步:

第一步:復(fù)現(xiàn)模型(前向傳播),也就是用Sequential類或Class類搭建網(wǎng)絡(luò)。

第二步:加載參數(shù),也就是用load_weights讀取已有參數(shù)。

第三步:預(yù)測結(jié)果,也就是使用predict函數(shù),根據(jù)輸入特征輸出預(yù)測結(jié)果。

五、完整代碼實(shí)現(xiàn)及效果

本項(xiàng)目提供了構(gòu)建LeNet模型的兩種方法,分別是Sequential類方法和Class類方法。其中,Class類方法在原有LeNet模型的實(shí)現(xiàn)上做了改動,使用了relu激活函數(shù)代替了sigmoid激活函數(shù)。兩種方法的實(shí)現(xiàn)代碼以及它們各自實(shí)施預(yù)測的應(yīng)用程序代碼均已開源,可在文末處點(diǎn)擊

兩種實(shí)現(xiàn)方法分別迭代訓(xùn)練50次后,各自生成了保存有模型參數(shù)的文件以及保存有可訓(xùn)練參數(shù)的txt格式的文本。它們的acc&loss可視化效果如下圖1、2所示:

圖1 acc&loss曲線圖:使用sigmoid激活函數(shù)

圖2 acc&loss曲線圖:使用relu激活函數(shù)

六、總結(jié)

(一)本文介紹了LeNet模型,并為大家展示了利用Keras定義神經(jīng)網(wǎng)絡(luò)模型的兩種方法:Sequential類方法和Class類方法。

  • Sequential類方法定義模型代碼量更少、過程更加優(yōu)雅。

  • Class類方法定義模型是面向?qū)ο蟮那腋`活,但是更容易出錯(cuò),并且難以調(diào)試。

(二)本文的mnist數(shù)據(jù)集預(yù)處理沒有用到NumPy而是使用了eager執(zhí)行模式。代碼如下:

# compile方法需要Numpy數(shù)組作為輸入x_train=tf.expand_dims(x_train,-1).numpy()x_test=tf.expand_dims(x_test,-1).numpy()
  • tf.expand_dims(data,-1).numpy()展示了TensorFlow如何可以替代NumPy(有1:1的API兼容性)。通過用tf.expand_dims代替np.expand_dims,我們得到了相同的結(jié)果(在輸入的tensor添加了一個(gè)維度)

  • 這里我們創(chuàng)建了一個(gè)tf.Tensor對象,而不是一個(gè)np.array對象。但是,compile方法需要NumPy數(shù)組作為輸入,因此要用numpy()方法。每個(gè)tf.Tensor對象都有對應(yīng)的Tensor對象包含的NumPy值。

(三)本文完成了這個(gè)關(guān)于手寫數(shù)字識別的深度學(xué)習(xí)項(xiàng)目的全部過程。

  • mnist數(shù)據(jù)集預(yù)處理

  • 使用Sequential類和Class類分別搭建LeNet模型

  • 訓(xùn)練mnist數(shù)據(jù)集

  • 開發(fā)給圖識物應(yīng)用程序?qū)κ謱憯?shù)字進(jìn)行分類

想法丨發(fā)現(xiàn)丨科技丨人文

讓閱讀成為習(xí)慣,讓靈魂擁有溫度

總結(jié)

以上是生活随笔為你收集整理的深度学习数字仪表盘识别_深度学习之手写数字识别项目(Sequential方法amp;Class方法进阶版)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。