MNIST数据集是机器学习领域中非常经典的一个数据集,也是Keras自带数据集,该数据集由60000个训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度手写数字图片。例如训练集中前20个样本图形为:
from keras.datasets import mnist
from keras.utils import to_categorical
(train_images,train_labels),(test_images,test_labels) = mnist.load_data()
train_images = train_images.reshape((60000,28,28,1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000,28,28,1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
from keras import layers
from keras import models
## Construct CNN
model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation='relu',input_shape = (28,28,1))) ## 只有第一层需要指定input_shape
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation='relu'))
model.summary()
## 3D -> 1D
## 最后要把图片预测为0~9中的数字,因此需要把卷积层拉直
model.add(layers.Flatten())
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(10,activation='softmax')) ## 最后要把图片预测为0~9中的数字,因此设为10个神经元,激活函数为softmax
model.summary()
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy', ## 多类分类问题,选择categorical_crossentropy为loss function
metrics=['accuracy'])
model.fit(train_images,train_labels,epochs=5,batch_size=64)
大量的卷积操作在CPU下运算速度很慢,如用GPU,每个Epoch速度可以提升约10倍。
test_loss,test_acc = model.evaluate(test_images,test_labels)
test_acc
## 看看预测结果,每张图片预测为一个10维的向量,预测标签为最大值对应的位置
model.predict(test_images)