Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集
之前載入s建立個python爬蟲實戰專欄,感興趣的小夥伴可以去看看,後面遇到比較好的網站也會持續更新。現在再建立個專欄Tensorflow2。0實戰,同樣會持續更新,今天以MNIST資料集為例,進行訓練,最後用訓練的模型進行預測自己手寫的數字。
MNIST資料集包含60000用於訓練的示例和10000個用於測試的資料,影象裡面的數字位於影象的中間位置,畫素大小28*28,向下面這張圖片一樣,顯示數字9
這裡使用tensorflow2。0進行講解,安裝方法可百度。tensorflow分為CPU、GPU版本,根據自己電腦的支援版本選擇安裝,能裝GPU版本的裝GPU版本,訓練速度快。奈何由於我的筆記本顯示卡受限,只裝了CPU版本。廢話不多說,看詳細的訓練過程吧
1、首先把這麼一堆庫匯入進去,輸出tensorflow版本2。0。1
from __future__ import absolute_import, division, print_function, unicode_literals
import matplotlib as mpl
import matplotlib。pyplot as plt
%matplotlib inline
import numpy as np
import pandas as pd
import os
import sys
import time
import tensorflow as tf
from tensorflow import keras
print(tf。__version__)
print(sys。version_info)
2、載入資料集,可以選擇線上載入,也可以選在將資料集下載到本地再載入,我選擇的是下載到本地。可根據連結自行下載資料集。
連結:
https://
pan。baidu。com/s/1cIUzGS
5MQeC9zr82Wqrukw
提取碼: 58nq
看下資料集的結構,輸出結果發現訓練集有60000張,畫素大小為28*28,並將訓練集拆分成訓練集和驗證集。前5000個數據為驗證集,後55000為訓練集。
# 下面一行是線上載入方式
# mnist = tf。keras。datasets。mnist
# 下面兩行是載入本地的資料集
datapath = r‘D:/pythonstudy/jupyter-notebook/mnist/mnist。npz’
(x_train, y_train), (x_test, y_test) = tf。keras。datasets。mnist。load_data(datapath)
print(x_train。shape)
print(y_train。shape)
x_valid,x_train=x_train[:5000],x_train[5000:]
y_valid,y_train=y_train[:5000],y_train[5000:]
顯示其中的一張圖片和對應標籤
def show_signal_image(img_arr):
plt。imshow(img_arr,cmap=‘binary’)
plt。show()
show_signal_image(x_train[1])
print(y_train[1])
觀察圖片陣列結構,發現是是由0-255數字組成,注意這裡圖片白色背景顯示的是0,注意這一點,後面對自己手寫的資料預測有幫助。
3、資料預處理,由於圖片陣列顯示的是0-255,所以這裡進行了預處理標準化,這裡使用自帶的庫StandardScaler
#x=(x-u)/std
from sklearn。preprocessing import StandardScaler
scaler=StandardScaler()
x_train_scaled=scaler。fit_transform(x_train。astype(np。float32)。reshape(-1,1))。reshape(-1,28,28)
x_valid_scaled=scaler。transform(x_valid。astype(np。float32)。reshape(-1,1))。reshape(-1,28,28)
x_test_scaled=scaler。transform(x_test。astype(np。float32)。reshape(-1,1))。reshape(-1,28,28)
4、模型搭建,由於MNIST資料集比較簡單,這裡沒有用到CNN卷積神經網路的卷積層和池化層,只進行了全連線層搭建。啟用函式選擇了relu,最佳化器選擇SGD
model=keras。models。Sequential([
keras。layers。Flatten(input_shape=[28, 28]),
keras。layers。Dense(300, activation=‘relu’),
keras。layers。Dense(100, activation=‘relu’),
keras。layers。Dense(10, activation=‘softmax’)
])
model。compile(optimizer=‘sgd’,
loss=‘sparse_categorical_crossentropy’,
metrics=[‘accuracy’])
對搭建的模型進行訓練,訓練訓練集和驗證集
history=model。fit(x_train_scaled,y_train,epochs=20,
validation_data=(x_valid_scaled,y_valid))
輸出訓練結果,可以發現訓練集準確度達到了98%
再來看下測試集,準確度也達到了97。8%
model。evaluate(x_test_scaled,y_test)
5、儲存模型並預測自己手寫的數字
儲存模型為。h5檔案,並使用load_model載入
predictios=model。save(‘mnist。h5’)
predictios=keras。models。load_model(‘mnist。h5’)
自己手寫了四個數字0,2,3,8,一一進行預測
import numpy as np
from PIL import Image
from sklearn。preprocessing import StandardScaler
scaler=StandardScaler()
im = Image。open(‘。/0。jpg’)
im=im。resize((28,28),Image。ANTIALIAS)
L = im。convert(‘L’)
im2 = np。array(L)
im2=np。array([255 - im2])#這裡用255減,是因為手寫的白色背景是255,與訓練集中不一致
im3=scaler。fit_transform(im2。astype(np。float32)。reshape(-1,1))。reshape(-1,28,28)
y=predictios。predict(im3)
print(y[0])
print(‘預測的圖片數字為:%s’%np。argmax(y[0]))
看下預測的結果
可以發現,預測的還是很準的。
歡迎評論和留言