keras实战(二)——手写数字识别

上一篇博文里,详细解说了keras线性回归的应用,容易看到,相比tensorflow,pytorch等,代码量少,容易快速搭建神经网络。本篇博文尝试用keras实现mnist手写数字的识别。

先说一下什么是mnist,mnist是一个经典的数据集,很多教程都会对它”下手”, 几乎成为一个 “典范”。mnist数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据.。

下面,我们就来看一下keras如何快速实现对mnist手写数字的识别。

导入需要的包

import numpy as np
np.random.seed(1337)  # for reproducibility
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop

导入mnist数据集

from keras.datasets import mnist

# download the mnist to the path '~/.keras/datasets/' if it is the first time to be called
# X shape (60,000 28x28), y shape (10,000, )
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# data pre-processing
X_train = X_train.reshape(X_train.shape[0], -1) / 255.   # normalize
X_test = X_test.reshape(X_test.shape[0], -1) / 255.      # normalize
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)

在keras.datesets里,自带了mnist数据集,可以直接导入,训练集有60000个样本,测试集有10000个样本,图片大小为28*28*1(黑白图片,所以是1)。X_train.reshape/255的目的是归一化,这样可以有更快的收敛速度。

我们可以将其中的一个样本的数据打印出来,以便更好的理解。

print(y_train[:3])
print(X_train[1].shape)

显示结果为:

(784,)
[[ 0.  0.  0.  0.  0.  1.  0.  0.  0.  0.]
 [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  1.  0.  0.  0.  0.  0.]]

下面,开始搭建网络,依旧是序贯模型:

model = Sequential([Dense(32,input_dim = 784),
                   Activation('relu'),
                    Dense(16),
                    Activation('relu'),
                   Dense(10),
                   Activation('softmax')])

使用rmsprop作为Optimizer

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

开始训练:

model.fit(X_train,y_train,epochs=10,batch_size=128)
Epoch 1/10
60000/60000 [==============================] - 8s 126us/step - loss: 0.5510 - acc: 0.8491
Epoch 2/10
60000/60000 [==============================] - 7s 119us/step - loss: 0.2481 - acc: 0.9287
Epoch 3/10
60000/60000 [==============================] - 7s 125us/step - loss: 0.2004 - acc: 0.9423
Epoch 4/10
60000/60000 [==============================] - 7s 122us/step - loss: 0.1714 - acc: 0.9499
Epoch 5/10
60000/60000 [==============================] - 9s 144us/step - loss: 0.1532 - acc: 0.9556
Epoch 6/10
60000/60000 [==============================] - 8s 132us/step - loss: 0.1390 - acc: 0.9593
Epoch 7/10
60000/60000 [==============================] - 10s 172us/step - loss: 0.1281 - acc: 0.9630
Epoch 8/10
60000/60000 [==============================] - 8s 125us/step - loss: 0.1185 - acc: 0.9648
Epoch 9/10
60000/60000 [==============================] - 8s 132us/step - loss: 0.1112 - acc: 0.9670
Epoch 10/10
60000/60000 [==============================] - 8s 135us/step - loss: 0.1040 - acc: 0.9687

容易观察到,在经历了10次迭代以后,准确率已经达到了0.9687,这是已经是一个相对满意的结果了。

再来看测试集准确率:

loss, accuracy = model.evaluate(X_test, y_test)
print('test loss: ', loss)
print('test accuracy: ', accuracy)
10000/10000 [==============================] - 2s 239us/step
test loss:  0.133446386367
test accuracy:  0.9613

测试集准确率高达0.9613,说明这已经是一个比较完美的分类器了。

搞定!!!第二个keras案例到此结束,如果有疑问,私信博主或者参考keras中文文档





猜你喜欢

转载自blog.csdn.net/cuicheng01/article/details/80298578