上一篇博文里,详细解说了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中文文档。