之前載入s建立個python爬蟲實戰專欄,感興趣的小夥伴可以去看看,後面遇到比較好的網站也會持續更新。現在再建立個專欄Tensorflow2。0實戰,同樣會持續更新,今天以MNIST資料集為例,進行訓練,最後用訓練的模型進行預測自己手寫的數字。

MNIST資料集包含60000用於訓練的示例和10000個用於測試的資料,影象裡面的數字位於影象的中間位置,畫素大小28*28,向下面這張圖片一樣,顯示數字9

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

這裡使用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)

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

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:]

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

顯示其中的一張圖片和對應標籤

def show_signal_image(img_arr):

plt。imshow(img_arr,cmap=‘binary’)

plt。show()

show_signal_image(x_train[1])

print(y_train[1])

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

觀察圖片陣列結構,發現是是由0-255數字組成,注意這裡圖片白色背景顯示的是0,注意這一點,後面對自己手寫的資料預測有幫助。

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

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%

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

再來看下測試集,準確度也達到了97。8%

model。evaluate(x_test_scaled,y_test)

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

5、儲存模型並預測自己手寫的數字

儲存模型為。h5檔案,並使用load_model載入

predictios=model。save(‘mnist。h5’)

predictios=keras。models。load_model(‘mnist。h5’)

自己手寫了四個數字0,2,3,8,一一進行預測

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

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]))

看下預測的結果

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

Tensorflow2.0 CNN實戰(1)-MNIST手寫資料集

可以發現,預測的還是很準的。

歡迎評論和留言