MindSpore手写数字识别体验

Posted 陈沧夜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MindSpore手写数字识别体验相关的知识,希望对你有一定的参考价值。

文章目录


今天带大家体验一下 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手写数字识别体验的主要内容,如果未能解决你的问题,请参考以下文章

华为开源自研AI框架昇思MindSpore入门体验:手写数字识别

深度学习基于华为MindSpore的手写体图像识别实验

基于 Mindspore 框架与 ModelArts 平台的 MNIST 手写体识别实验

我的Go+语言初体验——Go+语言构建神经网络实战手写数字识别

深度学习03——手写数字识别实例

三分钟体验:SpringBoot用深度学习模型识别数字