基于tensorflow2.0的mnist数据集实战(CNN)

MNIST数据集简介:
MNIST数据集是用于训练邮政编码数字识别的数据集,其包括60000条训练数据与10000条测试数据,是Lecun与1998年制作的。每条数据样本都是28X28像素的。部分数据样本如下图所示:基于tensorflow2.0的mnist数据集实战(CNN)_第1张图片
他是NIST数据库的一个子集。MNIST数据库的官方下载网址为:
http://yann.lecun.com/exdb/mnist/

  1. 数据集的获取

对于数据集的获取可以从网站下载,也可以用tensorflow2.0中集成的keras高级API对其进行载入和计算。代码如下:

mnist=tf.keras.datasets.mnist
(x_train,y_train),(x_test,y_test)=mnist.load_data()
  1. 数据处理
    首先对label进行one-hot处理,之后用tf2.0自带的dataAPI进行打包,组合成train 与label的对应数据集。我们下载下来的数据集的张量形式为三维的,[x,28,28]但在CNN中数据张量形式为四维的,[batch,hight,width,channels],所以需要对原始数据进行增维处理
x_train=tf.expand_dims(x_train,-1) #-1表示增加的是第四维
x_test=tf.expand_dims(x_test,-1)
y_train=np.float32(tf.keras.utils.to_categorical(y_train,num_classes=10)
y_test=np.float32(tf.keras.utils.to_categorical(y_test,num_classes=10)
batch_size=512
train_dataset=tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(batch_size).shuffle(batch_size*10)
test_dataset=tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(batch_size)
#注:tf.expand_dims()为增加维度的函数,里面含有俩参数,第一个为
#需要增加维度的张量参数,第二个为增加维度的位置参数axis.当axis取正值是,
#从前往后数增加维度,取负值时倒着取。以[b,h,w,c]维度为例:

基于tensorflow2.0的mnist数据集实战(CNN)_第2张图片

  1. CNN模型的编写
    一个简单的CNN模型由卷积层、池化层、dropout层以及全连接层构成。一般将数据输入模型之间会进行正则化操作,常用BN层来实现。下面是模型代码:
input_xs=tf.keras.Input([28,28,1])
conv=tf.keras.layers.BatchNormalization()(input_xs)
conv=tf.keras.layers.Conv2D(32,3,padding='SAME',activation=tf.nn.relu)(conv)
conv=tf.keras.layers.Conv2D(64,3,padding='SAME',activation=tf.nn.relu)(conv)
conv=tf.keras.layers.MaxPool2D(strides=[1,1])(conv)
conv=tf.keras.layers.Conv2D(128,3,padding='SAME',activation=tf.nn.relu)(conv)
flat=tf.keras.layers.Flatten()(conv)
dense=tf.keras.layers.Dense(512,activation=tf.nn.relu)(flat)
logits=tf.keras.layers.Dense(10,activation=tf.nn.softmax)(dense)
model=tf.keras.Model(inputs=input_xs,outputs=logits)
print(model.summary())

打印结果如下
基于tensorflow2.0的mnist数据集实战(CNN)_第3张图片
基于tensorflow2.0的mnist数据集实战(CNN)_第4张图片
4. 完整代码如下:

import tensorflow as tf
import numpy as np
mnist=tf.keras.datasets.mnist
(x_train,y_train),(x_test,y_test)=mnist.load_data()
x_train,x_test=x_train/255.,x_test/255.
x_train=tf.expand_dims(x_train,-1) 
x_test=tf.expand_dims(x_test,-1)
y_train=np.float32(tf.keras.utils.to_categorical(y_train,num_classes=10)
y_test=np.float32(tf.keras.utils.to_categorical(y_test,num_classes=10)
batch_size=512
train_dataset=tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(batch_size).shuffle(batch_size*10)
test_dataset=tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(batch_size)
input_xs=tf.keras.Input([28,28,1])
conv=tf.keras.layers.BatchNormalization()(input_xs)
conv=tf.keras.layers.Conv2D(32,3,padding='SAME',activation=tf.nn.relu)(conv)
conv=tf.keras.layers.Conv2D(64,3,padding='SAME',activation=tf.nn.relu)(conv)
conv=tf.keras.layers.MaxPool2D(strides=[1,1])(conv)
conv=tf.keras.layers.Conv2D(128,3,padding='SAME',activation=tf.nn.relu)(conv)
flat=tf.keras.layers.Flatten()(conv)
dense=tf.keras.layers.Dense(512,activation=tf.nn.relu)(flat)
logits=tf.keras.layers.Dense(10,activation=tf.nn.softmax)(dense)
model=tf.keras.Model(inputs=input_xs,outputs=logits)
print(model.summary())
model.compile(optimizer=tf.optimizers.Adam(1e-3),
loss=tf.losses.categorical_crossentropy,
metrics=['accuracy'])
model.fit(train_dataset,epochs=10)
score=model.evaluate(test_dataset)
print('last score:',score)

运行结果就不再放出了,由于本人电脑比较旧,而且装的是CPU版本的tensorflow,运行很慢。强烈建议大家装GPU 版本的tensorflow.
本文到此结束。
感谢阅读。

你可能感兴趣的:(基于tensorflow2.0的mnist数据集实战(CNN))