深度学习通常用于两种场景,一种是图像,一种是语音。本文讲解图像分类的Hello World程序:使用深度学习模型对手写体数字进行分类。
一、MNIST数据集介绍
MNIST数据集包含70000张手写数字的灰度图片,下面是其中的40张,我们需要训练一个深度学习模型用于识别这些手写数字。
二、数据处理
1、加载数据集
keras提供了很多有用方法,可以容易的加载常见的数据集,比如MNIST:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.datasets import mnist
# 将数据划分成训练数据(图片数据、标签)和测试数据(图片数据、标签)
(x_train, y_train), (x_test, y_test) = mnist.load_data()
MNIST包含70000张图片和标签,load_data()会将其中60,000张划入训练集,10,000张划入测试集。
- x_train:用于训练神经网络的图像
- y_train:正确的x_train图片标签,用于在训练期间评估模型的预测
- x_test:单独留出来的图像,用来在训练模型后测试模型的性能
- y_test:正确的x_test图像标签,用于在训练模型后评估模型的预测
2、数据预处理
为了方便处理,我们首先将图片数据展平,从28*28的二维数组变为长度为784的一维数组。
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
再对数据进行归一化。
x_train = x_train/255
x_test = x_test/255
将标签进行多分类编码。
num_categories = 10
y_train = keras.utils.to_categorical(y_train, num_categories)
y_test = keras.utils.to_categorical(y_test, num_categories)
三、创建模型
我们创建一个两层的网络,隐藏层的大小为512。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(units=512, activation='relu', input_shape=(784,)))
model.add(Dense(units=512, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.summary()
四、训练模型
编译并且训练五轮。
model.compile(loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=5, verbose=1, validation_data=(x_test, y_test))
五、进行推理
1、首先使用画图自己乱画一个数字
大小无所谓,背景黑色,铅笔用白色,保存。
2、读取图片
使用keras的工具读取上述图片为28*28的灰度图片。
from tensorflow.keras.preprocessing import image as image_utils
image = image_utils.load_img(r'e:/7.png', color_mode='grayscale', target_size=(28, 28))
image = image_utils.img_to_array(image)
image = image.reshape(1, 784)
3、进行推理
prediction = model.predict(image)
prediction
推理结果为多分类编码格式。
array([[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]], dtype=float32)
可以简单的转换成数字5。
import numpy as np
np.argmax(prediction)