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()
三、編譯模型
"""
這里設(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ù)字越大可能性越大旷余。
在這一步中部分同學(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é)果