动手学AI(7)识别手写数字

学编程语言第一课往往是学习打印"Hello World"。机器学习第一课是学习MNIST,通过搭建、训练一个神经网络,用于识别手写数字。

MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:

它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1。

在此例中,我们将训练一个机器学习模型用于预测图片里面的数字。

MNIST数据集

MNIST数据集的官网是Yann LeCun's website。数据集分成两部分:60000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test)。这样的切分很重要,在机器学习模型设计时必须有一个单独的测试数据集不用于训练而是用来评估这个模型的性能,从而更加容易把设计的模型推广到其他数据集上(泛化)。

每一张图片包含28像素X28像素。我们可以用一个数字数组来表示这张图片:

我们把这个数组展开成一个向量(数组),长度是28x28 = 784。也就是说,MNIST数据集的图片就是在784维向量空间里面的点。

现在,我们准备好可以开始构建我们的神经网络。在这里,我们将利用Keras搭建一个深度学习网络对mnist数据集进行识别。

整个代码分为三个部分:

数据准备

模型搭建

训练优化

让我们开始吧

首先先导入一些模块

import numpy as np

import matplotlib.pyplot as plt

from keras.datasets import mnist

from keras.models import Sequential

from keras.utils import np_utils

数据准备

我们通过keras自带的数据集mnist进行导入数据,然后对其归一化处理,并且将原二维数据变成一维数据,作为网络的输入。

(X_train, y_train), (X_test, y_test) = mnist.load_data();

你可以从网络上(https://s3.amazonaws.com/img-datasets/mnist.npz)下载数据集,然后用下面的代码导入到你的项目里面。

file=np.load("mnist.npz")

x_train,y_train=file['x_train'],file['y_train']

读入mnist数据集,并打印数据形状。每条样本是一个28*28的矩阵,共有60000个训练数据,10000个测试数据。

print(x_train.shape)

print(x_test.shape)

(60000, 28, 28)

(10000, 28, 28)

将一些样本图像打印出来看看

for i in range(9):

plt.subplot(3,3,i+1)

plt.imshow(X_train[i], cmap='gray', interpolation='none')

plt.title("Class {}".format(y_train[i]))

将二维数据变成一维数据

X_train = X_train.reshape(len(X_train), -1)

X_test = X_test.reshape(len(X_test), -1)

接下来对数据进行归一化。原来的数据范围是[0,255],我们通过归一化时靠近0附近。

# uint不能有负数,我们先转为float类型

X_train = X_train.astype('float32')

X_test = X_test.astype('float32')

x_train/=255

x_test/=255

input_shape=(img_rows,img_cols,1)

接下来One-hot encoding

nb_classes = 10

y_train = np_utils.to_categorical(y_train, nb_classes)

y_test = np_utils.to_categorical(y_test, nb_classes)

搭建网络

数据已经准备好了,接下来我们进行网络的搭建,我们的网络有三层,都是全连接网络,大概长的像这样

Dropout是一种防止过拟合(overfitting)的方法。

model = Sequential()

model.add(Dense(512, input_shape=input_shape, kernel_initializer='he_normal'))

model.add(Activation('relu'))

model.add(Dropout(0.2))

model.add(Dense(512, kernel_initializer='he_normal'))

model.add(Activation('relu'))

model.add(Dropout(0.2))

model.add(Dense(nb_classes))

model.add(Activation('softmax'))

OK!模型搭建好了,我们通过编译对学习过程进行配置

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

那么我们进行训练吧

model.fit(X_train, y_train, epochs=20, batch_size=64, verbose=1, validation_split=0.05)

训练完毕,测试

loss, accuracy = model.evaluate(X_test, y_test)

print('Test loss:', loss)

print('Accuracy:', accuracy)

10000/10000 [==============================] - 1s 80us/step

Accuracy: 0.9817

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181110G0093Q00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券