• MindSpore手写数字识别体验



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

    1. 环境准备

    使用Anaconda创建虚拟环境:

    conda create -n mindspore python=3.8
    
    • 1

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

    2. 安装minspore及其套件

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

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

    验证安装是否成功:

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

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

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

    接下来继续安装其他依赖

    pip install mindvision jupyterlab
    
    • 1

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

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

    jupyter-lab
    
    • 1

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    
    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)])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    
    acc = model.eval(dataset_eval)
    
    print("{}".format(acc))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    
    import mindspore as ms
    
    # 加载已经保存的用于测试的模型
    param_dict = ms.load_checkpoint("./lenet/lenet-1_1875.ckpt")
    # 加载参数到网络中
    ms.load_param_into_net(network, param_dict)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    
    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}"')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

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

    4. 总结

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

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

  • 相关阅读:
    Kotlin第七弹:Kotlin条件控制
    DNS、ICMP和NAT
    【Java】快速入门
    南京邮电大学统计学课程实验2 用EXCEL进行参数估计假设检验 指导
    系统(层次)聚类
    ubuntu 22.04 jammy 手动安装 python 3.6
    uniapp微信小程序如何返回上一页的左上角小房子的坑
    Python之字符串格式化
    二叉搜索树的实现
    基于lammps的工件-轧辊组合模型轧制过程模拟
  • 原文地址:https://blog.csdn.net/CANGYE0504/article/details/127452686