MNIST数据集是手写数字识别通用的数据集,其中的数据是以二进制的形式保存的,每个数字是由28*28的矩阵表示的。
我们使用卷积神经网络对这些手写数字进行识别,步骤大致为:
-
导入库和模块
我们导入Sequential模型(相当于放积木的桌子)from keras.models import Sequential
接下来,导入各种层(相当于形状各异的积木)
from keras.layers import Conv2D, MaxPool2D from keras.layers import Dense, Flatten
-
加载数据集
Mnist数据集可以使用keras直接加载。from keras.datasets import mnist (X_train, y_train), (X_test, y_test) = mnist.load_data()
查看数据集大小
print(X_train.shape) #(60000, 28, 28)
可以看出有60000个样本,每个样本是28*28像素的。
-
数据预处理
使用Keras是必须显式声明输入图像深度的尺寸。例如,具有所有3个RGB通道的全色图像的深度为3。我们的MNIST图像的深度为1,但我们必须明确声明。
也就是说,我们希望将数据集从形状(n,rows,cols)转换为(n,rows,cols,channels)。
img_x, img_y = X_train.shape[1], X_train.shape[2] X_train = X_train.reshape(X_train.shape[0], img_x, img_y, 1) X_test = X_test.reshape(X_test.shape[0], img_x, img_y, 1)
除此之外,我们将数据标准化一下:
X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train /= 255 X_test /= 255 y_train = keras.utils.to_categorical(y_train, num_classes=10) y_test = keras.utils.to_categorical(y_test, num_classes=10)
-
构建网络
model = Sequential() model.add(Conv2D(32, kernel_size=(5,5), activation='relu', input_shape=(img_x, img_y, 1))) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(64, kernel_size=(5,5), activation='relu')) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Flatten()) model.add(Dense(1000, activation='relu')) model.add(Dense(10, activation='softmax'))
6. 编译
现在,只需要编译模型,就可以开始训练了。当编译模型时,我们声明了损失函数和优化器(SGD,Adam等)。
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
-
训练
接下来,我们传入训练集进行训练model.fit(X_train, y_train, batch_size=128, epochs=10)
-
评估模型
最后,传入测试集对模型模型进行评估score = model.evaluate(X_test, y_test) print('acc', score[1]) # acc 0.9927
准确率达到99%以上。
完整代码如下:
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D
from keras.layers import Dense, Flatten
import keras
from keras.datasets import mnist
#加载数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
img_x, img_y = X_train.shape[1], X_train.shape[2]
#数据预处理
X_train = X_train.reshape(X_train.shape[0], img_x, img_y, 1)
X_test = X_test.reshape(X_test.shape[0], img_x, img_y, 1)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
y_train = keras.utils.to_categorical(y_train, num_classes=10)
y_test = keras.utils.to_categorical(y_test, num_classes=10)
#构建模型
model = Sequential()
model.add(Conv2D(32, kernel_size=(5,5), activation='relu', input_shape=(img_x, img_y, 1)))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Conv2D(64, kernel_size=(5,5), activation='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dense(10, activation='softmax'))
#模型编译
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
#训练
model.fit(X_train, y_train, batch_size=128, epochs=10)
#评估模型
score = model.evaluate(X_test, y_test)
print('acc', score[1])
原文地址:https://zhuanlan.zhihu.com/p/53790130
非常好一篇keras入门文章(有很多例子):https://xiaosheng.me/2017/07/04/article77/