mnist手写数字数据集_Tensorflow2.0 CNN实战(1)-MNIST手写数据集

之前加载s创建个python爬虫实战专栏,感兴趣的小伙伴可以去看看,后面遇到比较好的网站也会持续更新。现在再创建个专栏Tensorflow2.0实战,同样会持续更新,今天以MNIST数据集为例,进行训练,最后用训练的模型进行预测自己手写的数字。

MNIST数据集包含60000用于训练的示例和10000个用于测试的数据,图像里面的数字位于图像的中间位置,像素大小28*28,向下面这张图片一样,显示数字9

dc80e2f49012bfc92e55b79912a2c055.png

这里使用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)

a43686b977f65ec436f185797e3dc050.png

2、加载数据集,可以选择线上加载,也可以选在将数据集下载到本地再加载,我选择的是下载到本地。可根据链接自行下载数据集。

链接: https://pan.baidu.com/s/1cIUzGS5MQeC9zr82Wqrukw 提取码: 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:]

3565259edd64d426250d8e1a666ae3b8.png

显示其中的一张图片和对应标签

def show_signal_image(img_arr):
    plt.imshow(img_arr,cmap='binary')
    plt.show()
show_signal_image(x_train[1])
print(y_train[1])

420de683f756600c847238e8a839be1d.png

观察图片数组结构,发现是是由0-255数字组成,注意这里图片白色背景显示的是0,注意这一点,后面对自己手写的数据预测有帮助。

c4ee297e34ffb34ea45131df7b97dfd9.png

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%

7e55e43e76a414650727fb0205227765.png

再来看下测试集,准确度也达到了97.8%

model.evaluate(x_test_scaled,y_test)

0b6c863d255c6435c51d0eea9c64d140.png

5、保存模型并预测自己手写的数字

保存模型为.h5文件,并使用load_model载入

predictios=model.save('mnist.h5')
predictios=keras.models.load_model('mnist.h5')

自己手写了四个数字0,2,3,8,一一进行预测

76a8bf4318bd8ba7798461886eb00f66.png
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]))

看下预测的结果

4d660a74ba529b8253a411ce6cd6d6f9.png

fbdd272bde01e60da2e6dd4a956e5630.png

96dc3185e7a2064d5f1d4f7bf11a64f0.png

837a6cabb164ea09cb63553e8179a00b.png

可以发现,预测的还是很准的。

欢迎评论和留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值