模型训练识别手写数字(一)

一、模型训练数据集

1. 导入所需库

python 复制代码
import numpy as np
from sklearn.datasets import fetch_openml

numpy 是用于数值计算的库。

fetch_openml 是用于从 OpenML 下载数据集的函数。

2. 获取 MNIST 数据集

python 复制代码
X, y = fetch_openml('mnist_784', version=1, return_X_y=True)

fetch_openml('mnist_784', version=1, return_X_y=True) 从 OpenML 下载 MNIST 数据集。X 存储图像数据(784 个特征,28x28 像素的扁平化图像),y 存储对应的标签(数字 0 到 9)。

3. 将像素值二值化

python 复制代码
X[X > 0] = 1

这行代码将 X 中所有大于 0 的像素值设置为 1,二值化处理。这样处理后的图像只有两个值:0(黑色)和 1(白色),有助于简化模型的输入。

4. 保存数据集

python 复制代码
np.save("Data/dataset", X)
np.save("Data/class", y)

np.save("Data/dataset", X) 将图像数据保存为 dataset.npy

np.save("Data/class", y) 将标签数据保存为 class.npy

二、模型训练及预测

1. 导入所需库

python 复制代码
import matplotlib.pyplot as plt
import numpy as np
from keras import Sequential
from keras import layers
from keras.api.models import load_model
from sklearn.metrics import f1_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder

matplotlib.pyplot: 用于绘图和数据可视化。

numpy: 用于处理数组和数据加载。

keras: 用于构建和训练深度学习模型。

sklearn: 提供数据划分和预处理的工具。

f1_score: 用于评估模型性能。

2. 加载数据

python 复制代码
X = np.load("Data/dataset.npy", allow_pickle=True)
y = np.load("Data/class.npy", allow_pickle=True)

使用 numpyload 方法加载训练数据 (X) 和标签 (y)。allow_pickle=True 允许加载包含对象的数组。

3. One-Hot 编码

python 复制代码
onehot = OneHotEncoder(sparse_output=False)
y = onehot.fit_transform(y.reshape(-1, 1))

OneHotEncoder: 将标签转换为独热编码格式,方便用于分类任务。每个标签会被转换为一个二进制数组。

4. 划分训练集和测试集

python 复制代码
x_train, x_test, y_train, y_test = train_test_split(X, y, random_state=14)

使用 train_test_split 将数据集分为训练集和测试集,通常使用 70%-80% 的数据用于训练,其余用于测试。

5. 构建模型

python 复制代码
model = Sequential()
model.add(layers.Dense(100, activation='relu', input_shape=(x_train.shape[1],)))
model.add(layers.Dense(y.shape[1], activation='softmax'))  

Sequential: 表示模型是线性的,按顺序堆叠各个层。

Dense: 添加全连接层,第一层有 100 个神经元,使用 ReLU 激活函数;第二层为输出层,使用 Softmax 激活函数,适合多类分类任务。

6. 编译模型

python 复制代码
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

使用 Adam 优化器,损失函数为交叉熵(适合多分类),并监控准确率。

7. 训练模型

python 复制代码
model.fit(x_train, y_train, epochs=100, batch_size=32, verbose=1)

训练模型 100 个周期,批量大小为 32,verbose=1 表示输出训练过程的信息。

8. 评估模型

python 复制代码
predictions = model.predict(x_test)
predictions_classes = np.argmax(predictions, axis=1)
y_test_classes = np.argmax(y_test, axis=1)

print("F-score: {0:.2f}".format(f1_score(y_test_classes, predictions_classes, average='micro')))

使用测试集进行预测,并计算 F-score 作为评估指标。np.argmax 用于获取每个样本预测概率最高的类。

9. 保存模型

python 复制代码
model.save("my_model.h5")

将训练好的模型保存到文件 my_model.h5 中,以便后续加载和使用。

10. 加载模型

python 复制代码
loaded_model = load_model("my_model.h5")

加载之前保存的模型,以便进行预测。

11. 进行预测

python 复制代码
predictions = loaded_model.predict(x_test)

使用加载的模型对测试集进行预测,获取每个样本的预测结果。

12. 获取预测和真实标签

python 复制代码
y_pred_classes = np.argmax(predictions, axis=1)
y_test_classes = np.argmax(y_test, axis=1)

使用 np.argmax 从预测结果和真实标签中获取每个样本的类别索引。

13. 可视化预测结果

python 复制代码
plt.figure(figsize=(12, 6))

for i in range(20):
    plt.subplot(4, 5, i + 1)
    plt.imshow(x_test[i].reshape(28, 28), cmap='gray')  # 假设输入是28x28的图像
    plt.title(f'True: {y_test_classes[i]}\nPred: {y_pred_classes[i]}')
    plt.axis('off')

plt.tight_layout()
plt.show()

创建一个图形窗口,设置大小为 12x6。

使用 subplot 在 4 行 5 列的网格中绘制 20 个图像。

每个子图中显示测试样本的图像、真实标签和预测标签。

imshow 将图像进行灰度显示,axis('off') 隐藏坐标轴。

tight_layout() 调整子图参数,以避免重叠。

show() 显示图形。

相关推荐
锋行天下3 小时前
LangGraph 1.2+ 新特性:set_node_defaults,批量统一节点策略
人工智能
找方案3 小时前
AI+人力资源:AI招聘面试的兴起与争议
人工智能·面试·职场和发展
日常通勤穿搭3 小时前
2026 电商 AI 作图工具推荐|淘宝抖音跨境商品主图 AI 生图测评
人工智能·aigc·ai工具·电商美工
ZhengEnCi3 小时前
L2A-一个域名如何访问多台云服务器-子域名、路径前缀与Nginx反向代理选型指南
linux·人工智能
2601_963749104 小时前
越华环保集团污水站曝气系统边缘闭环控制架构与能耗优化实现
人工智能·架构
工业涂料百问4 小时前
【生产施工】系列(六)工业涂料固化方式怎么选?自然干 / UV / 电子束原理与选型实战
人工智能
葡萄城技术团队4 小时前
活字格 12.1 新特性解密:禁用自动回复后,AI 对话单元格也能流式输出了
人工智能
东风破_4 小时前
从 RAG 到 Agentic RAG:第一步,让模型决定「要不要检索」
人工智能
火山引擎开发者社区4 小时前
一图看懂 ADrive 跨产品协作实践:文件通了,Agent 就通了
人工智能
蒲公英内测分发4 小时前
App 更新一次就换一个二维码?智能硬件配套 App 的版本和下载入口怎么管理
人工智能·测试工具·智能家居·智能硬件