引言
你有没有想过,电脑是怎么识别手写数字的?其实用深度学习里的多层感知器(MLP)就能实现!今天咱们就用简单的代码,手把手教你搭建一个识别手写数字的模型,小白也能轻松跟上~
准备工作:导入相关包
首先,我们需要导入一些 “工具包”,就像做饭要准备厨具一样。这些包能帮我们完成数据加载、模型搭建等操作。
import numpy as npfrom keras.datasets import mnistfrom matplotlib import pyplot as pltfrom keras.utils import to_categoricalfrom keras.models import Sequentialfrom keras.layers import Dense, Flatten
这里numpy是处理数值计算的,mnist是手写数字数据集,pyplot用来画图,to_categorical帮我们处理标签,Sequential和Dense、Flatten用来搭建神经网络。
加载数据:获取手写数字数据集
我们要用到 MNIST 手写数字数据集,它里面有好多手写的 0-9 数字图片。用下面的代码加载数据:
path = 'D:/其他/AIPM实战营/AI人工智能从入门到精通/mnist.npz'(X_train, y_train), (X_test, y_test) = mnist.load_data(path)print(X_train.shape, y_train.shape)print(X_test.shape, y_test.shape)
X_train和X_test是图片数据,y_train和y_test是对应的数字标签。比如X_train.shape输出(60000, 28, 28),意思是有 60000 张图片,每张图片是 28 像素 ×28 像素的。
可视化展示数据:看看手写数字长啥样
咱们先看看这些手写数字到底啥样。随机选 9 张训练集的图片展示:
s_x_train = np.random.choice(len(X_train), size=9, replace='false')fig1 = plt.figure()for i, label in enumerate(s_x_train):plt.subplot(3, 3, i + 1)plt.imshow(X_train[label], cmap='gray')plt.axis('off')plt.title(f"y_train:{y_train[label]}")plt.suptitle("mnist dataset")plt.show()
np.random.choice是随机选 9 个图片的索引,然后用plt.imshow把图片显示出来,这样你就能看到这些手写数字啦,标题还会显示对应的正确数字标签。
处理数据:让数据变得适合模型训练
归一化
图片像素值原本是 0-255,我们把它们缩放到 0-1 之间,这样模型训练更稳定。
x_train = x_train / 255x_test = x_test / 255
标签独热编码
因为是多分类任务(识别 0-9),把标签转换成独热编码格式,方便模型计算损失。
y_train = to_categorical(y_train, 10)y_test = to_categorical(y_test, 10)
比如原来标签是 5,独热编码后会变成[0, 0, 0, 0, 0, 1, 0, 0, 0, 0] ,这样模型就知道是第 5 个类别啦。
建立模型:搭建多层感知器
接下来搭建我们的多层感知器模型。就像搭积木一样,一层一层往上加。
mlp = Sequential()mlp.add(Flatten(input_shape=(28, 28)))mlp.add(Dense(units=392, activation='relu'))mlp.add(Dense(units=392, activation='relu'))mlp.add(Dense(units=10, activation='softmax'))
Flatten层:把 28×28 的图片 flatten 成一维的 784 个数据,方便后面的层处理。
Dense层:就是全连接层。这里有两层隐藏层,每层 392 个神经元,用relu激活函数,让模型能学习复杂的非线性关系。最后一层 10 个神经元,用softmax激活函数,输出每个数字的概率。
编译模型:设置训练的 “规则”
模型搭好后,得设置怎么训练它,比如用什么优化器、损失函数。
mlp.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
optimizer='adam':adam是一种常用的优化器,能帮模型更快更好地学习。
loss='binary_crossentropy':损失函数,这里用二元交叉熵(不过其实多分类用categorical_crossentropy更合适,这里可以注意下,后面可以调整试试 ),用来衡量模型预测的准不准。
metrics=['accuracy']:用准确率来评估模型,看对了多少图片。
训练数据:让模型开始学习
现在让模型开始学习这些手写数字啦,设置训练 10 轮(epochs=10)。
mlp.fit(x_train, y_train, epochs=10, verbose=1)
epochs=10表示把整个训练集数据过 10 遍,verbose=1会显示训练的进度,你能看到每一轮的损失和准确率变化。
评估模型结果:看看模型学得咋样
用测试集看看模型在没见过的数据上表现如何。
x_test_loss, x_test_accuracy = mlp.evaluate(x_test, y_test, verbose=2)print(x_test_loss, x_test_accuracy)
evaluate函数会计算测试集上的损失和准确率,比如输出0.0157 0.9830 ,就表示损失是 0.0157,准确率是 98.3% ,还不错吧!
可视化展示预测结果:看看模型预测得对不对
最后,咱们随机选 9 张图片,看看模型预测的结果。
p_x_train = np.random.choice(len(x_train), size=9, replace='false')fig2 = plt.figure()for i, label in enumerate(p_x_train):plt.subplot(3, 3, i + 1)plt.imshow(x_train[label], cmap='gray')plt.axis('off')y_train_predict = mlp.predict(x_train[label].reshape(1, 28, 28))y_label = np.argmax(y_train_predict)plt.title(f"y_predict:{y_label}")plt.suptitle("mnist dataset predict")plt.show()
np.random.choice again 随机选 9 张图,mlp.predict让模型预测,np.argmax找出概率最高的类别,就是模型预测的数字,标题会显示出来,你可以对比看看和实际对不对。
总结
怎么样,通过这一步步的操作,你是不是已经能用多层感知器识别手写数字啦!其实深度学习也没那么难,只要跟着步骤来,小白也能玩转。快自己动手试试吧,说不定还能优化优化模型,让准确率更高呢!
#深度学习入门
#多层感知器
#MNIST
数据集#Python实战#人工智能