• [技术干货] 【1.23-1.24 | MindSpore第五期两日集训营】实践作业6之幻想成真(已更新)
    作业内容:实现使用MindSpore Serving部署Resnet50推理服务并访问参考网页:https://www.mindspore.cn/tutorial/inference/zh-CN/master/serving_example.html# 鉴于 Serving的实践作业 5是失败的。。。https://bbs.huaweicloud.com/forum/thread-104719-1-1.html 所以以下过程纯粹出于张小白的幻想。等到什么时候张小白装成功了ascend版本的serving,或者华为大大们开发出来了cpu版本的serving。这些任务也许就能顺利完成了。可惜不能跟惊喜礼物相见,但是大家可以看到我的惊喜模拟作业。。。也算是过节前的一次惊喜了。(一)环境准备 安装MindSpore和MindSpore Serving(for Ascend)1.先完成MindSpore for Ascend安装(!!!)2.再完成 MindSpore Serving for Ascend安装。3.验证serving的安装结果4.配置Serving环境变量以上的步骤请参见 作业5 https://bbs.huaweicloud.com/forum/thread-104719-1-1.html 45楼的内容,因为这都没有经过认证,要错一起错。要对一起对。(二)模型生成这个其实可以参见作业2,好像那边已经做好了。生成的MINDIR文件为:resnet-90_18810.mindir当然,这是张小白的毒蘑菇模型,并不是猫狗的那种。。。那简单,我们拿毒蘑菇的照片来推理就行了吧。。。或者下载个猫狗模型的ckpt文件重新convert成MINDIR格式也行。(三)定制模型方法先仿照add和subtract建立如下目录:test_dir├── resnet50/│    └── servable_config.py│    └── 1/│        └── resnet-90_18810.mindir(根据实际名称调整)├── test_image/└── master_with_worker.py│── client.pyservable_config.py# Copyright 2020 Huawei Technologies Co., Ltd## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.# ============================================================================"""Resnet50 ImageNet config python file"""import osimport astimport numpy as npimport mindspore.dataset as dsimport mindspore.dataset.transforms.c_transforms as TCimport mindspore.dataset.vision.c_transforms as VCfrom mindspore_serving.worker import registercur_dir = os.path.abspath(os.path.dirname(__file__))print("current dir:", cur_dir)with open(os.path.join(cur_dir, "imagenet1000_clsidx_to_labels.txt"), "r") as fp:    idx_2_label = ast.literal_eval(fp.read())idx_2_label[1000] = "empty"def preprocess_eager(image):    """    Define preprocess, input is image numpy, return preprocess result.    Return type can be numpy, str, bytes, int, float, or bool.    Use MindData Eager, this image processing can also use other image processing library, likes numpy, PIL or cv2 etc.    """    image_size = 224    mean = [0.485 * 255, 0.456 * 255, 0.406 * 255]    std = [0.229 * 255, 0.224 * 255, 0.225 * 255]    decode = VC.Decode()    resize = VC.Resize()    normalize = VC.Normalize(mean=mean, std=std)    hwc2chw = VC.HWC2CHW()    image = decode(image)    image = resize(image)    image = normalize(image)    image = hwc2chw(image)    return imagedef preprocess_pipeline(instances):    """    Define preprocess pipeline, the function arg is multi instances, every instance is tuple of inputs.    This example has one input and one output.    Use MindData Pipeline.    """    def generator_func():        for instance in instances:            image = instance[0]            yield (image,)    resnet_ds = ds.GeneratorDataset(generator_func, ["image"], shuffle=False)    image_size = 224    mean = [0.485 * 255, 0.456 * 255, 0.406 * 255]    std = [0.229 * 255, 0.224 * 255, 0.225 * 255]    resnet_ds = resnet_ds.map(operations=VC.Decode(), input_columns="image", num_parallel_workers=8)    trans = [        VC.Resize(),        VC.Normalize(mean=mean, std=std),        VC.HWC2CHW()    ]    resnet_ds = resnet_ds.map(operations=TC.Compose(trans), input_columns="image", num_parallel_workers=2)    for data in resnet_ds.create_dict_iterator():        image_result = data["image"]        yield (image_result,)def postprocess_top1(score):    """    Define postprocess. This example has one input and one output.    The input is the numpy tensor of the score, and the output is the label str of top one.    """    max_idx = np.argmax(score)    return idx_2_label[max_idx]def postprocess_top5(score):    """    Define postprocess. This example has one input and two outputs.    The input is the numpy tensor of the score. The first output is the str joined by labels of top five,    and the second output is the score tensor of the top five.    """    idx = np.argsort(score)[::-1][:5]  # top 5    ret_label =     ret_score = score    return ";".join(ret_label), ret_scoreregister.declare_servable(servable_file="resnet50_1b_imagenet.mindir", model_format="MindIR")@register.register_method(output_names=["label"])def classify_top1(image):    """Define method `classify_top1` for servable `resnet50`.     The input is `image` and the output is `lable`."""    x = register.call_preprocess_pipeline(preprocess_pipeline, image)    x = register.call_servable(x)    x = register.call_postprocess(postprocess_top1, x)    return x@register.register_method(output_names=["label"])def classify_top1_v1(image):    """Define method `classify_top1_v1` for servable `resnet50`.     The input is `image` and the output is `label`. """    x = register.call_preprocess(preprocess_eager, image)    x = register.call_servable(x)    x = register.call_postprocess(postprocess_top1, x)    return x@register.register_method(output_names=["label", "score"])def classify_top5(image):    """Define method `classify_top5` for servable `resnet50`.     The input is `image` and the output is `label` and `score`. """    x = register.call_preprocess_pipeline(preprocess_pipeline, image)    x = register.call_servable(x)    label, score = register.call_postprocess(postprocess_top5, x)    return label, score例子代码里面用到了一个 imagenet1000_clsidx_to_labels.txt的文件,打开来看了一下,好像是一个种类和具体名称的对照表。{0: 'tench, Tinca tinca', 1: 'goldfish, Carassius auratus', 2: 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias', 3: 'tiger shark, Galeocerdo cuvieri', 4: 'hammerhead, hammerhead shark', 。。。 996: 'hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa', 997: 'bolete', 998: 'ear, spike, capitulum', 999: 'toilet tissue, toilet paper, bathroom tissue'}(四)部署服务执行 master_with_worker.py# Copyright 2020 Huawei Technologies Co., Ltd## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.# ============================================================================"""Start Servable resnet50"""import osfrom mindspore_serving import masterfrom mindspore_serving import workerdef start():    servable_dir = os.path.abspath(".")    worker.start_servable_in_master(servable_dir, "resnet50", device_id=0)    master.start_grpc_server("127.0.0.1", 5500)    master.start_restful_server("127.0.0.1", 1500)if __name__ == "__main__":    start()(五)高效执行推理执行 client.py# Copyright 2020 Huawei Technologies Co., Ltd## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.# ============================================================================"""Client for resnet50"""import osfrom mindspore_serving.client import Clientdef read_images():    """Read images for directory test_image"""    images_buffer = []    for path, _, file_list in os.walk("./test_image/"):        for file_name in file_list:            image_file = os.path.join(path, file_name)            print(image_file)            with open(image_file, "rb") as fp:                images_buffer.append(fp.read())    return images_bufferdef run_classify_top1():    """Client for servable resnet50 and method classify_top1"""    print("run_classify_top1-----------")    client = Client("localhost", 5500, "resnet50", "classify_top1")    instances = []    for image in read_images():        instances.append({"image": image})    result = client.infer(instances)    print(result)def run_classify_top1_v1():    """Client for servable resnet50 and method classify_top1_v1"""    print("run_classify_top1_v1-----------")    client = Client("localhost", 5500, "resnet50", "classify_top1_v1")    instances = []    for image in read_images():        instances.append({"image": image})    result = client.infer(instances)    print(result)def run_classify_top5():    """Client for servable resnet50 and method classify_top5"""    print("run_classify_top5-----------")    client = Client("localhost", 5500, "resnet50", "classify_top5")    instances = []    for image in read_images():  # read multi image        instances.append({"image": image})  # input `image`    result = client.infer(instances)    print(result)    for result_item in result:  # result for every image        label = result_item["label"]  # result `label`        score = result_item["score"]  # result `score`        print("label result:", label)        print("score result:", score)def run_classify_top5_async():    """Client for servable resnet50 and method classify_top5"""    print("run_classify_top5_async-----------")    client = Client("localhost", 5500, "resnet50", "classify_top5")    instances = []    for image in read_images():  # read multi image        instances.append({"image": image})  # input `image`    result_future = client.infer_async(instances)    result = result_future.result()    print(result)    for result_item in result:  # result for every image        label = result_item["label"]  # result `label`        score = result_item["score"]  # result `score`        print("label result:", label)        print("score result:", score)def run_restful_classify_top1():    """RESTful Client for servable resnet50 and method classify_top1"""    print("run_restful_classify_top1-----------")    import base64    import requests    import json    instances = []    for image in read_images():        base64_data = base64.b64encode(image).decode()        instances.append({"image": {"b64": base64_data}})    instances_map = {"instances": instances}    post_payload = json.dumps(instances_map)    ip = "localhost"    restful_port = 1500    servable_name = "resnet50"    method_name = "classify_top1"    result = requests.post(f"http://{ip}:{restful_port}/model/{servable_name}:{method_name}", data=post_payload)    print(result.text)if __name__ == '__main__':    run_classify_top1()    run_classify_top1_v1()    run_classify_top5()    run_restful_classify_top1()    run_classify_top5_async()当然了。张小白估计模型的使用可能也会有问题。这一切都得等MindSpore for Ascend OK才能说了。所以说一切都是幻想,只有春节是真的。
  • [热门活动] 【MindSpore】每个月总有那么几天是发奖品的,参与问答就有机会!本次活动周期:2021.05.01-2021.05.31
    活动规则:    1. 在MindSpore论坛中,提问、分享、回复与MindSpore相关的技术问题或使用上的分享。在每月月末统计中,:            (1)分享次数排名的前3名;            (2)提问次数排名的前2名;            (3)回复次数排名的前1名;         获得以上三项排名的朋友,发送奖品,以示鼓励。    2. 获得奖励的人员可在奖品清单中任选一种。    3. 活动每个月一次,到次月的3日前公布奖励名单。(说明:4月份从当月第一天到当月最后一天为一个周期。)    4. 获奖公布方式:每个周期的获奖名单会在活动帖评论区中公示,并会在获奖人的帖子下以留言的形式告知并联系。(请各位参与者多多关注自己帖子的留言情况。)奖品清单:    奖品每月都会有更新,请持续关注啊!                       (1)计时器                     (2)雨伞                       (3)手机支架活动说明:       1. 提问、分享和回复的内容要与MindSpore相关,不相关视作无效操作。       2. 参与提问和分享要在MindSpore论坛中的"问题求助"中提问;在"干货分享"中发帖分享,转载内容的帖子不计入活动中。       3. 操作内容中含有水印的视为无效内容,属于无效操作。       4. 本月1号统一联系上期活动中各位获奖者,发放奖励,9号前未收到获奖用户回复的,视作自动放弃领取奖品机会。       5. 最终解释权归MindSpore团队所有。
  • [技术干货] 基于Resnet50分类探索Mindspore0.5 与 Mindspore1.0的差异性
     环境信息:CPU + Ubuntu-x86
  • [问题求助] 【mindspore】【lstm做时间序列预测】报错For 'OneHot' the type of `indices`
    【功能模块】在使用LSTM做时间序列预测,就是股票预测的练习,现在用mindspore做预测,自学学习了俩月了,克服了无数问题,最后又卡住了,不得已,来求助各位论坛专家!程序是在Windows10,mindspore1.0环境下,使用jupyterlab编辑的;程序已经打包作为附件上传,程序所在文件名“mindspore_lstm_stock.ipynb”,请坛子里的专家帮帮我,十分谢谢!【操作步骤&问题现象】整个程序主要包括几个部分:声明环境、配置信息、参数;加载处理数据(6190,8),其中,前7列用于输入,预测最后一列数据;# 利用 yield 构造数据集;# 构造 readerdef my_train_reader():    def reader():        for temp in train_data:            yield (np.array([temp[:-1]]).astype(np.float32), np.array([temp[-1]]).astype(np.float32))    return readerdef my_test_reader():    def reader():        for temp in test_data:            yield (np.array([temp[:-1]]).astype(np.float32), np.array([temp[-1]]).astype(np.float32))    return reader# 定义LSTM网络def lstm_default_state(batch_size, hidden_size, num_layers, bidirectional):    """init default input."""    num_directions = 2 if bidirectional else 1    h = Tensor(np.zeros((num_layers * num_directions, batch_size, hidden_size)).astype(np.float32))    c = Tensor(np.zeros((num_layers * num_directions, batch_size, hidden_size)).astype(np.float32))    return h, cclass lstmNet(nn.Cell):    '''Sentiment network structure.'''    def __init__(self, input_size, hidden_size, num_layers, bidirectional, batch_size, num_class):        super(lstmNet, self).__init__()        self.lstm = nn.LSTM(input_size=input_size,                            hidden_size=hidden_size,                            num_layers=num_layers,                            batch_first=True,                            bidirectional=bidirectional,                            dropout=0.0)        self.h, self.c = lstm_default_state(batch_size, hidden_size, num_layers, bidirectional)                if bidirectional:            self.fc = nn.Dense(hidden_size * 4, num_class, Normal(0.02), Normal(0.02))        else:            self.fc = nn.Dense(hidden_size * 2, num_class, Normal(0.02), Normal(0.02))                    def construct(self, inp):        output, _ = self.lstm(inp, (self.h, self.c))        # output = self.fc(output)        return output'''定义优化器及损失函数运行以下一段代码,创建优化器和损失函数模型。'''loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True)opt = nn.Momentum(network.trainable_params(), cfg.learning_rate, cfg.momentum)model = Model(network, loss, opt, {'acc': Accuracy()})  # {'acc'}loss_cb = LossMonitor()config_ck = CheckpointConfig(save_checkpoint_steps=cfg.save_checkpoint_steps,                             keep_checkpoint_max=cfg.keep_checkpoint_max)ckpoint_cb = ModelCheckpoint(prefix="lstm", directory=args.ckpt_path, config=config_ck)time_cb = TimeMonitor(data_size=ds_train.get_dataset_size())# 开始训练print("============== Starting Training ==============")if args.device_target == "CPU":    model.train(cfg.num_epochs, ds_train, callbacks=[time_cb, ckpoint_cb, loss_cb], dataset_sink_mode=False)print("============== Training Success ==============")显示出错:【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 【实验课程】MindSpore1.0:MobileNetV2网络实现微调(关键词:MobileNetV2、Fine Tune)
    使用MobileNetV2网络实现微调(Fine Tune)实验介绍本实验介绍使用MindSpore,在CPU环境下,mobileNetV2网络做微调训练与验证。实验目的掌握如何使用MindSpore进行微调实验开发。理解微调方法的原理、方法。了解如何使用MindSpore进行MobileNetV2网络训练与验证.实验环境MindSpore 1.0.0-CPU实验准备数据集准备准备ImageFolder格式管理的数据集,运行train.py时加入--dataset_path [dataset_path]参数。这里采用花分类数据集。下载地址为:训练数据集链接:https://professional.obs.cn-north-4.myhuaweicloud.com/flower_photos_train.zip测试数据集链接:https://professional.obs.cn-north-4.myhuaweicloud.com/flower_photos_test.zip预训练模型准备  下载预训练模型(mobilenetv2_cpu_gpu.ckpt)到以下目录: ./pretrain_checkpoint/mkdir pretrain_checkpointwget -P ./pretrain_checkpoint脚本准备从课程gitee仓库上下载本实验相关脚本。  在Gitee中克隆MindSpore开源项目仓库,进入./model_zoo/official/cv/mobilenetv2/直接下载。  git clone https://gitee.com/mindspore/mindspore.git -b r1.0mkdir mobilenetv2cp -r ./mindspore/model_zoo/official/cv/mobilenetv2 ./mobilenetv2/code文件结构mobilenetv2├── code│   ├── src│   │   ├── config.py           # parameter configuration│   │   ├── dataset.py         # creating dataset│   │   ├── launch.py           # start Python script│   │   ├── lr_generator.py     # learning rate config│   │   ├── mobilenetV2.py     # MobileNetV2 architecture│   │   ├── models.py           # net utils to load ckpt_file, define_net...│   │   └── utils.py           # net utils to switch precision, set_context│   ├── train.py               # training script│   └── .py                 # uation script├── pretrain_checkpoint│   └── mobilenetv2_cpu_gpu.ckpt       # Pre-trained model└── data   ├── flower_photos_train  │   └── *           # daisy, dandelion, roses, sunflowers, tulips  └──flower_photos_test      └── *           # daisy, dandelion, roses, sunflowers, tulips实验原理mobileNetV1是由google在2017年发布的一个轻量级深度神经网络,其主要特点是采用深度可分离卷积(Depthwise Separable Convolution)替换了普通卷积,2018年提出的mobileNetV2在V1的基础上引入了线性瓶颈 (Linear Bottleneck)和倒残差 (Inverted Residual)来提高网络的表征能力。mobileNetV1的深度可分离卷积Depthwise Separable Convolution实质上是将标准卷积分成了两步:depthwise卷积和pointwise卷积,大大减少了普通卷积的计算量。depthwise卷积:对每个输入通道单独使用一个卷积核处理,输入输出维度是相同的;pointwise卷积:1×1卷积,用于将depthwise卷积的输出组合起来;卷积类型输入维度输出通道数卷积核卷积核参数量输出维度计算量标准卷积C1*H*WC2K*KK*K*C1*C2C2*H*WK*K*C1*C2*H*Wdepthwise卷积C1*H*WC1K*KK*K*C1C1*H*WK*K*C1*H*Wpointwise卷积C1*H*WC21*11*1*C1*C2C2*H*W1*1*C1*C2*H*W深度可分离卷积C1*H*WC2C2*H*W(K*K+C2)*C1*H*W从表格可以看出:深度可分离卷积利用两个可分离的卷积(depthwise卷积和pointwise卷积)替换标准卷积,增加的深度,但却大大减少了计算量。mobileNetV2的改进MobileNet V1的结构较为简单,Depthwise Convolution确实降低了计算量,但是 Depthwise 部分的 kernel 训练容易废掉,最终再经过ReLU出现输出为0的情况。Resnet及Densenet等一系列采用shortcut的网络的成功,表明了shortcut是个非常好的东西,于是MobileNet-V2就将这个好东西拿来用。拿来主义,最重要的就是要结合自身的特点,MobileNet的特点就是depth-wise separable convolution,但是直接把depth-wise separable convolution应用到 residual block中,会碰到如下问题:DWConv layer层提取得到的特征受限于输入的通道数,若是采用以往的residual block,先“压缩”,再卷积提特征,那么DWConv layer可提取得特征就太少了,因此一开始不“压缩”,MobileNetV2反其道而行,一开始先“扩张”。 通常residual block里面是 “压缩”→“卷积提特征”→“扩张”,MobileNetV2就变成了 “扩张”→“卷积提特征”→ “压缩”,因此称为Inverted residuals。当采用“扩张”→“卷积提特征”→ “压缩”时,在“压缩”之后会碰到一个问题,那就是Relu会破坏特征。为什么这里的Relu会破坏特征呢?这得从Relu的性质说起,Relu对于负的输入,输出全为零;而本来特征就已经被“压缩”,再经过Relu的话,又要“损失”一部分特征,因此这里不采用Relu,实验结果表明这样做是正确的,这就称为Linear bottlenecks。下图分别展示了有无shortcut连接的mobileNetV2对depth-wise separable convolution的改进。当stride=1时,使用short cut连接,将输入和输出特征连接(下图左侧);当stride=2时,无short cut连接(下图右侧)。mobileNetV2网络的总体结构,请参照src/MobileNetV2.py微调前面下载的模型mobilenetv2_cpu_gpu.ckpt是mobileNetV2网络在ImageNet数据集上面训练得到的。ImageNet数据集数据量大,不适合在CPU上运行。为了加快训练速度,突出微调的优势,使CPU上训练大网络成为可能。我们采用mobilenetv2_cpu_gpu.ckpt模型作为花卉分类模型的预训练模型,只训练MobileNetV2Head(两个全连接层)网络。具体训练流程为:加载mobilenetv2_cpu_gpu.ckpt模型,并利用模型将数据集特征化,生成特征数据。定义MobileNetV2Head网络,以特征数据作为其输入,训练MobileNetV2Head网络。注意: 定义MobileNetV2Head网络的输入维度和mobilenetv2_cpu_gpu.ckpt网络的输出维度保持一致。微调让CPU训练大型网络成为可能,并且实现了不同数据集的迁移学习。实验步骤MobileNetV2实验包含2种训练方式,分别为:train: 不使用预训练模型。从头到尾训练MobileNetV2网络(参数freeze_layer为“none”,参数pretrain_ckpt为None)。网络定义参考src/MobileNetV2.py 中的MobileNetV2类。fine_tune:微调,使用预训练模型(大数据集)训练网络,根据是否冻结一部分网络分为两种。 不冻结MobileNetV2Backbone部分(参数freeze_layer为“none”)。网络包含MobileNetV2Backbone和MobileNetV2Head两部分,其中MobileNetV2Backbone网络参数是从一个已经训练好的ckpt模型中得到(参数pretrain_ckpt非空)。网络定义参考src/MobileNetV2.py 中的MobileNetV2Backbone、MobileNetV2Head类。冻结MobileNetV2Backbone部分(参数freeze_layer为"backbone")。只训练MobileNetV2Head网络,其中MobileNetV2Backbone网络参数是从一个已经训练好的ckpt模型中得到(参数pretrain_ckpt非空)。注意: CPU运行速度慢,所以仅支持fine_tune方式下的冻结MobileNetV2Backbone部分。即:参数freeze_layer为"backbone",参数pretrain_ckpt非空。重要代码解读定义MobileNetV2Backbone网络(src/MobileNetV2.py)class MobileNetV2Backbone(nn.Cell):   """  MobileNetV2 architecture.  Args:      class_num (int): number of classes.      width_mult (int): Channels multiplier for round to 8/16 and others. Default is 1.      has_dropout (bool): Is dropout used. Default is false      inverted_residual_setting (list): Inverted residual settings. Default is None      round_nearest (list): Channel round to . Default is 8  Returns:      Tensor, output tensor.  Examples:      >>> MobileNetV2(num_classes=1000)  """   def __init__(self, width_mult=1., inverted_residual_setting=None, round_nearest=8,                input_channel=32, last_channel=1280):       super(MobileNetV2Backbone, self).__init__()       block = InvertedResidual       # setting of inverted residual blocks       self.cfgs = inverted_residual_setting       if inverted_residual_setting is None:           self.cfgs = [               # t, c, n, s              [1, 16, 1, 1],              [6, 24, 2, 2],              [6, 32, 3, 2],              [6, 64, 4, 2],              [6, 96, 3, 1],              [6, 160, 3, 2],              [6, 320, 1, 1],          ]       # building first layer       input_channel = _make_divisible(input_channel * width_mult, round_nearest)       self.out_channels = _make_divisible(last_channel * max(1.0, width_mult), round_nearest)       features = [ConvBNReLU(3, input_channel, stride=2)]       # building inverted residual blocks       for t, c, n, s in self.cfgs:           output_channel = _make_divisible(c * width_mult, round_nearest)           for i in range(n):               stride = s if i == 0 else 1               features.append(block(input_channel, output_channel, stride, expand_ratio=t))               input_channel = output_channel       # building last several layers       features.append(ConvBNReLU(input_channel, self.out_channels, kernel_size=1))       # make it nn.CellList       self.features = nn.SequentialCell(features)       self._initialize_weights()   def construct(self, x):       x = self.features(x)       return x   def _initialize_weights(self):       """      Initialize weights.      Args:      Returns:          None.      Examples:          >>> _initialize_weights()      """       self.init_parameters_data()       for _, m in self.cells_and_names():           if isinstance(m, nn.Conv2d):               n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels               m.weight.set_data(Tensor(np.random.normal(0, np.sqrt(2. / n),                                                         m.weight.data.shape).astype("float32")))               if m.bias is not None:                   m.bias.set_data(                       Tensor(np.zeros(m.bias.data.shape, dtype="float32")))           elif isinstance(m, nn.BatchNorm2d):               m.gamma.set_data(                   Tensor(np.ones(m.gamma.data.shape, dtype="float32")))               m.beta.set_data(                   Tensor(np.zeros(m.beta.data.shape, dtype="float32")))   @property   def get_features(self):       return self.features定义MobileNetV2Head网络(src/MobileNetV2.py)class MobileNetV2Head(nn.Cell):   """  MobileNetV2 architecture.  Args:      class_num (int): Number of classes. Default is 1000.      has_dropout (bool): Is dropout used. Default is false  Returns:      Tensor, output tensor.  Examples:      >>> MobileNetV2(num_classes=1000)  """   def __init__(self, input_channel=1280, num_classes=1000, has_dropout=False, activation="None"):       super(MobileNetV2Head, self).__init__()       # mobilenet head       head = ([GlobalAvgPooling(), nn.Dense(input_channel, num_classes, has_bias=True)]               if not has_dropout else              [GlobalAvgPooling(), nn.Dropout(0.2), nn.Dense(input_channel, num_classes, has_bias=True)])       self.head = nn.SequentialCell(head)       self.need_activation = True       if activation == "Sigmoid":           self.activation = P.Sigmoid()       elif activation == "Softmax":           self.activation = P.Softmax()       else:           self.need_activation = False       self._initialize_weights()   def construct(self, x):       x = self.head(x)       if self.need_activation:           x = self.activation(x)       return x   def _initialize_weights(self):       """      Initialize weights.      Args:      Returns:          None.      Examples:          >>> _initialize_weights()      """       self.init_parameters_data()       for _, m in self.cells_and_names():           if isinstance(m, nn.Dense):               m.weight.set_data(Tensor(np.random.normal(                   0, 0.01, m.weight.data.shape).astype("float32")))               if m.bias is not None:                   m.bias.set_data(                       Tensor(np.zeros(m.bias.data.shape, dtype="float32")))   @property   def get_head(self):       return self.head定义初始化网络函数(src/model.py)def define_net(config, is_training):   backbone_net = MobileNetV2Backbone()   activation = config.activation if not is_training else "None"   head_net = MobileNetV2Head(input_channel=backbone_net.out_channels,                              num_classes=config.num_classes,                              activation=activation)   net = mobilenet_v2(backbone_net, head_net)   return backbone_net, head_net, net定义特征化函数extract_features(src/dataset.py)def extract_features(net, dataset_path, config):   features_folder = os.path.abspath(dataset_path) + '_features'   if not os.path.exists(features_folder):       os.makedirs(features_folder)   dataset = create_dataset(dataset_path=dataset_path,                            do_train=False,                            config=config)   step_size = dataset.get_dataset_size()   if step_size == 0:       raise ValueError("The step_size of dataset is zero. Check if the images count of train dataset \                        is more than batch_size in config.py")   model = Model(net)   for i, data in enumerate(dataset.create_dict_iterator(output_numpy=True)):       features_path = os.path.join(features_folder, f"feature_{i}.npy")       label_path = os.path.join(features_folder, f"label_{i}.npy")       if not os.path.exists(features_path) or not os.path.exists(label_path):           image = data["image"]           label = data["label"]           features = model.predict(Tensor(image))           np.save(features_path, features.asnumpy())           np.save(label_path, label)       print(f"Complete the batch {i+1}/{step_size}")   return step_size初始化网络并特征化(train.py)# define networkbackbone_net, head_net, net = define_net(config, args_opt.is_training)if args_opt.pretrain_ckpt and args_opt.freeze_layer == "backbone":   load_ckpt(backbone_net, args_opt.pretrain_ckpt, trainable=False)   step_size = extract_features(backbone_net, args_opt.dataset_path, config)微调(train.py)if args_opt.pretrain_ckpt is None or args_opt.freeze_layer == "none":   loss_scale = FixedLossScaleManager(config.loss_scale, drop_overflow_update=False)   opt = Momentum(filter(lambda x: x.requires_grad, net.get_parameters()), lr, config.momentum, \           config.weight_decay, config.loss_scale)   model = Model(net, loss_fn=loss, optimizer=opt, loss_scale_manager=loss_scale)   cb = config_ckpoint(config, lr, step_size)   print("============== Starting Training ==============")   model.train(epoch_size, dataset, callbacks=cb)   print("============== End Training ==============")else:   opt = Momentum(filter(lambda x: x.requires_grad, head_net.get_parameters()), lr, config.momentum,\                        config.weight_decay)   network = WithLossCell(head_net, loss)   network = TrainOneStepCell(network, opt)   network.set_train()   features_path = args_opt.dataset_path + '_features'   idx_list = list(range(step_size))   rank = 0   if config.run_distribute:       rank = get_rank()   save_ckpt_path = os.path.join(config.save_checkpoint_path, 'ckpt_' + str(rank) + '/')   if not os.path.isdir(save_ckpt_path):       os.mkdir(save_ckpt_path)   for epoch in range(epoch_size):       random.shuffle(idx_list)       epoch_start = time.time()       losses = []       for j in idx_list:           feature = Tensor(np.load(os.path.join(features_path, f"feature_{j}.npy")))           label = Tensor(np.load(os.path.join(features_path, f"label_{j}.npy")))           losses.append(network(feature, label).asnumpy())       epoch_mseconds = (time.time()-epoch_start) * 1000       per_step_mseconds = epoch_mseconds / step_size       print("epoch[{}/{}], iter[{}] cost: {:5.3f}, per step time: {:5.3f}, avg loss: {:5.3f}"\      .format(epoch + 1, epoch_size, step_size, epoch_mseconds, per_step_mseconds,               np.mean(np.array(losses))))       if (epoch + 1) % config.save_checkpoint_epochs == 0:           save_checkpoint(net, os.path.join(save_ckpt_path, f"mobilenetv2_{epoch+1}.ckpt"))   print("total cost {:5.4f} s".format(time.time() - start))网络参数设定config_cpu = ed({   "num_classes": 5,        # 类别数,根据实验数据集调整   "image_height": 224,     # 参与训练的图片高度   "image_width": 224,      # 参与训练的图片宽度   "batch_size": 64,        # 每批次样本数   "epoch_size": 20,        # 训练次数   "warmup_epochs": 0,      # 学习率变换步数   "lr_init": .0,           # 初始化学习率   "lr_end": 0.0,           # 最终学习率   "lr_max": 0.01,          # 最大学习率   "momentum": 0.9,         # momentum优化器参数   "weight_decay": 4e-5,    # momentum优化器正则化参数   "label_smooth": 0.1,     # 损失函数参数:smooth factor   "loss_scale": 1024,      # "none"方式下损失函数参数,"backbone"方式下无用   "save_checkpoint": True, # 是否保存模型   "save_checkpoint_epochs": 5,    # "backbone"方式下,多少个epochs保存一次模型,"none"方式下无用   "keep_checkpoint_max": 20,      # "none"方式下最多保存多少个模型,"backbone"方式下无用.   "save_checkpoint_path": "./",   # 保存模型路径   "platform": args.platform,      # 平台.可选"CPU", "GPU", "Ascend",这里固定"CPU"   "run_distribute": False,        # 是否并行执行,"CPU"环境下默认False   "activation": "Softmax"         # 最后一层激活函数})注意: 验证实验batch_size设为1,其他参数与训练时一致。微调训练  MobileNetV2做微调时,只需要运行train.py。目前运行train.py时仅支持单处理器。运行train.py时需要传入dataset_path、platform、--run_distribute、freeze_layer与pretrain_ckpt五个参数。--dataset_path:训练数据集地址,无默认值,用户训练时必须输入。--platform:处理器类型,默认为Ascend,可以设置为CPU或GPU。--freeze_layer:冻结网络,选填"none"或"backbone" 。"none"代表不冻结网络,"backbone" 代表冻结网络"backbone" 部分。CPU只支持微调head网络,不支持微调整个网络。所以这里填"backbone"。--pretrain_ckpt:微调时,需要传入pretrain_checkpoint文件路径以加载预训练好的模型参数权重。--run_distribute:是否使用分布式运行。默认为True。CPU不支持分布式运行。方式一: args文件指定运行参数打开src/args配置文件,更改train_parse_args函数为如下所示,以此来指定运行默认参数。def train_parse_args():   train_parser = argparse.ArgumentParser(description='Image classification trian')   train_parser.add_argument('--platform', type=str, default="CPU", choices=("CPU", "GPU", "Ascend"), \       help='run platform, only support CPU, GPU and Ascend')   train_parser.add_argument('--dataset_path', type=str, default="../data/flower_photos_train", help='Dataset path')   train_parser.add_argument('--pretrain_ckpt', type=str, default="../pretrain_checkpoint/mobilenetv2_cpu_gpu.ckpt", help='Pretrained checkpoint path \      for fine tune or incremental learning')   train_parser.add_argument('--freeze_layer', type=str, default="backbone", choices=["none", "backbone"], \       help="freeze the weights of network from start to which layers")   train_parser.add_argument('--run_distribute', type=ast.literal_, default=True, help='Run distribute')   train_args = train_parser.parse_args()   train_args.is_training = True   return train_args打开命令框,cd到train.py文件目录。输入python train.py来训练网络。方式二 命令行指定运行python train.py --platform CPU --dataset_path ../data/flower_photos_train --freeze_layer backbone --pretrain_ckpt ../pretrain_checkpoint/mobilenetv2_cpu_gpu.ckpt --run_distribute False运行Python文件时在交互式命令行中查看打印信息,输出结果如下:train args: Namespace(dataset_path='../data/flower_photos_train', freeze_layer='backbone', is_training=True, platform='CPU', pretrain_ckpt='../pretrain_checkpoint/mobilenetv2_cpu_gpu.ckpt', run_distribute=True)cfg: {'num_classes': 5, 'image_height': 224, 'image_width': 224, 'batch_size': 64, 'epoch_size': 20, 'warmup_epochs': 0, 'lr_init': 0.0, 'lr_end': 0.0, 'lr_max': 0.01, 'momentum': 0.9, 'weight_decay': 4e-05, 'label_smooth': 0.1, 'loss_scale': 1024, 'save_checkpoint': True, 'save_checkpoint_epochs': 5, 'keep_checkpoint_max': 20, 'save_checkpoint_path': './', 'platform': 'CPU', 'run_distribute': False, 'activation': 'Softmax'}Complete the batch 1/56Complete the batch 2/56Complete the batch 3/56...Complete the batch 53/56Complete the batch 54/56Complete the batch 55/56Complete the batch 56/56epoch[1/20], iter[56] cost: 8033.059, per step time: 143.447, avg loss: 1.276epoch[2/20], iter[56] cost: 7573.483, per step time: 135.241, avg loss: 0.880epoch[3/20], iter[56] cost: 7492.869, per step time: 133.801, avg loss: 0.784epoch[4/20], iter[56] cost: 7391.710, per step time: 131.995, avg loss: 0.916epoch[5/20], iter[56] cost: 7421.159, per step time: 132.521, avg loss: 0.827epoch[6/20], iter[56] cost: 7474.850, per step time: 133.479, avg loss: 0.828epoch[7/20], iter[56] cost: 7415.375, per step time: 132.417, avg loss: 0.796epoch[8/20], iter[56] cost: 7369.605, per step time: 131.600, avg loss: 0.714epoch[9/20], iter[56] cost: 7457.325, per step time: 133.167, avg loss: 0.700epoch[10/20], iter[56] cost: 7545.579, per step time: 134.742, avg loss: 0.739epoch[11/20], iter[56] cost: 8036.823, per step time: 143.515, avg loss: 0.685epoch[12/20], iter[56] cost: 7922.403, per step time: 141.471, avg loss: 0.666epoch[13/20], iter[56] cost: 8000.985, per step time: 142.875, avg loss: 0.665epoch[14/20], iter[56] cost: 7997.285, per step time: 142.809, avg loss: 0.657epoch[15/20], iter[56] cost: 7973.143, per step time: 142.378, avg loss: 0.655epoch[16/20], iter[56] cost: 7872.075, per step time: 140.573, avg loss: 0.649epoch[17/20], iter[56] cost: 7925.634, per step time: 141.529, avg loss: 0.646epoch[18/20], iter[56] cost: 7949.169, per step time: 141.949, avg loss: 0.645epoch[19/20], iter[56] cost: 7692.628, per step time: 137.368, avg loss: 0.641epoch[20/20], iter[56] cost: 7353.783, per step time: 131.318, avg loss: 0.640total cost 156.8277 s注意: 当改变batch_size、image_height、image_width参数时,需要删除 ../data/flower_photos_train_features 文件夹,重新生成。因为当特征文件夹(flower_photos_train_features)存在时,为了节约时间,运行时不再特征化(特征化与batch_size、image_height、image_width参数有关,不同的batch_size、image_height、image_width参数生成的特征文件不同)。验证模型使用验证集测试模型性能,需要输入必要参数,--platform默认为“Ascend”,可自行设置为"CPU"或"GPU"。最终在交互式命令行中展示标准输出与错误输出。验证时,运行.py并且传入dataset_path、platform、pretrain_ckpt与--run_distribute四个参数。--dataset_path:测试数据集地址,无默认值,用户测试时必须输入。--platform:处理器类型,默认为“Ascend”,可以设置为“CPU”或“GPU”。本实验设置为“CPU”--pretrain_ckpt:pretrain_checkpoint文件路径以加载训练好的模型--run_distribute:是否使用分布式运行。CPU不支持分布式运行,默认值为False。方式一:略方式二: 命令行指定运行python .py --platform CPU --dataset_path ../data/flower_photos_test  --pretrain_ckpt ./ckpt_0/mobilenetv2_{epoch_num}.ckpt  --run_distribute False运行Python文件时在交互式命令行中输出验证结果,结果如下:result:{'acc': 0.9038461538461539}pretrain_ckpt=./ckpt_0/mobilenetv2_20.ckpt
  • [交流分享] Mindspore训练模型移植到Ascend310步骤
    Mindspore训练模型移植到Ascend310步骤一、模型转换查看模型的原始测试代码:  1、模型需要图片格式Image.open 是使用了python的pil库读取图片,图片格式为RGB 2、图片的预处理:图片预处理做了减均值(mean)、归一化(std)处理。模型输入格式为NCHW。3、配置AIPP文件insert_op.cfg aipp_op { related_input_rank : 0src_image_size_w : 224src_image_size_h : 224crop : falseaipp_mode: staticinput_format : RGB888_U8csc_switch : falserbuv_swap_switch : truemean_chn_0 : 123mean_chn_1 : 117mean_chn_2 : 104min_chn_0 : 0.0min_chn_1 : 0.0min_chn_2 : 0.0var_reci_chn_0 : 0.017507var_reci_chn_1 : 0.017125var_reci_chn_2 : 0.017429}使用imread读入BGR格式图片,在模型转换时使用AIPP 做减均值、归一化处理,将BGR转为RGB格式推理4、ATC转模型atc --model=mobilenetv2.air  --framework=1  --output=mobilenetv2 --insert_op_conf=insert_op.cfg  --soc_version=Ascend310二、模型移植使用https://gitee.com/ascend/samples/tree/master/classification/for_atlas200dk_1.7x.0.0_c++/classification 修改main.cpp中的kModelPath 模型名;uint32_t kModelWidth = 224;uint32_t kModelHeight = 224;const char* kModelPath = "../model/mobilenetv2.om"; 修改物体总类:修改image_net_classes.h  为实际物体种类string kStrImageNetClasses[] = {    "Seashell",    "Lighter",    "Old Mirror",    "Broom",    "Ceramic Bowl",    "Toothbrush",    "Disposable Chopsticks",    "Dirty Cloth",    "Newspaper",    "Glassware",   "Basketball",    "Plastic Bottle",    "Cardboard",    "Glass Bottle",    "Metalware",    "Hats",    "Cans",    "Paper",    "Vegetable Leaf",    "Orange Peel",    "Eggshell",    "Banana Peel",    "Battery",    "Tablet capsules",    "Fluorescent lamp",    "Paint bucket"};三、编译、运行
  • [活动体验] mindspore框架简单易懂,极大提升模型训练的效率 nikaiming@huawei.com
    云上运行了图片识别的模型训练代码,体验非常好,训练框架构建十分合理,有助于提升模型构建思路。邮箱: nikaiming@huawei.com
  • [问题求助] 【Mindspore推理支持】问个Atlas 800-3000服务器上Ascend310 AI处理器的推理问题
    Mindspore团队,你们好我们当前有Huawei Atlas800-3000推理服务器,上面是ARM CPU + Ascend 310处理器的Euler OS 2.8服务器环境。已经安装好npu-smi的驱动和固件。参照此链接内的教程,https://www.mindspore.cn/tutorial/inference/zh-CN/master/multi_platform_inference_ascend_310.html当前我们已经有云上用Ascend910训练好的AIR格式模型,希望能在推理服务器上转换模型后执行推理。mindspore教程里能看到mindspore可以支持Ascend310卡的推理,但细看下是似乎是针对Atlas 200开发者板的教程,好像与服务器的形式不一样?请问mindspore是否支持 Atlas800-3000服务器 上的推理?如果可以是否有安装部署环境的教程?
  • [技术干货] 体验MindSpore新年新版本,前所未有的丝滑
    赶在2020年最后一天,Gitee明星开源项目全场景AI框架 MindSpore 也发布了 1.1 的版本,也意味着MindSpore迎来了新的起点新的征程。年底的MindCon极客周活动让我收获不少,新版本发布,怎么少得了Copy攻城狮的Hello World呢?全新体验 继2020年3月, MindSpore 正式开源,到2020年9月正式发布1.0版本,MindSpore一步一个脚印,终于在2020年11月喜获 OSC 中国开源项目最佳人气项目奖。2021年,MindSpore发布了1.1版本,在新版本增加了统一IR格式MindIR实现一次训练多次部署;提供了全场景部署能力实现MindSpore端云互通;完善了PyNative模式,开发调试更友好;重新设计了调试器的检查能力,更加易用精准;新增了端侧训练特性,使得AI应用越用越精准……而对于Copy攻城狮来说,最喜爱的是教程大规模更新以及打通了一站式AI开发平台ModelArts,在手机上也能学习模型开发及训练;另一个喜爱的点是在Windows上有了更好的安装体验。今天就给大家简单跑一跑 MindSpore 1.1 的 HelloWorld -- 跑通图片分类 LeNet 模型,弥补之前在Windows上安装失败而放弃学习的遗憾!安装 在新版下,Windows的安装体验似乎变得更加丝滑,一行命令安装,一行命令验证安装结果。安装使用的是官方文档提供的脚本,使用到了华为云自家的资源和清华pip镜像,这也许是我和清华唯一的交集:pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.1.0/MindSpore/cpu/windows_x64/mindspore-1.1.0-cp37-cp37m-win_amd64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple# 注意参考官方文档的安装指南,确保安装依赖以及环境变量配置正确# 本次选择选项 1.1.0 Windows CPU Python3.7.5 pip mindspore windows install安装完毕之后还需校验一下本次安装是否成功:python -c "import mindspore;print(mindspore.__version__)"# 1.1.0mindspore check install以上能正常输出MindSpore版本号,Windows上成功安装 MindSpore 1.1.0。接下来开始疯狂Copy代码吧!实操 本次实操会基于Lenet实现一个简单的图片分类的功能,涉及到数据集的准备和处理、定义网络&损失函数&优化器、数据集加载、模型加载\保存\推理\验证等过程,是一些基本的操作,万丈高楼平地起,Copy攻城狮就从这平地开始吧!数据集准备数据集: http://yann.lecun.com/exdb/mnist/能够自己动,绝不手动!我们通过python脚本来下载数据集。我们会引入文件下载和加压gzip文件必备的依赖;定义解压gzip文件的方法;定义下载进度的方法,下载完毕就解压文件最后移除;最后定义数据集下载主函数。具体代码请查阅:https://gitee.com/mindspore/docs/blob/r1.1/tutorials/tutorial_code/lenet/utils/dataset.py数据集的准备工作主要是为了生成如下的文件夹结构,test存放推理数据,train存放训练数据:└─MNIST_Data    ├─test    │      t10k-images.idx3-ubyte    │      t10k-labels.idx1-ubyte    │    └─train            train-images.idx3-ubyte            train-labels.idx1-ubytemindspore lenet mnist训练及推理 我们会用到一些python库和MindSpore中的一些模块,如 os 指定数据集路径,context模块配置运行需要的信息,dataset模块处理数据集如定义数据集、数据增强等,继承mindspore.nn.Cell定义神经网络,从mindspore.nn.loss引入损失函数等等,可以在文件开头引入我们所需要的依赖。然后使用mindspore.dataset模块进行数据集处理;接着定义Lenet网络、定义损失函数及优化器并对模型保存和训练网络进行配置。具体代码请查阅:https://gitee.com/mindspore/docs/blob/r1.1/tutorials/tutorial_code/lenet/lenet.py最后执行python命令进行训练,训练及推理完毕即可查看结果:epoch: 1 step: 1866, loss is 0.1575163epoch: 1 step: 1867, loss is 0.31445956epoch: 1 step: 1868, loss is 0.043173585epoch: 1 step: 1869, loss is 0.12036275epoch: 1 step: 1870, loss is 0.12131009epoch: 1 step: 1871, loss is 0.3510599epoch: 1 step: 1872, loss is 0.078447945epoch: 1 step: 1873, loss is 0.08664515epoch: 1 step: 1874, loss is 0.15272087epoch: 1 step: 1875, loss is 0.007838262============== Starting Testing ============================ Accuracy:{'Accuracy': 0.9649439102564102} ==============mindspore lenet小结 整个流程走完不超过15分钟,在我16年的粗粮笔记本上居然也能流畅运行,尽管因为有代码容易跑起来,但真正想搞懂里边涉及的方方面面可不是一朝一夕就能实现的。路漫漫兮其修远,Copy攻城狮也将上下求索!如有不当,欢迎指正!联系作者:huqi@gpdi.com
  • [技术干货] Mindspore1.1.0版本体验-libssl.so.1.1: cannot open shared file
        刚刚看到官网mindspore更新到1.1.0的版本了,看了一下和1.0.1版本的接口函数差别,感觉用起来更简洁了,比如函数的调用等
  • [活动体验] Copy攻城狮1小时入门AI开发工程师
    Copy攻城狮1小时入门AI开发工程师startTime: 2021年1月23日00:43:22endTime: 2021年1月23日11:34:44(包含学习、睡觉、吃饭、爬坑、水文的时间)Star 仓库发现一个小秘密。 github 上多三个仓库,是什么呢?此处是 github 过滤的 bug ,实际上已关注 15 个仓库, 比 gitee 多出来的三个是:mindspore-21-days-tutorials mail_templates infrastructure别看这 3 个不起眼的仓库,在社区建设方面却大有作为。比如,mindspore-21-days-tutorials是我们参加 21 天实战营的参考代码和指导文档,多么宝贵的学习资料;另外两个是 MindSpore 的开源基础建设,其中infrastructure包含了用于配置 Mindspore 社区的所有必需 Dockerfile 和 YAML 文件,并借助 Github 的 Action 定时自动同步 Gitee 的代码到 Github 。训练时长截图手机识别截图邮箱:huqi@gpdi.com学习总结在学习之前我以为我会了,但真正实践起来还是磕磕碰碰,所有的代码似曾相识,都是 26 个字母加一些符号组成,但真正去理解还是发现基本功不够:一是不知道怎么写,二是不知道为什么要这么写。尽管如此,我大概理顺了整个实践流程:训练猫狗图像分类模型(云端) --> 手机端推理及应用 --> 从 “1” 开始 Fine Tune 模型(本地) --> 手机端验证 ,当然作为学渣,整个操作过程肯定不止一个小时, 深刻体会到“眼睛:学会了,脑子:学废了!”,因此必须借此帖记录一下“学废了”的过程:目的本次实践基于 mobilenetV2 实现猫狗图像分类,贯穿了数据集获取及处理、预训练模型微调及迁移、端侧部署及推理等环节和知识点,体会到了 MindSpore 简单的开发体验和全场景快速部署的魅力。项目目录MindSporePetClassification               ├─ ADB                          // 支持手机与电脑传递文件工具 │  ├─ adb.exe                            │  ├─ AdbWinApi.dll                      │  ├─ AdbWinUsbApi.dll                   │  └─ fastboot.exe                       ├─ code                         // Fine tune训练代码及数据集 │  ├─ dataset                            │  │  ├─ PetImages                       │  │  │  ├─ eval                         │  │  │  │  ├─ Cat│  │  │  │  └─ Dog  │  │  │  ├─ train                         │  │  │  │  ├─ Cat│  │  │  │  └─ Dog                         │  │  ├─ MSR-LA - 3467.docx              │  │  └─ readme[1].txt                   │  ├─ src                                │  │  ├─ __pycache__                     │  │  │  ├─ args.cpython-37.pyc          │  │  │  ├─ config.cpython-37.pyc        │  │  │  ├─ dataset.cpython-37.pyc       │  │  │  ├─ lr_generator.cpython-37.pyc  │  │  │  ├─ mobilenetV2.cpython-37.pyc   │  │  │  ├─ models.cpython-37.pyc        │  │  │  └─ utils.cpython-37.pyc         │  │  ├─ args.py                         │  │  ├─ config.py                       │  │  ├─ dataset.py                      │  │  ├─ lr_generator.py                 │  │  ├─ mobilenetV2.py                  │  │  ├─ models.py                       │  │  └─ utils.py                        │  ├─ mobilenetV2.ckpt                    // 预训练模型文件   │  ├─ preprocessing_dataset.py            // 预先处理数据集脚本│  └─ train.py                            // 主训练脚本├─ converter                              // 转换工具MindSpore Lite Converter│  ├─ converter_lite.exe                 │  ├─ libgcc_s_seh-1.dll                 │  ├─ libglog.dll                        │  ├─ libmindspore_gvar.dll              │  ├─ libssp-0.dll                       │  ├─ libstdc++-6.dll                    │  └─ libwinpthread-1.dll                └─ kagglecatsanddogs_3367a.zip依赖安装本次实践依赖opencv-python 和 matplotlib,一个用来处理图形比如打印图片和嵌入文字,一个用来将数据集以可视化图片的形式展现出来。pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simplepip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple数据预处理主要删除一些不符合要求(如非JPEG格式)的图片并分割 train 和 eval 数据集,默认9:1:python preprocessing_dataset.py 您的路径\kagglecatsaData to Dragnddogs_3367a.zipFine tune执行Fine tune脚本train.py,并生成模型文件:python train.py此时会弹窗提示6张图片,这是因为脚本会在正式训练前从数据集中抽取6张图片载入当前模型文件,需要手动关闭才能继续,这是 AI 很傻,全都识别成了 Dog 。当然,我这边由于机器的原因,没少踩坑,这不“出师未捷身先死”,突然的报错把我整蒙了,将所有num_parallel_workers参数设置为4之后,继续训练!$ python train.pystart cache feature!Traceback (most recent call last):  File "train.py", line 52, in <module>    data, step_size = extract_features(backbone_net, args_opt.dataset_path, config)  File "F:\dosomethings\serverless\ModelArts\MIndSpore\MindSporePetClassification\MindSporePetClassification\code\src\dataset.py", line 84, in extract_features    train_dataset = create_dataset(dataset_path=os.path.join(dataset_path, "train"), do_train=True, config=config)  File "F:\dosomethings\serverless\ModelArts\MIndSpore\MindSporePetClassification\MindSporePetClassification\code\src\dataset.py", line 41, in create_dataset    ds = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True)  File "C:%users\huqi\AppData\Local\Programs\Python\Python37\lib\site-packages\mindspore\dataset\engine\validators.py", line 51, in new_method    validate_dataset_param_value(nreq_param_int, param_dict, int)  File "C:%users\huqi\AppData\Local\Programs\Python\Python37\lib\site-packages\mindspore\dataset\core\validator_helpers.py", line 352, in validate_dataset_param_value    check_num_parallel_workers(param_dict.get(param_name))  File "C:%users\huqi\AppData\Local\Programs\Python\Python37\lib\site-packages\mindspore\dataset\core\validator_helpers.py", line 340, in check_num_parallel_workers    raise ValueError("num_parallel_workers exceeds the boundary between 1 and {}!".format(cpu_count()))ValueError: num_parallel_workers exceeds the boundary between 1 and 4!这一步耗时就和本地机器的性能有关了,我的粗粮渣渣机大概跑废了。趁着训练的空档,学习了一些代码。作为新晋调参学徒,我大概知道参数和配置在code\src\args.py和code\src\config.py这两个文件,而数据的加载在code\src\dataset.py这个文件处理,code\src\mobilenetV2.py定义了模型,code\src\models.py这个文件读取和保存模型并打印输出训练日志。训练完成会,又会调用predict_from_net方法来显示预测的图片和标签,这回我们发现 AI 挺棒的,全部识别正确! 当我满怀信心点击关闭的时候,以为程序立马会给我一个mobilenetv2.mindir,结果我又蒙了,返回了一串错误日志!!!early stop! the best epoch is 2train total cost 4141.2663 sTraceback (most recent call last):  File "train.py", line 81, in <module>    export_mindir(net, "mobilenetv2")  File "F:\dosomethings\serverless\ModelArts\MIndSpore\MindSporePetClassification\MindSporePetClassification\code\src%utils.py", line 93, in export_mindir    export(net, Tensor(input_np), file_name=path, file_format='MINDIR')  File "C:%users\huqi\AppData\Local\Programs\Python\Python37\lib\site-packages\mindspore\train\serialization.py", line 535, in export    Validator.check_file_name_by_regular(file_name)  File "C:%users\huqi\AppData\Local\Programs\Python\Python37\lib\site-packages\mindspore\_checkparam.py", line 438, in check_file_name_by_regular    target, prim_name, reg, flag))ValueError: 'F:\dosomethings\serverless\ModelArts\MIndSpore\MindSporePetClassification\MindSporePetClassification\code\mobilenetv2.mindir'  is illegal, it should be match regular'^[0-9a-zA-Z\_\-\.\/\\]+$' by flags'256'一开始我以为是文件层级太深了,将文件目录迁移到盘的根目录,重来重来!好在不需要再次加载数据集了,不然又得漫长的等待。 满怀信心结果又被“啪啪啪”打脸,之后群里请教一遍之后,王辉老师建议我把路径改成文件名再试试,果然立马奏效~# path = os.path.abspath(f"{name}.mindir")path = name终于如愿以偿,code\mobilenetv2.mindir她来了!手机端推理及应用训练模型转换将.mindir模型文件转换成.ms文件,.ms文件可以导入端侧设备并基于MindSpore端侧框架训练。F:\MindSporePetClassification\converter>call converter_lite --fmk=MINDIR --modelFile=f:\MindSporePetClassification\code\mobilenetv2.mindir --outputFile=pet我们可以下载 MindSpore 官方提供的 Android APP 源码: https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/lite/pet_classification或者直接下载打包好的 APP 安装到手机: https://download.mindspore.cn/model_zoo/official/lite/apk/pet/petclassification.apk先体验下预训练模型的识别效果:接着我们把转换好的模型移动到手机端的/sdcard/PetClassification,这里用到的是 ADB 工具:需要确保手机已开启开发者模式并打开文件传输F:\MindSporePetClassification\converter>adb push f:\MindSporePetClassification\converter\pet.ms /sdcard/PetClassification* daemon not running; starting now at tcp:5037* daemon started successfullyf:\MindSporePetClassification\converter\pet.ms: 1 file pushed, 0 skipped. 43.4 MB/s (8900552 bytes in 0.196s)再试试识别效果:对本次实践 APP 端代码感兴趣的小伙伴可以直接去阅读源码: https://gitee.com/mindspore/mindspore/blob/master/model_zoo/official/lite/pet_classification/app/src/main/java/com/mindspore/classificationforpet/widget/MainActivity.java终于体验完了!
  • [技术干货] 【1.23-1.24 | MindSpore第五期两日集训营】实践作业5(作业失败。非请莫入-重试中,请稍后。。)
    首先说一句,作业4是MindSpore Lite的推理作业,还没看懂。。。不会做。。。所以才跳到作业5.作业5其实给大家出了个难题:MindSpore Serving作为一个“一键部署在线推理服务”的工具,只有昇腾版本。没有CPU和GPU的版本(暂时)。那让这些学生们怎么玩?无非下面几种方式:找个昇腾实体机,比如910或者310机器来玩。在云上找昇腾的云服务器玩。在ModelArts里面找昇腾服务器玩。不过昇腾的910实体机一般都要上万,不是谁都能买得起的。而云服务器和ModelArts这块,自从昇腾收费之后,估计除了壕,没有薅得起了。何况ModelArts目前还只支持MindSpore1.0,不支持 1.1.而Ascend 310机器的最低端 Atlas 200DK张小白倒是有一台。这个到底能不能玩Serving.张小白想尝试一下。不过真的,不见得能成功。。。咱们先有个心态,然后再玩。玩死玩活全靠天意,行不?-----------事实证明尝试失败了。第一步都没完成。暂时没办法在Atlas200DK上安装MindSpore,就更不要提安装Serving了。。。默默地把“干货分享”改为了“问题求助”。。
  • [活动体验] 【奖品展示】体验1小时入门AI工程师课程奖品展示
    ![mmexport1612539178682.jpg](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202102/05/235002mamnrhgq7wgjpyup.jpg)![mmexport1612539176090.jpg](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202102/05/235011hw9w43pol7xd8efh.jpg)![mmexport1612539173722.jpg](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202102/05/235016iaiokxgbrscjbbge.jpg)![mmexport1612539172142.jpg](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202102/05/235025kbsqgdjei1xppwox.jpg)![Screenshot_2021-02-05-23-43-06-319_cn.wps.moffice_eng.xiaomi.lite.jpg](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202102/05/235032oj6kuf3w0alpkqm3.jpg)# 手机码字不容易>太惊喜了,昨天才选的奖品,今天就收到了!## 关于活动先说说活动,再准备看看第五期集训营活动时,无意间看到的了一个一小时的体验活动,最开始不以为然,总把事情想得太简单,以为半小时能搞定,结果一个坑接着一个,具体踩坑经历可以浏览我的历史文章(题外话,也许您就收获了搭建博客教程,总之多参与活动,多多分享!)。再说说活动内容本身,一是我感兴趣的 MindSpore Lite;二是可以宏观了解 MindSpore 开源生态;三是又有题材可以水篇文章;四是懂的都懂……当然,希望在今年能够争取学会自行 Copy 出一套用于移动端的模型并落地!## 关于奖品最后来说说奖品(实在抱歉,又忘了带笔记本电源,只能手机码字,好在体验还不错!)这次活动奖品一如既往地给力,感谢 MindSpore ,不仅都很实用而且还能任选(这么好的福利,您不参加,错亿啊!)。我有幸能拿到两个(别问为什么呢?问就是有黑幕,哈哈),当时还在想能中奖的话是选台灯呢还是电火锅呢?结果,小孩子才做选择题,全都可以要,哈哈!台灯呢,刚好适合夜读和深夜看屏幕,面向深夜学习!电火锅呢,今年又没回去过年,刚能做做火锅红红火火过个好年,真是个好兆头!最后,希望大家在这里能学到知识,多参与活动,多多分享,您总会有收获!感谢这群有趣的人!
  • [技术干货] MindSpore模型精度调优实战(二)精度调试调优思路
    MindSpore模型精度调优实战(二)精度调试调优思路 MindSpore团队 引子:在模型的开发过程中,精度达不到预期常常让人头疼。为了帮助用户解决模型调试调优的问题,我们为MindSpore量身定做了可视化调试调优组件:MindInsight。我们还梳理了针对常见精度问题的调试调优指南,将以“MindSpore模型精度调优实战”系列文章的形式分享出来,希望能帮助用户轻松定位精度问题,快速优化模型精度。 本文是系列分享的第二篇,将给出常用的精度调试调优思路。本系列分享假设您的脚本已经能够运行并算出loss值。如果脚本还不能运行,请先参考相关报错提示进行修改。 遇到精度问题时,常用调试调优思路如下:1.         检查代码和超参2.         检查模型结构3.         检查输入数据4.         检查loss曲线5.         检查精度是否达到预期 代码是精度问题的重要源头,检查代码重在对脚本和代码做检查,力争在源头发现问题(第2节);模型结构体现了MindSpore对代码的理解,检查模型结构重在检查MindSpore的理解和算法工程师的设计是否一致(第3节);有的问题要到动态的训练过程中才会发现,检查输入数据(第4节)和loss曲线(第5节)正是将代码和动态训练现象结合进行检查;检查精度是否达到预期则是对整体精度调优过程重新审视,并考虑调整超参、解释模型、优化算法等调优手段(第6节)。此外,熟悉模型和工具也是很重要的(第1节)。下面将分别介绍这些思路。0  精度调优准备0.1      回顾算法设计,全面熟悉模型精度调优前,要先对算法设计做回顾,确保算法设计明确。如果参考论文实现模型,则应回顾论文中的全部设计细节和超参选择情况;如果参考其它框架脚本实现模型,则应确保有一个唯一的、精度能够达标的标杆脚本;如果是新开发的算法,也应将重要的设计细节和超参选择明确出来。这些信息是后面检查脚本步骤的重要依据。 精度调优前,还要全面熟悉模型。只有熟悉了模型,才能准确理解MindInsight提供的信息,判断是否存在问题,查找问题源头。因此,花时间理解模型算法和结构、理解模型中算子的作用和参数的含义、理解模型所用优化器的特性等模型要素是很重要的。动手分析精度问题细节前,建议先带着问题加深对这些模型要素的了解。 0.2      熟悉工具MindInsight功能丰富,建议用户简单阅读MindInsight教程(https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/visualization_tutorials.html),了解主要功能。定位精度问题时,建议使能summary训练信息收集功能,在脚本中加入SummaryCollector,并使用训练看板查看训练过程数据,如下图所示。Summary功能的使用指南请见 https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/summary_record.html,训练可视功能的使用指南请见 https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/dashboard.html。图 1在训练脚本中加入SummaryCollector以使用MindInsight 图 2 训练看板 当您需要在线调试模型时,请参考此链接使能调试器功能:https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/debugger.html1  检查代码和超参代码是精度问题的重要源头,超参问题、模型结构问题、数据问题、算法设计和实现问题会体现在脚本中,对脚本做检查是定位精度问题很有效率的手段。检查代码主要依赖代码走读,建议使用小黄鸭调试法:在代码走读的过程中,耐心地向没有经验的“小黄鸭”解释每一行代码的作用,从而激发灵感,发现代码问题。检查脚本时,要注意检查脚本实现(包括数据处理、模型结构、loss函数、优化器等实现)同设计是否一致,如果参考了其它脚本,要重点检查脚本实现同其它脚本是否一致,所有不一致的地方都应该有充分合理的理由,否则就应修改。 检查脚本时,也要关注超参的情况,超参问题主要体现为超参取值不合理,例如学习率设置不合理;loss_scale参数不合理;权重初始化参数不合理等。 MindInsight可以辅助用户对超参做检查,大多数情况下,SummaryCollector会自动记录常见超参,您可以通过MindInsight的训练参数详情功能(如下图)和溯源分析功能查看超参。结合MindInsight模型溯源分析模块和脚本中的代码,可以确认超参的取值,识别明显不合理的超参。如果有标杆脚本,建议同标杆脚本一一比对超参取值,如果有默认参数值,则默认值也应一并比对,以避免不同框架的参数默认值不同导致精度下降或者训练错误。图 3通过MindInsight训练参数详情查看模型超参 2 检查模型结构在模型结构方面,常见的问题有:算子使用错误(使用的算子不适用于目标场景,如应该使用浮点除,错误地使用了整数除);权重共享错误(共享了不应共享的权重);权重冻结错误(冻结了不应冻结的权重);节点连接错误(应该连接到计算图中的block未连接);loss函数错误;优化器算法错误(如果自行实现了优化器)等。 建议通过检查模型代码的方式对模型结构进行检查。此外,MindInsight也可以辅助用户对模型结构进行检查。大多数情况下,SummaryCollector会自动记录计算图,通过MindInsight,用户可以方便地对计算图进行查看。模型脚本运行后,建议使用MindInsight计算图可视模块查看模型结构,加深对计算图的理解,确认模型结构符合预期。若有标杆脚本,还可以同标杆脚本对照查看计算图,检查当前脚本和标杆脚本的计算图是否存在重要的差异。 图 4 通过MindInsight训练看板中的计算图模块查看模型结构 考虑到模型结构一般都很复杂,期望在这一步就能发现所有的模型结构问题是不现实的。只要通过可视化的模型结构加深对计算图的理解,发现明显的结构问题即可。后面的步骤中,发现了更明确的精度问题现象后,我们还会回到这一步重新检查确认。 注1:MindInsight支持查看SummaryCollector记录的计算图和MindSpore context的save_graphs参数导出的pb文件计算图。请参考我们教程中的“计算图可视化”部分了解更多信息(https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/dashboard.html)。注2:脚本迁移工具可以将PyTorch、TensorFlow框架下编写的模型转换为MindSpore脚本,请访问教程 https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/migrate_3rd_scripts_mindconverter.html 以了解更多信息。3 检查输入数据通过检查输入模型的数据,可以结合脚本判断数据处理流水线和数据集是否存在问题。输入数据的常见问题有:数据缺失值过多;每个类别中的样本数目不均衡;数据中存在异常值;数据标签错误;训练样本不足;未对数据进行标准化,输入模型的数据不在正确的范围内;finetune和pretrain的数据处理方式不同;训练阶段和推理阶段的数据处理方式不同;数据处理参数不正确等。 MindInsight可以辅助用户对输入数据、数据处理流水线进行检查。大多数情况下,SummaryCollector会自动记录输入模型的数据(数据处理后的数据)和数据处理流水线参数。输入模型的数据会展示在“数据抽样”模块,数据处理流水线参数会展示在“数据图”模块和“数据溯源”模块。 通过MindInsight的数据抽样模块,可以检查输入模型的(数据处理流水线处理后的)数据。若数据明显不符合预期(例如数据被裁剪的范围过大,数据旋转的角度过大等),可以判断输入数据出现了一定的问题。 通过MindInsight的数据图和数据溯源模块,可以检查数据处理流水线的数据处理过程和具体参数取值,从而发现不合理的数据处理方法。图 5通过MindInsight训练看板中的数据抽样模块查看输入模型的数据图 6通过MindInsight训练看板中的数据图查看数据处理流水线 如果有标杆脚本,还可以同标杆脚本对照,检查数据处理流水线输出的数据是否和当前脚本的数据相同。例如,将数据处理流水线输出的数据保存为npy文件,然后使用numpy.allclose()方法对标杆脚本和当前脚本的数据进行对比。如果发现不同,则数据处理阶段可能存在精度问题。 若数据处理流水线未发现问题,可以手动检查数据集是否存在分类不均衡、标签匹配错误、缺失值过多、训练样本不足等问题。4 检查loss曲线很多精度问题会在网络训练过程中发现,常见的问题或现象有:权重初始化不合理(例如初始值为0,初始值范围不合理等);权重中存在过大、过小值;权重变化过大;权重冻结不正确;权重共享不正确;激活值饱和或过弱(例如Sigmoid的输出接近1,Relu的输出全为0);梯度爆炸、消失;训练epoch不足;算子计算结果存在NAN、INF;算子计算过程溢出(计算过程中的溢出不一定都是有害的)等。 上述这些问题或现象,有的可以通过loss表现出来,有的则难以观察。MindInsight提供了针对性的功能,可以观察上述现象、自动检查问题,帮助您更快定位问题根因。例如:l  MindInsight的参数分布图模块可以展示模型权重随训练过程的变化趋势;l  MindInsight的张量可视模块可以展示张量的具体取值,对不同张量进行对比;l  MindInsight调试器内置了种类丰富,功能强大的检查能力,可以检查权重问题(例如权重不更新、权重更新过大、权重值过大/过小)、梯度问题(例如梯度消失、梯度爆炸)、激活值问题(例如激活值饱和或过弱)、张量全为0、NAN/INF、算子计算过程溢出等问题。调试器使用教程: https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/debugger.html 图 7通过MindInsight训练看板中的标量可视模块查看loss曲线大多数情况下,SummaryCollector会自动记录模型的loss曲线,可以通过MindInsight的标量可视模块查看。loss曲线能够反映网络训练的动态趋势,通过观察loss曲线,可以得到模型是否收敛、是否过拟合等信息。 图 8通过MindInsight参数分布图可以查看训练过程中的权重变化情况大多数情况下,SummaryCollector会自动记录模型参数变化情况(默认记录5个参数),可以通过MindInsight的参数分布图模块查看。如果想要记录更多参数的参数分布图,请参考SummaryCollector的histogram_regular参数(https://www.mindspore.cn/doc/api_python/zh-CN/master/mindspore/mindspore.train.html#mindspore.train.callback.SummaryCollector),或参考HistogramSummary算子(https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/summary_record.html#summarysummarycollector)。 图 9通过MindInsight训练看板中的张量可视模块查看特定张量的具体取值张量不会被自动记录,如果想要通过MindInsight查看张量的具体取值,请使用TensorSummary算子 (https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/summary_record.html#summarysummarycollector)。 下面结合loss曲线的常见现象介绍使用MindInsight进行精度问题定位的思路。4.1 loss跑飞loss跑飞是指loss中出现了NAN、+/-INF或者特别大的值。loss跑飞一般意味着算法设计或实现存在问题。定位思路如下:回顾脚本、模型结构和数据,检查超参是否有不合理的特别大/特别小的取值,检查模型结构是否实现正确,特别是检查loss函数是否实现正确,检查输入数据中是否有缺失值、是否有特别大/特别小的取值。观察训练看板中的参数分布图,检查参数更新是否有明显的异常。若发现参数更新异常,可以结合调试器定位参数更新异常的原因。使用调试器模块对训练现场进行检查。若loss值出现NAN、+/-INF,可使用“检查张量溢出”条件添加全局监测点,定位首先出现NAN、+/-INF的算子节点,检查算子的输入数据是否会导致计算异常(例如除零)。若是算子输入数据的问题,则可以针对性地加入小数值epsilon避免计算异常。若loss值出现特别大的值,可使用“检查过大张量”条件添加全局监测点,定位首先出现大值的算子节点,检查算子的输入数据是否会导致计算异常。若输入数据本身存在异常,则可以继续向上追踪产生该输入数据的算子,直到定位出具体原因。若怀疑参数更新、梯度等方面存在异常,可使用“检查权重变化过大”、“检查梯度消失”、“检查梯度过大”等条件设置监测点,定位到异常的权重或梯度,然后结合张量检查视图,逐层向上对可疑的正向算子、反向算子、优化器算子等进行检查。 4.2 loss收敛慢loss收敛慢是指loss震荡、收敛速度慢,经过很长时间才能达到预期值,或者最终也无法收敛到预期值。相较于loss跑飞,loss收敛慢的数值特征不明显,更难定位。定位思路如下:回顾脚本、模型结构和数据,检查超参是否有不合理的特别大/特别小的取值,特别是检查学习率是否设置过小或过大,学习率设置过小会导致收敛速度慢,学习率设置过大会导致loss震荡、不下降;检查模型结构是否实现正确,特别是检查loss函数、优化器是否实现正确;检查输入数据的范围是否正常,特别是输入数据的值是否过小观察训练看板中的参数分布图,检查参数更新是否有明显的异常。若发现参数更新异常,可以结合调试器定位参数更新异常的原因。使用调试器模块对训练现场进程检查。可使用“检查权重变化过小”、“检查未变化权重”条件对可训练(未固定)的权重进行监测,检查权重是否变化过小。若发现权重变化过小,可进一步检查学习率取值是否过小、优化器算法是否正确实现、梯度是否消失,并做针对性的修复。可使用“检查梯度消失”条件对梯度进行监测,检查是否存在梯度消失的现象。若发现梯度消失,可进一步向上检查导致梯度消失的原因。例如,可以通过“检查激活值范围”条件检查是否出现了激活值饱和、Relu输出为0等问题。 4.3 其它loss现象若训练集上loss为0,一般说明模型出现了过拟合,请尝试增大训练集大小。5 检查精度是否达到预期MindInsight可以为用户记录每次训练的精度结果。在model.train和model.eval中使用同一个SummaryCollector实例时,会自动记录模型评估(metrics)信息。训练结束后,可以通过MindInsight的模型溯源模块检查训练结果精度是否达标。图 10通过MindInsight溯源分析功能查看模型评估信息 若模型的loss值、metric值未达到预期,可以参考以下思路进行定位和优化:回顾代码、模型结构、输入数据和loss曲线,检查超参是否有不合理的值检查模型结构是否实现正确检查输入数据是否正确检查loss曲线的收敛结果和收敛趋势是否存在异常尝试使用MindInsight溯源分析功能优化超参。溯源分析页面会对超参的重要性进行分析,用户应优先考虑调整重要性高的超参,从散点图中可以观察出超参和优化目标的关系,从而针对性地调整超参取值。图 11通过MindInsight溯源分析查看参数重要性图 12通过MindInsight溯源分析以散点图形式查看参数和优化目标的关系尝试使用MindInsight调参器优化超参。请注意,调参器通过执行多次完整训练的方式进行超参搜索,消耗的时间为网络一次训练用时的若干倍,如果网络一次训练耗时较长,则超参搜索将需要很长的时间。调参器使用教程: https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/hyper_parameters_auto_tuning.html尝试使用MindInsight模型解释功能优化模型数据集。模型解释功能可以通过显著图可视化展示对分类结果最重要的区域,还可以通过评分体系提示应该对哪类标签进行优化。模型解释使用教程:  https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/model_explaination.html尝试优化模型结构/算法。 6      小结由于相同的现象存在多个可能原因,精度问题的定位非常依赖专家经验。希望上述定位方法和功能能够起到良好的引导的作用,帮助你不断积累成功经验,成为精度调优大师。 7 欢迎关注我们MindSpore官网: https://www.mindspore.cn/MindSpore代码仓库: https://gitee.com/mindspore/mindsporeMindInsight代码仓库: https://gitee.com/mindspore/mindinsightMindInsight使用教程: https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/visualization_tutorials.html 
  • [技术干货] 一站式学习MindSpore|看你想看
    1.1 MindSporeMindSpore是由华为于2019年8月推出的新一代全场景AI计算框架,2020年3月28日,华为宣布MindSpore正式开源。1.2 MindSpore安装了解了MindSpore后,是不是跃跃欲试了呢?准备好啦。这里我们从安装开始,MindSpore的安装可以分为执行安装命令和源码编译安装两种方式。可以在MindSpore官网中获取安装命令直接执行安装,也可以通过源码编译方式安装。因为源码编译安装步骤较多,所以有用户自己安装经验的总结分享,感谢作者,也欢迎各位的体验分享。1.3 快速入门MindSpore安装完成后,开启我们的MindSpore之旅。从MindSpore的基础使用开始,以图片分类进行演示,高效快速的带你入门。本章节主要讲解MindSpore的使用,并通过使用MindSpore实现自然语言处理、图像识别等多种AI实战。准确掌握更多MindSpore的使用方法。让MindSpore成为你AI路上强大的伙伴。2.1 学习MindSpore的使用MindSpore的使用包括训练、推理和端侧设备使用三部分。大家可以根据自身情况选择不同阶段进行学习。2.2 学习MindSpore中的网络模型和概率映射2.3 使用MindSpore实战实战内容可以分为自然语言处理、图像识别和点击率预估三个类别,每一类下面有不同的项目,大家可根据自己的兴趣学习实战。2.3.1自然语言处理:2.3.2图像识别:2.3.3点击率预估:2.3.4MindSpore Lite实战:本章节主要是带大家了解MindSpore框架的发展趋势、MindSpore的挑战和解决思路以及MindSpore的创新算法,可以帮助大家掌握原理,提升使用技巧。3.1 MindSpore的挑战和解决思路3.2 MindSpore创新算法本部分内容属于用户个人总结分享,欢迎大家浏览留言讨论。此处内容帮助各位拓展,更全面的了解MindSpore。
总条数:404 到第
上滑加载中