MindSpore手写数字识别体验

本文介绍了如何使用MindSpore进行手写数字识别,包括创建Anaconda虚拟环境,安装MindSpore及依赖,构建LeNet5网络,训练模型并保存,最后进行模型预测。整个流程清晰,模型体验良好,适合初学者入门。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


今天带大家体验一下 MindSpore 这个 AI 框架来完成手写数字识别的任务

1. 环境准备

使用Anaconda创建虚拟环境:

conda create -n mindspore python=3.8

请添加图片描述
创建完成后会显示以下的图像界面
请添加图片描述
这样我们的虚拟环境mindspore就创造完成

2. 安装minspore及其套件

mindspore 的安装可以参考:
https://mindspore.cn/install
请添加图片描述

conda install mindspore-cpu=1.8.1 -c mindspore -c conda-forge

验证安装是否成功:

python -c "import mindspore;mindspore.run_check()"

如果输出下方内容,就成功了

MindSpore version: 版本号
The result of multiplication calculation is correct, MindSpore has been installed successfully!

接下来继续安装其他依赖

pip install mindvision jupyterlab

安装 mindvision 是为了使用MindSpore Vision套件,其提供了用于下载并处理MNIST数据集的Mnist模块。
安装jupyterlab使用jupyter-lab来编写程序

安装完成后激活jupyter-lab环境

jupyter-lab

3. 程序撰写

from mindvision.dataset import Mnist

# 下载并处理MNIST数据集
download_train = Mnist(path="./mnist", split="train", batch_size=32, repeat_num=1, shuffle=True, resize=32, download=True)

download_eval = Mnist(path="./mnist", split="test", batch_size=32, resize=32, download=True)

dataset_train = download_train.run()
dataset_eval = download_eval.run()

import mindspore.nn as nn

class LeNet5(nn.Cell):
    """
    LeNet-5网络结构
    """
    def __init__(self, num_class=10, num_channel=1):
        super(LeNet5, self).__init__()
        # 卷积层,输入的通道数为num_channel,输出的通道数为6,卷积核大小为5*5
        self.conv1 = nn.Conv2d(num_channel, 6, 5, pad_mode='valid')
        # 卷积层,输入的通道数为6,输出的通道数为16,卷积核大小为5*5
        self.conv2 = nn.Conv2d(6, 16, 5, pad_mode='valid')
        # 全连接层,输入个数为16*5*5,输出个数为120
        self.fc1 = nn.Dense(16 * 5 * 5, 120)
        # 全连接层,输入个数为120,输出个数为84
        self.fc2 = nn.Dense(120, 84)
        # 全连接层,输入个数为84,分类的个数为num_class
        self.fc3 = nn.Dense(84, num_class)
        # ReLU激活函数
        self.relu = nn.ReLU()
        # 池化层
        self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2)
        # 多维数组展平为一维数组
        self.flatten = nn.Flatten()

    def construct(self, x):
        # 使用定义好的运算构建前向网络
        x = self.conv1(x)
        x = self.relu(x)
        x = self.max_pool2d(x)
        x = self.conv2(x)
        x = self.relu(x)
        x = self.max_pool2d(x)
        x = self.flatten(x)
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        x = self.relu(x)
        x = self.fc3(x)
        return x

network = LeNet5(num_class=10)

import mindspore.nn as nn

# 定义损失函数
net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')

# 定义优化器函数
net_opt = nn.Momentum(network.trainable_params(), learning_rate=0.01, momentum=0.9)

import mindspore as ms

# 设置模型保存参数,模型训练保存参数的step为1875。
config_ck = ms.CheckpointConfig(save_checkpoint_steps=1875, keep_checkpoint_max=10)

# 应用模型保存参数
ckpoint = ms.ModelCheckpoint(prefix="lenet", directory="./lenet", config=config_ck)

from mindvision.engine.callback import LossMonitor
import mindspore as ms

# 初始化模型参数
model = ms.Model(network, loss_fn=net_loss, optimizer=net_opt, metrics={'accuracy'})

# 训练网络模型,并保存为lenet-1_1875.ckpt文件
model.train(10, dataset_train, callbacks=[ckpoint, LossMonitor(0.01, 1875)])

acc = model.eval(dataset_eval)

print("{}".format(acc))


import mindspore as ms

# 加载已经保存的用于测试的模型
param_dict = ms.load_checkpoint("./lenet/lenet-1_1875.ckpt")
# 加载参数到网络中
ms.load_param_into_net(network, param_dict)

import numpy as np
import mindspore as ms
import matplotlib.pyplot as plt

mnist = Mnist("./mnist", split="train", batch_size=6, resize=32)
dataset_infer = mnist.run()
ds_test = dataset_infer.create_dict_iterator()
data = next(ds_test)
images = data["image"].asnumpy()
labels = data["label"].asnumpy()

plt.figure()
for i in range(1, 7):
    plt.subplot(2, 3, i)
    plt.imshow(images[i-1][0], interpolation="None", cmap="gray")
plt.show()

# 使用函数model.predict预测image对应分类
output = model.predict(ms.Tensor(data['image']))
predicted = np.argmax(output.asnumpy(), axis=1)

# 输出预测分类与实际分类
print(f'Predicted: "{predicted}", Actual: "{labels}"')

请添加图片描述
程序的输出和实际的一致,说明本次的模型训练和预测是很成功的。

4. 总结

整个流程下来,从模型的设计导训练,整个流程都比较清晰,优化器的设置和参数等的定义都很直观。整体上模型的体验都是不错的,但在jupyter-lab运行时候的warning无法消除,在观感上有点不大好。

欢迎加入MindSpore社区体验这个小任务
请添加图片描述

MindSpore是一个开源的深度学习框架,它可以用于各种机器学习任务,包括手写数字识别手写数字识别是一个常见的图像分类问题,下面是MindSpore手写数字识别中的基本原理: 1. 数据准备:首先,您需要准备一个手写数字的数据集。这个数据集通常包含许多手写数字的图像和对应的标签。您可以使用现有的公开数据集,如MNIST,或者自己创建一个数据集。 2. 网络设计:接下来,您需要设计一个用于手写数字识别的神经网络。您可以选择使用预定义的网络结构,如LeNet、AlexNet或ResNet,也可以自定义您自己的网络结构。 3. 模型训练:使用MindSpore提供的训练接口,将准备好的数据集输入到神经网络中进行训练。在训练过程中,神经网络会通过反向传播算法不断调整参数以最小化损失函数。 4. 模型评估与优化:训练完成后,您可以使用测试集对模型进行评估。评估指标可以是准确率、精确率、召回率等。如果模型表现不佳,您可以尝试调整超参数、增加训练数据量、修改网络结构等来优化模型。 5. 模型预测:当模型经过训练和优化后,您可以使用它来进行手写数字的预测。将手写数字图像输入到模型中,模型会输出一个预测结果,即识别出的数字MindSpore提供了丰富的函数和工具来支持数据处理、模型构建、训练和推理等任务,使手写数字识别变得更加简单和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈沧夜

打个赏,让我买瓶可乐喝呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值