端到端的MNIST训练数字识别
下面介绍端到端的MNIST训练数字识别过程。
这个数据集是由LeCun Yang教授和他团队整理的,囊括了6万个训练集和1万个测试集。每个样本都是32×32的像素值,并且是黑白的,没有R、G、B三层。我们要做的是把每个图片分到0~9类别中。
下图是一些手写数字的样本
接下来用Keras搭建卷积网络训练模型。
1、导入数据和keras卷积模块
快速开始序贯(Sequential)模型 序贯模型是多个网络层的线性堆叠,也就是“一条路走到黑”。 可以通过向 Sequential 模型传递一个layer的list来构造该模型: from keras.models import Sequential from keras.layers import Dense, Activation model = Sequential([ De
import numpy as np
from keras.datasets import mnist # 数据集
# 导入keras的卷积模块
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
先读入数据,看一下数据集长什么样子
没有下载过的可能要等一段时间下载
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
print(X_train[0].shape)
print(Y_train[0])
输出:
(28, 28)
5
3、对数据进行预处理
(1)对数据的维度进行转化,为我们需要的维度,其中astype是必须的,规定了浮点精度
(2)数据归一化 因为是图片,图层是0-255,所以就直接255归一
(3)对数据集进行热点化(one_hot)
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32')
X_train /= 255
X_test /= 255
def tran_y(y):
y_ohe = np.zeros(10)
y_ohe[y] = 1
return y_ohe
Y_train_ohe = np.array([tran_y(Y_train[i]) for i in range(len(Y_train))])
Y_test_ohe = np.array([tran_y(Y_test[i]) for i in range(len(Y_test))])
4、构建模型
选用Sequential方法构建,然后不断放入神经层。
(1)第一层是卷积层,过滤器filters为64个,过滤器大小为3x3,步幅为1x1,填充成相同的大小,输入层的形状为(28, 28, 1),在第一次输入数据的时候这个参数input_shape是必须的,后面的不再需要。激活函数选用relu。
(2)第二层是最大池,池化器大小为2x2。
(3)第三个是随机失活dropout,目的是为了防止过拟合,选用0.5意思是随机失活该层50%的节点。
(4)接下来重复构建。
(5)最后展平节点
model = Sequential()
model.