• 【人工智能】MindSpore Hub


    目录

    前言

    一、什么是MindSpore Hub

    1.简单介绍

    2.MindSpore Hub包含功能

    3.MindSpore Hub使用场景

    二、安装MindSpore Hub

    1.确认系统环境信息

    2.安装

     3.下载源码

     4.进行验证

    三、加载模型

    1.介绍

    2.推理验证

    3.迁移学习

    四、模型发布


    前言

    MindSpore着重提升易用性并降低AI开发者的开发门槛,MindSpore原生适应每个场景包括端、边缘和云,并能够在按需协同的基础上,通过实现AI算法即代码,使开发态变得更加友好,显著减少模型开发时间,降低模型开发门槛。通过MindSpore自身的技术创新及MindSpore与华为昇腾AI处理器的协同优化,实现了运行态的高效,大大提高了计算性能;MindSpore也支持GPU、CPU等其它处理器。

    一、什么是MindSpore Hub

    1.简单介绍

    官方版本的预训练模型中心库---MindSpore Hub

     mindspore_hub 是一个Python库

    下载网址:点击跳转

    2.MindSpore Hub包含功能

    • 即插即用的模型加载

    • 简单易用的迁移学习

    1. import mindspore
    2. import mindspore_hub as mshub
    3. from mindspore import set_context, GRAPH_MODE
    4. set_context(mode=GRAPH_MODE,
    5. device_target="Ascend",
    6. device_id=0)
    7. model = "mindspore/1.6/googlenet_cifar10"
    8. # Initialize the number of classes based on the pre-trained model.
    9. network = mshub.load(model, num_classes=10)
    10. network.set_train(False)
    11. # ...

    3.MindSpore Hub使用场景

    · 推理验证:mindspore_hub.load用于加载预训练模型,可以实现一行代码完成模型的加载。

    · 迁移学习:通过mindspore_hub.load完成模型加载后,可以增加一个额外的参数项只加载神经网络的特征提取部分,这样就能很容易地在之后增加一些新的层进行迁移学习。

    · 发布模型:可以将自己训练好的模型按照指定的步骤发布到MindSpore Hub中,以供其他用户进行下载和使用。

    二、安装MindSpore Hub

    1.确认系统环境信息

    • 硬件平台支持Ascend、GPU和CPU。

    • 确认安装Python 3.7.5版本。

    • MindSpore Hub与MindSpore的版本需保持一致。

    • MindSpore Hub支持使用x86 64位或ARM 64位架构的Linux发行版系统。

    • 在联网状态下,安装whl包时会自动下载setup.py中的依赖项,其余情况需自行安装。

    2.安装

    在命令行中输入下面代码进行下载MindSpore Hub whl包

    pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/{version}/Hub/any/mindspore_hub-{version}-py3-none-any.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple
    

     3.下载源码

     

    1. 从Gitee下载源码。
    2. git clone https://gitee.com/mindspore/hub.git -b r1.9
    3. 编译安装MindSpore Hub。
    4. cd hub ##切换到hub文件下
    5. python setup.py install ## 下载

     4.进行验证

    1. 在能联网的环境中执行以下命令,验证安装结果。
    2. import mindspore_hub as mshub
    3. model = mshub.load("mindspore/1.6/lenet_mnist", num_class=10)
    4. 如果出现下列提示,说明安装成功:
    5. Downloading data from url https://gitee.com/mindspore/hub/raw/r1.9/mshub_res/assets/mindspore/1.6/lenet_mnist.md
    6. Download finished!
    7. File size = 0.00 Mb
    8. Checking /home/ma-user/.mscache/mindspore/1.6/lenet_mnist.md...Passed!

    三、加载模型

    1.介绍

    于个人开发者来说,从零开始训练一个较好模型,需要大量的标注完备的数据、足够的计算资源和大量训练调试时间。使得模型训练非常消耗资源,提升了AI开发的门槛,针对以上问题,MindSpore Hub提供了很多训练完成的模型权重文件,可以使得开发者在拥有少量数据的情况下,只需要花费少量训练时间,即可快速训练出一个较好的模型。

    2.推理验证

    1. ##使用url完成模型的加载
    2. import mindspore_hub as mshub
    3. import mindspore
    4. from mindspore import Tensor, nn, Model, set_context, GRAPH_MODE
    5. from mindspore import dtype as mstype
    6. import mindspore.dataset.vision as vision
    7. set_context(mode=GRAPH_MODE,
    8. device_target="Ascend",
    9. device_id=0)
    10. model = "mindspore/1.6/googlenet_cifar10"
    11. # Initialize the number of classes based on the pre-trained model.
    12. network = mshub.load(model, num_classes=10)
    13. network.set_train(False)

     最后使用MindSpore进行推理

    3.迁移学习

    1. #使用url进行MindSpore Hub模型的加载,注意:include_top参数需要模型开发者提供。
    2. import os
    3. import mindspore_hub as mshub
    4. import mindspore
    5. from mindspore import Tensor, nn, set_context, GRAPH_MODE
    6. from mindspore.nn import Momentum
    7. from mindspore import save_checkpoint, load_checkpoint,load_param_into_net
    8. from mindspore import ops
    9. import mindspore.dataset as ds
    10. import mindspore.dataset.transforms as transforms
    11. import mindspore.dataset.vision as vision
    12. from mindspore import dtype as mstype
    13. from mindspore import Model
    14. set_context(mode=GRAPH_MODE, device_target="Ascend", device_id=0)
    15. model = "mindspore/1.6/mobilenetv2_imagenet2012"
    16. network = mshub.load(model, num_classes=500, include_top=False, activation="Sigmoid")
    17. network.set_train(False)
    18. #在现有模型结构基础上,增加一个与新任务相关的分类层。
    19. class ReduceMeanFlatten(nn.Cell):
    20. def __init__(self):
    21. super(ReduceMeanFlatten, self).__init__()
    22. self.mean = ops.ReduceMean(keep_dims=True)
    23. self.flatten = nn.Flatten()
    24. def construct(self, x):
    25. x = self.mean(x, (2, 3))
    26. x = self.flatten(x)
    27. return x
    28. # Check MindSpore Hub website to conclude that the last output shape is 1280.
    29. last_channel = 1280
    30. # The number of classes in target task is 10.
    31. num_classes = 10
    32. reducemean_flatten = ReduceMeanFlatten()
    33. classification_layer = nn.Dense(last_channel, num_classes)
    34. classification_layer.set_train(True)
    35. train_network = nn.SequentialCell([network, reducemean_flatten, classification_layer])
    36. #定义数据集加载函数。
    37. def create_cifar10dataset(dataset_path, batch_size, usage='train', shuffle=True):
    38. data_set = ds.Cifar10Dataset(dataset_dir=dataset_path, usage=usage, shuffle=shuffle)
    39. # define map operations
    40. trans = [
    41. vision.Resize((256, 256)),
    42. vision.RandomHorizontalFlip(prob=0.5),
    43. vision.Rescale(1.0 / 255.0, 0.0),
    44. vision.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),
    45. vision.HWC2CHW()
    46. ]
    47. type_cast_op = transforms.TypeCast(mstype.int32)
    48. data_set = data_set.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8)
    49. data_set = data_set.map(operations=trans, input_columns="image", num_parallel_workers=8)
    50. # apply batch operations
    51. data_set = data_set.batch(batch_size, drop_remainder=True)
    52. return data_set
    53. # Create Dataset
    54. dataset_path = "/path_to_dataset/cifar-10-batches-bin"
    55. dataset = create_cifar10dataset(dataset_path, batch_size=32, usage='train', shuffle=True)
    56. #为模型训练选择损失函数、优化器和学习率。
    57. def generate_steps_lr(lr_init, steps_per_epoch, total_epochs):
    58. total_steps = total_epochs * steps_per_epoch
    59. decay_epoch_index = [0.3*total_steps, 0.6*total_steps, 0.8*total_steps]
    60. lr_each_step = []
    61. for i in range(total_steps):
    62. if i < decay_epoch_index[0]:
    63. lr = lr_init
    64. elif i < decay_epoch_index[1]:
    65. lr = lr_init * 0.1
    66. elif i < decay_epoch_index[2]:
    67. lr = lr_init * 0.01
    68. else:
    69. lr = lr_init * 0.001
    70. lr_each_step.append(lr)
    71. return lr_each_step
    72. # Set epoch size
    73. epoch_size = 60
    74. # Wrap the backbone network with loss.
    75. loss_fn = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean")
    76. loss_net = nn.WithLossCell(train_network, loss_fn)
    77. steps_per_epoch = dataset.get_dataset_size()
    78. lr = generate_steps_lr(lr_init=0.01, steps_per_epoch=steps_per_epoch, total_epochs=epoch_size)
    79. # Create an optimizer.
    80. optim = Momentum(filter(lambda x: x.requires_grad, classification_layer.get_parameters()), Tensor(lr, mindspore.float32), 0.9, 4e-5)
    81. train_net = nn.TrainOneStepCell(loss_net, optim)
    82. #开始重训练。
    83. for epoch in range(epoch_size):
    84. for i, items in enumerate(dataset):
    85. data, label = items
    86. data = mindspore.Tensor(data)
    87. label = mindspore.Tensor(label)
    88. loss = train_net(data, label)
    89. print(f"epoch: {epoch}/{epoch_size}, loss: {loss}")
    90. # Save the ckpt file for each epoch.
    91. if not os.path.exists('ckpt'):
    92. os.mkdir('ckpt')
    93. ckpt_path = f"./ckpt/cifar10_finetune_epoch{epoch}.ckpt"
    94. save_checkpoint(train_network, ckpt_path)
    95. #在测试集上测试模型精度。
    96. model = "mindspore/1.6/mobilenetv2_imagenet2012"
    97. network = mshub.load(model, num_classes=500, pretrained=True, include_top=False, activation="Sigmoid")
    98. network.set_train(False)
    99. reducemean_flatten = ReduceMeanFlatten()
    100. classification_layer = nn.Dense(last_channel, num_classes)
    101. classification_layer.set_train(False)
    102. softmax = nn.Softmax()
    103. network = nn.SequentialCell([network, reducemean_flatten, classification_layer, softmax])
    104. # Load a pre-trained ckpt file.
    105. ckpt_path = "./ckpt/cifar10_finetune_epoch59.ckpt"
    106. trained_ckpt = load_checkpoint(ckpt_path)
    107. load_param_into_net(classification_layer, trained_ckpt)
    108. loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean")
    109. # Define loss and create model.
    110. eval_dataset = create_cifar10dataset(dataset_path, batch_size=32, do_train=False)
    111. eval_metrics = {'Loss': nn.Loss(),
    112. 'Top1-Acc': nn.Top1CategoricalAccuracy(),
    113. 'Top5-Acc': nn.Top5CategoricalAccuracy()}
    114. model = Model(network, loss_fn=loss, optimizer=None, metrics=eval_metrics)
    115. metrics = model.eval(eval_dataset)
    116. print("metric: ", metrics)

    四、模型发布

    1. #将你的预训练模型托管在可以访问的存储位置。参照模板,在你自己的代码仓中添加模型生成文件mindspore_hub_conf.py,文件放置的位置如下:
    2. googlenet
    3. ├── src
    4. │ ├── googlenet.py
    5. ├── script
    6. │ ├── run_train.sh
    7. ├── train.py
    8. ├── test.py
    9. ├── mindspore_hub_conf.py
    10. #参照模板,在hub/mshub_res/assets/mindspore/1.6文件夹下创建{model_name}_{dataset}.md文件,其中1.6为MindSpore的版本号,hub/mshub_res的目录结构为:
    11. hub
    12. ├── mshub_res
    13. │ ├── assets
    14. │ ├── mindspore
    15. │ ├── 1.6
    16. │ ├── googlenet_cifar10.md
    17. │ ├── tools
    18. │ ├── get_sha256.py
    19. │ ├── load_markdown.py
    20. │ └── md_validator.py

    本次分享完

  • 相关阅读:
    基于openai api构建assistant
    java毕业设计n音乐剧网站mybatis+源码+调试部署+系统+数据库+lw
    【Spring Security】安全框架学习(九)
    软考高级软件架构师学习笔记一
    接口调不通,如何去排查?没想到10年测试老鸟栽在这道面试题上
    科技的成就(二十七)
    Hbase,Hive和Hdfs的关系以及区别
    【leetcode】【2022/8/28】793. 阶乘函数后 K 个零
    QFileDevice 类【官翻】
    【Java项目推荐之黑马头条】自媒体文章实现异步上下架(使用Kafka中间件实现)
  • 原文地址:https://blog.csdn.net/weixin_50481708/article/details/127952827