天天看点

Keras快速上手 ——学习笔记(一)端到端的MNIST训练数字识别端到端的MNIST训练数字识别

端到端的MNIST训练数字识别

下面介绍端到端的MNIST训练数字识别过程。

这个数据集是由LeCun Yang教授和他团队整理的,囊括了6万个训练集和1万个测试集。每个样本都是32×32的像素值,并且是黑白的,没有R、G、B三层。我们要做的是把每个图片分到0~9类别中。

下图是一些手写数字的样本

Keras快速上手 ——学习笔记(一)端到端的MNIST训练数字识别端到端的MNIST训练数字识别

接下来用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[].shape)
print(Y_train[])
           

输出:

3、对数据进行预处理

(1)对数据的维度进行转化,为我们需要的维度,其中astype是必须的,规定了浮点精度

(2)数据归一化 因为是图片,图层是0-255,所以就直接255归一

(3)对数据集进行热点化(one_hot)

X_train = X_train.reshape(X_train.shape[], , , ).astype('float32')
X_test = X_test.reshape(X_test.shape[], , , ).astype('float32')

X_train /= 
X_test /= 

def tran_y(y):
    y_ohe = np.zeros()
    y_ohe[y] = 
    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.add(Conv2D(filters=, kernel_size=(, ), strides=(, ), padding="same", input_shape=(, , ), activation="relu"))
model.add(MaxPooling2D(pool_size=(, )))
model.add(Dropout()

model.add(Conv2D(filters=, kernel_size=(, ), strides=(, ), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(, )))
model.add(Dropout())

model.add(Conv2D(filters=, kernel_size=(, ), strides=(, ), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(, )))
model.add(Dropout())

model.add(Flatten())
           

构建全连接神经网络

model.add(Dense(, activation = 'relu'))
model.add(Dense(, activation = 'relu'))
model.add(Dense(, activation = 'relu'))
model.add(Dense(, activation = 'softmax'))
           

添加损失函数,其中categorical_crossentropy是softmax相对应的损失函数,,在对稀疏的目标值预测时有用,优化器选择adagrad

adagrad说明链接https://blog.csdn.net/tsyccnh/article/details/76769232

metrics为性能评估方法,选择accuracy——准确率

model.compile(loss='categorical_crossentropy', optimizer= 'adagrad', metrics=['accuracy'])
           

指定训练集X,训练集Y, epochs为循环次数,batch_size为batch的大小

运行结果:

Train on  samples, validate on  samples
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
Epoch /
/ [==============================] - s ms/step - loss:  - acc:  - val_loss:  - val_acc: 
           

在测试集上评价模型的准确率

scores = model.evaluate(X_test, Y_test_ohe, verbose=)
print("Accuracy: %.2f%%"% (scores[]*100))
           

结果为

低于书上99%的准确率,推测可能是环境不一样(CPU笔记本),详细原因不明,知道的朋友帮忙解答一下

继续阅读