深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)實(shí)現(xiàn)mnist手寫數(shù)字識(shí)別 | 第1天

7900本開(kāi)源電子書樱报,微信搜索 【K同學(xué)啊】 關(guān)注這個(gè)分享干貨的博主。
本文 GitHub https://github.com/kzbkzb/Python-AI 已收錄,有 Python、深度學(xué)習(xí)的資料以及我的系列文章。


我的環(huán)境:

  • 語(yǔ)言環(huán)境:Python3.6.5
  • 編譯器:jupyter notebook
  • 深度學(xué)習(xí)環(huán)境:TensorFlow2
  • 數(shù)據(jù)和代碼:??【傳送門】

來(lái)自專欄:【深度學(xué)習(xí)100例】

一、前期工作

1. 設(shè)置GPU(如果使用的是CPU可以忽略這步)

import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")

if gpus:
    gpu0 = gpus[0] #如果有多個(gè)GPU雕旨,僅使用第0個(gè)GPU
    tf.config.experimental.set_memory_growth(gpu0, True) #設(shè)置GPU顯存用量按需使用
    tf.config.set_visible_devices([gpu0],"GPU")

2. 導(dǎo)入數(shù)據(jù)

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

3. 歸一化

# 將像素的值標(biāo)準(zhǔn)化至0到1的區(qū)間內(nèi)。
train_images, test_images = train_images / 255.0, test_images / 255.0

train_images.shape,test_images.shape,train_labels.shape,test_labels.shape
"""
輸出:((60000, 28, 28), (10000, 28, 28), (60000,), (10000,))
"""

4. 可視化圖片

plt.figure(figsize=(20,10))
for i in range(20):
    plt.subplot(5,10,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(train_labels[i])
plt.show()
在這里插入圖片描述

5. 調(diào)整圖片格式

#調(diào)整數(shù)據(jù)到我們需要的格式
train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))

train_images.shape,test_images.shape,train_labels.shape,test_labels.shape
"""
輸出:((60000, 28, 28, 1), (10000, 28, 28, 1), (60000,), (10000,))
"""

二捧请、構(gòu)建CNN網(wǎng)絡(luò)模型

model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),#卷積層1凡涩,卷積核3*3
    layers.MaxPooling2D((2, 2)),                   #池化層1,2*2采樣
    layers.Conv2D(64, (3, 3), activation='relu'),  #卷積層2疹蛉,卷積核3*3
    layers.MaxPooling2D((2, 2)),                   #池化層2活箕,2*2采樣
    
    layers.Flatten(),                              #Flatten層,連接卷積層與全連接層
    layers.Dense(64, activation='relu'),           #全連接層可款,特征進(jìn)一步提取
    layers.Dense(10)                               #輸出層育韩,輸出預(yù)期結(jié)果
])
# 打印網(wǎng)絡(luò)結(jié)構(gòu)
model.summary()
image

三、編譯模型

"""
這里設(shè)置優(yōu)化器闺鲸、損失函數(shù)以及metrics
這三者具體介紹可參考我的博客:
https://blog.csdn.net/qq_38251616/category_10258234.html
"""
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

四筋讨、訓(xùn)練模型

"""
這里設(shè)置輸入訓(xùn)練數(shù)據(jù)集(圖片及標(biāo)簽)、驗(yàn)證數(shù)據(jù)集(圖片及標(biāo)簽)以及迭代次數(shù)epochs
關(guān)于model.fit()函數(shù)的具體介紹可參考我的博客:
https://blog.csdn.net/qq_38251616/category_10258234.html
"""
history = model.fit(train_images, train_labels, epochs=10, 
                    validation_data=(test_images, test_labels))
在這里插入圖片描述

五摸恍、預(yù)測(cè)

通過(guò)下面的網(wǎng)絡(luò)結(jié)構(gòu)我們可以簡(jiǎn)單理解為悉罕,輸入一張圖片,將會(huì)得到一組數(shù)立镶,這組代表這張圖片上的數(shù)字為0~9中每一個(gè)數(shù)字的幾率壁袄,out數(shù)字越大可能性越大旷余。

image

在這一步中部分同學(xué)會(huì)因?yàn)?matplotlib 版本原因報(bào) Invalid shape (28, 28, 1) for image data 的錯(cuò)誤提示,可以將代碼改為 plt.imshow(test_images[1].reshape(28,28)) 滚秩。

plt.imshow(test_images[1])
在這里插入圖片描述

輸出測(cè)試集中第一張圖片的預(yù)測(cè)結(jié)果

pre = model.predict(test_images) # 對(duì)所有測(cè)試圖片進(jìn)行預(yù)測(cè)
pre[1] # 輸出第一張圖片的預(yù)測(cè)結(jié)果

六景图、知識(shí)點(diǎn)詳解

本文使用的是最簡(jiǎn)單的CNN模型- -LeNet-5,如果是第一次接觸深度學(xué)習(xí)的話掠河,可以先試著把代碼跑通秋麸,然后再嘗試去理解其中的代碼心傀。

1. MNIST手寫數(shù)字?jǐn)?shù)據(jù)集介紹

MNIST手寫數(shù)字?jǐn)?shù)據(jù)集來(lái)源于是美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究所恼琼,是著名的公開(kāi)數(shù)據(jù)集之一妨蛹。數(shù)據(jù)集中的數(shù)字圖片是由250個(gè)不同職業(yè)的人純手寫繪制,數(shù)據(jù)集獲取的網(wǎng)址為:http://yann.lecun.com/exdb/mnist/(下載后需解壓)晴竞。我們一般會(huì)采用(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()這行代碼直接調(diào)用蛙卤,這樣就比較簡(jiǎn)單

MNIST手寫數(shù)字?jǐn)?shù)據(jù)集中包含了70000張圖片,其中60000張為訓(xùn)練數(shù)據(jù)噩死,10000為測(cè)試數(shù)據(jù)颤难,70000張圖片均是28*28,數(shù)據(jù)集樣本如下:

在這里插入圖片描述

如果我們把每一張圖片中的像素轉(zhuǎn)換為向量已维,則得到長(zhǎng)度為28*28=784的向量行嗤。因此我們可以把訓(xùn)練集看成是一個(gè)[60000,784]的張量,第一個(gè)維度表示圖片的索引垛耳,第二個(gè)維度表示每張圖片中的像素點(diǎn)栅屏。而圖片里的每個(gè)像素點(diǎn)的值介于0-1之間。

在這里插入圖片描述

2. 神經(jīng)網(wǎng)絡(luò)程序說(shuō)明

神經(jīng)網(wǎng)絡(luò)程序可以簡(jiǎn)單概括如下:


在這里插入圖片描述

3. 網(wǎng)絡(luò)結(jié)構(gòu)說(shuō)明

模型的結(jié)構(gòu)

在這里插入圖片描述

各層的作用

  • 輸入層:用于將數(shù)據(jù)輸入到訓(xùn)練網(wǎng)絡(luò)
  • 卷積層:使用卷積核提取圖片特征
  • 池化層:進(jìn)行下采樣堂鲜,用更高層的抽象表示圖像特征
  • Flatten層:將多維的輸入一維化栈雳,常用在卷積層到全連接層的過(guò)渡
  • 全連接層:起到“特征提取器”的作用
  • 輸出層:輸出結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缔莲,隨后出現(xiàn)的幾起案子哥纫,更是在濱河造成了極大的恐慌,老刑警劉巖酌予,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磺箕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抛虫,警方通過(guò)查閱死者的電腦和手機(jī)松靡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)建椰,“玉大人雕欺,你說(shuō)我怎么就攤上這事∶藿悖” “怎么了屠列?”我有些...
    開(kāi)封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)伞矩。 經(jīng)常有香客問(wèn)我笛洛,道長(zhǎng),這世上最難降的妖魔是什么乃坤? 我笑而不...
    開(kāi)封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任苛让,我火速辦了婚禮沟蔑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狱杰。我一直安慰自己瘦材,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布仿畸。 她就那樣靜靜地躺著食棕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪错沽。 梳的紋絲不亂的頭發(fā)上簿晓,一...
    開(kāi)封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音千埃,去河邊找鬼抢蚀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛镰禾,可吹牛的內(nèi)容都是我干的皿曲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吴侦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屋休!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起备韧,我...
    開(kāi)封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤劫樟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后织堂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體叠艳,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年易阳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了附较。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潦俺,死狀恐怖拒课,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情事示,我是刑警寧澤早像,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站肖爵,受9級(jí)特大地震影響卢鹦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜劝堪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一冀自、第九天 我趴在偏房一處隱蔽的房頂上張望谁榜。 院中可真熱鬧,春花似錦凡纳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至葛超,卻和暖如春暴氏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绣张。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工答渔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侥涵。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓沼撕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親芜飘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子务豺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容