• [技术干货] 昇腾平台YOLO训练和推理技术洞察
    1      YOLO介绍YOLO(You Only Look Once)是一种流行的实时目标检测算法,以其高速和高精度著称。与传统的目标检测方法(如R-CNN系列)不同,YOLO将目标检测任务视为单一的回归问题,直接从图像像素中预测边界框和类别概率,实现了“端到端”的检测。         YOLO将输入图像划分为 S×S 的网格(例如7×7),每个网格负责预测多个边界框(Bounding Box)及其置信度(Confidence Score)和类别概率。边界框:包含框的中心坐标、宽高。置信度:反映框内是否存在目标以及预测的准确性。类别概率:使用Softmax预测框内物体的类别。         传统方法(如滑动窗口)需要多次扫描图像,而YOLO仅需“看一次”(You Only Look Once),通过卷积神经网络一次性输出所有检测结果,因此速度极快。         在昇腾(Ascend)平台上运行YOLO(You Only Look Once)目标检测算法具有重要的技术意义和商业价值,尤其在AI加速计算领域。昇腾是华为推出的高性能AI处理器(如Ascend 910/310),结合昇腾AI软件栈(CANN、MindSpore等),能够显著提升YOLO的推理和训练效率。以下是其核心意义:1. 高性能加速,满足实时性需求;2. 边缘到云的灵活部署;3. 软硬件协同优化。 2      系统环境安装         昇腾平台运行YOLO需要安装这些工具:1.     Ascend-cann-toolkit_8.0.RC3_linux-aarch64,2.     Ascend-cann-kernels-910b_8.0.RC3_linux-aarch64,3.     mindspore=2.5.0,4.     python=3.9, python3.9的环境的安装命令如下,python的版本号为3.10或者3.11会报错:conda create -n yolo20250705python3d9d8 python=3.9conda activate yolo20250705python3d9d8 下载CANN8.0相关工具的网址:https://www.hiascend.com/developer/download/community/result?module=cann&cann=8.0.RC3.beta1;将下载得到的工具包传至服务器,然后安装;使用CANN=8.1或者8.2运行YOLO有可能会报错;安装CANN的命令如下:/tmp/Ascend-cann-toolkit_8.0.RC3_linux-aarch64.run --install/tmp/Ascend-cann-kernels-910b_8.0.RC3_linux-aarch64.run --devel  下载MindSpore的网址:cid:link_0;安装MindSpore的命令如下:pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.5.0/MindSpore/unified/aarch64/mindspore-2.5.0-cp39-cp39-linux_aarch64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple 代码目录:/apply/yolo20250811/ 进入代码目录:cd /apply/yolo20250811安装环境包资源:pip install -r requirements.txt系统需要安装mesa-libGL工具包,不安装有时会报错:sudo yum install mesa-libGLpython环境需要安装这些工具包,不安装有时会报错;albumentations的版本号>=2.0会报错:pip install sympypip install tepip install albumentations==1.4.24 3      昇腾平台的YOLO的训练与推理训练命令;没有“--ms_mode 1”会报错:python train.py --epochs 600 --config ./configs/yolov11/yolov11-n.yaml --data_dir  ./cache/data/coco --keep_checkpoint_max 1 --auto_accumulate True --per_batch_size 25 --weight ./cache/pretrain_ckpt/yolov11n.ckpt --ms_mode 1 推理命令:python ./demo/predict.py --config ./configs/yolov11/yolov11-n.yaml --weight ./cache/pretrain_ckpt/yolov11n.ckpt --image_path ./cache/data/coco/images/val2017/000000550691.jpg yolo训练日志: (yolo20250705python3d9d8) [root@bms-jp ascendyolo_run_for_v811_20250417a1]# python train.py --epochs 600 --config ./configs/yolov11/yolov11-n.yaml --data_dir  ./cache/data/coco --keep_checkpoint_max 1 --auto_accumulate True --per_batch_size 25 --weight ./cache/pretrain_ckpt/yolov11n.ckpt --ms_mode 1/root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:549: UserWarning: The value of the smallest subnormal for <class 'numpy.float64'> type is zero.  setattr(self, word, getattr(machar, word).flat[0])/root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:89: UserWarning: The value of the smallest subnormal for <class 'numpy.float64'> type is zero.  return self._float_to_str(self.smallest_subnormal)/root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:549: UserWarning: The value of the smallest subnormal for <class 'numpy.float32'> type is zero.  setattr(self, word, getattr(machar, word).flat[0])/root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:89: UserWarning: The value of the smallest subnormal for <class 'numpy.float32'> type is zero.  return self._float_to_str(self.smallest_subnormal)2025-07-05 22:45:27,447 [INFO] parse_args:2025-07-05 22:45:27,447 [INFO] task                                    detect2025-07-05 22:45:27,447 [INFO] device_target                           Ascend2025-07-05 22:45:27,447 [INFO] save_dir                                ./runs/2025.07.05-22.45.272025-07-05 22:45:27,447 [INFO] log_level                               INFO2025-07-05 22:45:27,447 [INFO] is_parallel                             False2025-07-05 22:45:27,447 [INFO] ms_mode                                 12025-07-05 22:45:27,447 [INFO] max_call_depth                          20002025-07-05 22:45:27,447 [INFO] ms_amp_level                            O22025-07-05 22:45:27,447 [INFO] keep_loss_fp32                          True2025-07-05 22:45:27,447 [INFO] anchor_base                             False2025-07-05 22:45:27,447 [INFO] ms_loss_scaler                          dynamic2025-07-05 22:45:27,447 [INFO] ms_loss_scaler_value                    65536.02025-07-05 22:45:27,447 [INFO] ms_jit                                  True2025-07-05 22:45:27,447 [INFO] ms_enable_graph_kernel                  False2025-07-05 22:45:27,447 [INFO] ms_datasink                             False2025-07-05 22:45:27,447 [INFO] overflow_still_update                   False2025-07-05 22:45:27,447 [INFO] clip_grad                               True2025-07-05 22:45:27,447 [INFO] clip_grad_value                         10.02025-07-05 22:45:27,447 [INFO] ema                                     True2025-07-05 22:45:27,447 [INFO] weight                                  ./cache/pretrain_ckpt/yolov11n.ckpt2025-07-05 22:45:27,447 [INFO] ema_weight                              2025-07-05 22:45:27,447 [INFO] freeze                                  []2025-07-05 22:45:27,447 [INFO] epochs                                  6002025-07-05 22:45:27,447 [INFO] per_batch_size                          252025-07-05 22:45:27,447 [INFO] img_size                                6402025-07-05 22:45:27,447 [INFO] nbs                                     642025-07-05 22:45:27,447 [INFO] accumulate                              3.02025-07-05 22:45:27,447 [INFO] auto_accumulate                         True2025-07-05 22:45:27,447 [INFO] log_interval                            1002025-07-05 22:45:27,447 [INFO] single_cls                              False2025-07-05 22:45:27,447 [INFO] sync_bn                                 False2025-07-05 22:45:27,447 [INFO] keep_checkpoint_max                     12025-07-05 22:45:27,447 [INFO] run_eval                                False2025-07-05 22:45:27,447 [INFO] conf_thres                              0.0012025-07-05 22:45:27,447 [INFO] iou_thres                               0.72025-07-05 22:45:27,447 [INFO] conf_free                               True2025-07-05 22:45:27,447 [INFO] rect                                    False2025-07-05 22:45:27,447 [INFO] nms_time_limit                          20.02025-07-05 22:45:27,447 [INFO] recompute                               False2025-07-05 22:45:27,447 [INFO] recompute_layers                        02025-07-05 22:45:27,447 [INFO] seed                                    22025-07-05 22:45:27,447 [INFO] summary                                 True2025-07-05 22:45:27,447 [INFO] profiler                                False2025-07-05 22:45:27,447 [INFO] profiler_step_num                       12025-07-05 22:45:27,447 [INFO] opencv_threads_num                      02025-07-05 22:45:27,447 [INFO] strict_load                             True2025-07-05 22:45:27,447 [INFO] enable_modelarts                        False2025-07-05 22:45:27,447 [INFO] data_url                                2025-07-05 22:45:27,447 [INFO] ckpt_url                                2025-07-05 22:45:27,447 [INFO] multi_data_url                          2025-07-05 22:45:27,447 [INFO] pretrain_url                            2025-07-05 22:45:27,447 [INFO] train_url                               2025-07-05 22:45:27,447 [INFO] data_dir                                ./cache/data/coco2025-07-05 22:45:27,447 [INFO] ckpt_dir                                /cache/pretrain_ckpt/2025-07-05 22:45:27,447 [INFO] data.dataset_name                       coco2025-07-05 22:45:27,447 [INFO] data.train_set                          /apply/yolo20250811/cache/data/coco/train2017.txt2025-07-05 22:45:27,447 [INFO] data.val_set                            /apply/yolo20250811/cache/data/coco/val2017.txt2025-07-05 22:45:27,447 [INFO] data.test_set                           /apply/yolo20250811/cache/data/coco/test-dev2017.txt2025-07-05 22:45:27,447 [INFO] data.nc                                 802025-07-05 22:45:27,447 [INFO] data.names                              ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']2025-07-05 22:45:27,447 [INFO] train_transforms.stage_epochs           [590, 10]2025-07-05 22:45:27,447 [INFO] train_transforms.trans_list             [[{'func_name': 'mosaic', 'prob': 1.0}, {'func_name': 'copy_paste', 'prob': 0.1, 'sorted': True}, {'func_name': 'resample_segments'}, {'func_name': 'random_perspective', 'prob': 1.0, 'degrees': 0.0, 'translate': 0.1, 'scale': 0.5, 'shear': 0.0}, {'func_name': 'albumentations'}, {'func_name': 'hsv_augment', 'prob': 1.0, 'hgain': 0.015, 'sgain': 0.7, 'vgain': 0.4}, {'func_name': 'fliplr', 'prob': 0.5}, {'func_name': 'label_norm', 'xyxy2xywh_': True}, {'func_name': 'label_pad', 'padding_size': 160, 'padding_value': -1}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}], [{'func_name': 'letterbox', 'scaleup': True}, {'func_name': 'resample_segments'}, {'func_name': 'random_perspective', 'prob': 1.0, 'degrees': 0.0, 'translate': 0.1, 'scale': 0.5, 'shear': 0.0}, {'func_name': 'albumentations'}, {'func_name': 'hsv_augment', 'prob': 1.0, 'hgain': 0.015, 'sgain': 0.7, 'vgain': 0.4}, {'func_name': 'fliplr', 'prob': 0.5}, {'func_name': 'label_norm', 'xyxy2xywh_': True}, {'func_name': 'label_pad', 'padding_size': 160, 'padding_value': -1}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}]]2025-07-05 22:45:27,447 [INFO] data.test_transforms                    [{'func_name': 'letterbox', 'scaleup': False, 'only_image': True}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}]。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。[INFO] albumentations load success[WARNING] ME(50295:281473090502688,MainProcess):2025-07-05-22:46:03.231.109 [mindspore/run_check/_check_version.py:305] The version 7.6 used for compiling the custom operator does not match Ascend AI software package version 7.5 in the current environment......2025-07-05 22:47:15,474 [WARNING] Epoch 1/600, Step 1/2, accumulate: 3.0, this step grad overflow, drop. Loss scale adjust to 32768.02025-07-05 22:47:15,809 [WARNING] Epoch 1/600, Step 2/2, accumulate: 3.0, this step grad overflow, drop. Loss scale adjust to 16384.02025-07-05 22:47:16,184 [INFO] Epoch 1/600, Step 2/2, imgsize (640, 640), loss: 3.5250, lbox: 1.0629, lcls: 1.3194, dfl: 1.1426, cur_lr: 1.9966999388998374e-052025-07-05 22:47:17,505 [INFO] Epoch 1/600, Step 2/2, step time: 49088.29 ms2025-07-05 22:47:18,444 [INFO] Saving model to ./runs/2025.07.05-22.45.27/weights/yolov11-n-1_2.ckpt2025-07-05 22:47:18,444 [INFO] Epoch 1/600, epoch time: 1.65 min.2025-07-05 22:47:18,710 [WARNING] Epoch 2/600, Step 1/2, accumulate: 3.0, this step grad overflow, drop. Loss scale adjust to 8192.02025-07-05 22:47:19,024 [INFO] Epoch 2/600, Step 2/2, imgsize (640, 640), loss: 3.6963, lbox: 1.0847, lcls: 1.4422, dfl: 1.1694, cur_lr: 3.986799856647849e-052025-07-05 22:47:19,037 [INFO] Epoch 2/600, Step 2/2, step time: 296.27 ms2025-07-05 22:47:19,945 [INFO] Saving model to ./runs/2025.07.05-22.45.27/weights/yolov11-n-2_2.ckpt2025-07-05 22:47:19,946 [INFO] Epoch 2/600, epoch time: 0.03 min.2025-07-05 22:47:20,223 [WARNING] Epoch 3/600, Step 1/2, accumulate: 3.0, this step grad overflow, drop. Loss scale adjust to 4096.0   yolo推理日志: (yolo20250705python3d9d8) [root@bms-jp ascendyolo_run_for_v811_20250417a1]# python ./demo/predict.py --config ./configs/yolov11/yolov11-n.yaml --weight ./cache/pretrain_ckpt/yolov11n.ckpt --image_path ./cache/data/coco/images/val2017/000000550691.jpg                                                                                                                                              /root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:549: UserWarning: The value of the smallest subnormal for  type is zero.     setattr(self, word, getattr(machar, word).flat[0])                                                                                                                                                /root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:89: UserWarning: The value of the smallest subnormal for  type is zero.      return self._float_to_str(self.smallest_subnormal)                                                                                                                                                /root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:549: UserWarning: The value of the smallest subnormal for  type is zero.     setattr(self, word, getattr(machar, word).flat[0])                                                                                                                                                /root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:89: UserWarning: The value of the smallest subnormal for  type is zero.      return self._float_to_str(self.smallest_subnormal)                                                                                                                                                2025-07-05 22:50:19,157 [WARNING] Parse Model, args: nearest, keep str type                                                                                                                         2025-07-05 22:50:19,204 [WARNING] Parse Model, args: nearest, keep str type                                                                                                                         2025-07-05 22:50:19,584 [INFO] number of network params, total: 2.639747M, trainable: 2.624064M                                                                                                     [WARNING] ME(66771:281473260486688,MainProcess):2025-07-05-22:50:26.245.7 [mindspore/train/serialization.py:1956] For 'load_param_into_net', remove parameter prefix name: ema., continue to load.  2025-07-05 22:50:26,023 [INFO] Load checkpoint from [./cache/pretrain_ckpt/yolov11n.ckpt] success.                                                                                                  .Warning: tiling offset out of range, index: 32                                                                                                                                                     .Warning: tiling offset out of range, index: 32                                                                                                                                                     .Warning: tiling offset out of range, index: 32                                                                                                                                                     Warning: tiling offset out of range, index: 32                                                                                                                                                      Warning: tiling offset out of range, index: 32                                                                                                                                                      Warning: tiling offset out of range, index: 32                                                                                                                                                      ..2025-07-05 22:51:27,507 [INFO] Predict result is: {'category_id': [6, 3, 3, 6, 6], 'bbox': [[194.125, 54.75, 243.875, 354.25], [115.25, 286.5, 82.25, 68.0], [442.0, 283.0, 24.0, 20.0], [3.25, 215.25, 160.75, 64.0], [3.875, 215.5, 159.875, 96.5]], 'score': [0.93115, 0.90283, 0.70898, 0.58154, 0.45508]}                                                                                        2025-07-05 22:51:27,507 [INFO] Speed: 61360.0/11.5/61371.5 ms inference/NMS/total per 640x640 image at batch-size 1;                                                                                2025-07-05 22:51:27,507 [INFO] Detect a image success.                                                                                                                                              2025-07-05 22:51:27,516 [INFO] Infer completed.     4      总结         在昇腾(Ascend)平台上成功运行YOLO模型的训练和推理,通过CANN软件栈和MindSpore框架的深度适配,实现了高效的算子优化及硬件加速(如昇腾910B/310)。关键技术包括动态分片、混合精度训练和DVPP硬件预处理,显著提升了目标检测的推理性能。昇腾NPU在CV任务中的具有强大的竞争力。昇腾显卡在边缘计算、智能安防等场景的AI部署具有重要的产业意义。        
  • [ModelArts昇...] Ascend-cann-toolkit_6.0.RC1_linux-aarch64.run 下载路径
    适合Atlas 200I DK A2套件和Atlas 200I A2加速模块的ATC工具
  • [问题求助] 算法app安装签名校验失败
    M6781-10-GZ40-W5型号球机签名校验失败
  • [应用开发] SegFormer-B0 OM模型在MDC300F上推理时间为1000ms
    在将segformer-b0算法模型转OM后,在MDC300F MINI上推理耗时1000ms。ONNX中MatMul算子的输入数据的shape带batch维度,将算子的type类型更改为 BatchMatMul后,转OM时,发现MatMul算子前后各出现一个trans_TransData算子。通过profiling计算算子耗时,发现TransposeD、ArgMaxD、TransData、SoftmaxV2、BatchMatMul占用大量的推理时间。请问如何避免带batch维度的MatMul产生TransData算子?针对现在算子耗时,有什么优化的方法吗?
  • [问题求助] 80分类coco128数据集子训练yolov5,成功安装App,但检测不出来结果
    已经成功嵌入到相机里面了, 就是检测不出结果。是不是中间有什么坑!请问是为什么?
  • [技术干货] 自动驾驶(AIOT) - 轻量级目标检测与分割算法开发和部署(RK3568)
    自动驾驶(AIOT) - 轻量级目标检测与分割算法开发和部署(RK3568)本文将在ModelArts平台上开发轻量级目标检测与分割算法,并使用ModelBox框架在RK3568开发板上实现模型推理和部署。数据准备我们收集了一份200张由Labelme标注的道路图像分割数据集,之后使用脚本将其转换为VOC格式的数据集并进行数据增强:处理好的数据集已经分享到AI Gallery上,可以使用OBS下载:算法简介像素级的图像分割不仅需要精确,有时还需要高效以便应用到real-time application比如自动驾驶汽车等。现有的方法可能精度较高但往往参数量巨大,为了解决这个问题,我们使用LinkNet作为主干网络[Fig. 1],中间层[Fig. 2]使用LeakyRelu进行激活,最后一层使用Sigmoid做归一化,并在Encoder Block 4后增添目标检测分支,训练过程中进行梯度裁剪防止梯度爆炸。云端训练算法详情可以运行我发布的Notebook,并下载转换好的模型文件:端侧推理1、我们在VS Code中使用Remote-SSH远程连接ModelBox端云协同AI开发套件(RK3568):2、在SDK目录下使用create.py脚本创建工程object_detection_seg(od_seg):3、创建推理功能单元yolo_tf_seg:4、将转换好的模型放到yolo_tf_seg目录下,我们的模型有一个输入和两个输出:修改配置文件如下:5、创建后处理功能单元post_process:对于后处理功能单元,我们在config中配置参数,接收2个float类型的推理结果,返回类别检测框和图像掩码:对应的逻辑代码如下:6、创建绘图功能单元draw_image:对于绘图功能单元,我们接收解码后的原始图像和目标检测框以及分割图像,对应的配置文件如下:接下来补充逻辑代码生成新的图像:7、查看流程图:对应代码如下:8、配置输入和输出,运行应用:9、我们可以在Chrome浏览器chrome://tracing/中加载性能统计文件:通过分析耗时最久的是推理功能单元,720p视频检测帧率在6fps左右。小结:本文总体而言并没有太多的创新点,是一个纯工程化的项目,主要工作是将学术界的优秀论文落地到边缘设备上,通过对网络的魔改,得到一个兼顾精度、速度和体积的目标检测和分割模型,在模型量化过程中会出现精度损失,后续会通过优化算法以及选择不同的量化算法kl_divergence(feature分布不均匀时可以得到较好的改善效果)继续提高模型的检测效果,复现本案例所需资源(代码、模型、测试数据等)均可从object_detection_seg.zip获取。
  • [技术干货] 自动驾驶 - 轻量级目标检测与分割算法
    算法实现像素级的图像分割不仅需要精确,有时还需要高效以便应用到real-time application比如自动驾驶汽车等。现有的方法可能精度较高但往往参数量巨大,为了解决这个问题,我们使用LinkNet作为主干网络[Fig. 1],中间层[Fig. 2]使用LeakyRelu进行激活,最后一层使用Sigmoid做归一化,并在Encoder Block 4后增添目标检测分支,训练过程中进行梯度裁剪防止梯度爆炸。详情可以运行我发布的Notebook,并下载转换好的模型文件:ONNXRuntime推理:下载yolo_tf_seg.zip并解压到本地,之后安装opencv、numpy、onnxruntime即可一键运行。
  • [技术干货] 实验项目分享——ModelArts实现智能花卉识别
    简介实验项目ModelArts实现智能花卉识别的技术栈为ModelArts+OBS+IAM+ResNet_v1_50实验流程准备数据1.1.创建对象存储OBS进入华为云控制台,将光标移动至左边栏,弹出菜单中选择“服务列表”->“存储”->“对象存储服务OBS”,点击“创建桶”按钮进入创建界面。开始创建。配置参数如下:① 复制桶配置:不选② 区域:华北-北京四③ 桶名称:自定义,将在后续步骤使用④ 数据冗余存储策略:单AZ存储⑤ 默认存储类别:标准存储⑥ 桶策略:私有⑦ 默认加密:关闭⑧ 归档数据直读:关闭单击“立即创建”>“确定”,完成桶创建。点击创建的“桶名称”->“对象”->“新建文件夹”,创建一个文件夹,用于存放后续数据集进入此文件夹,新建两个文件夹,名称自定义,用于存放数据集的输入及输出。如下图所示:1.2.下载数据集在右侧浏览器新建一个标签栏,复制URL:cid:link_0进入AI gallery数据集——四类花卉图像分类小数据集页面,点击右侧下载按钮,下载训练所需的数据集。点击确认,进入下载详情页面,按以下参数填写:下载方式:ModelArts数据集目标区域:华北-北京四数据类型:图片数据集输出位置:选择上步中创建的数据集输出obs存储路径数据集输入位置:选择上步中创建的数据集输入obs存储路径名称:dataset点击“确认”,跳转至我的下载页面,可以查看数据集下载详情,等待数据集下载完成,如下图所示:训练模型接下来将使用训练集对预置的ResNet_v1_50模型进行重训练获取新的模型。回到ModelArts界面,进入左侧导航栏的【AI Gallery】在【AI Gallery】页面点击顶部【算法】进入算法页面,选择算法【图像分类-ResNet_v1_50】(也可在谷歌浏览器新建1个新页签,输入下方链接进入页面点击“前往控制台”,选择“华北-北京四”区域,返回ModelArts-算法管理页面,在我的订阅列表即可看到已订阅的算法。点击下拉按钮,选择最新版本,点击右侧创建训练作业。进入训练作业页面,填写参数如下:① 名称:自定义,如job-flowers② 描述:可不填③ 创建方式:默认选择上步已订阅算法最新版本④ 训练输入:点击右侧数据集,选择已创建的数据集dataset-flowers,点击下拉按钮,勾选版本,点击确认。⑤ 训练输出:点击右侧数据存储位置,在1.1中创建的obs桶中创建一个文件夹,用于存储训练输出,建议选一个空目录。⑥ 超参:默认⑦ 资源池:公共资源池⑧ 资源类型:GPU⑨ 规格:GPU:1*NVIDIA-V100(32GB) | CPU:8核64GB;  ⑩ 计算节点个数:1;其他参数默认,点击“提交”,参数确认无误后,单击“确认”,完成训练作业创建。系统自动返回ModelArts-训练作业列表,在“训练作业”列表中,单击作业名称,进入训练作业详情页。在训练作业详情页的左侧,可以查看此次训练作业的基本信息和算法配置的相关信息。在训练作业详情页的右侧,可以查看此次训练作业的系统日志,训练日志窗口提供日志预览、日志下载、日志中搜索关键字能力;以及资源的占用情况。部署模型模型训练完成后,可以创建预测作业,将模型部署为在线预测服务。操作步骤如下:3.1.创建AI应用点击右上角“创建AI应用”,进入创建AI应用页面填写参数如下:名称:model-flowers版本:默认;原模型来源:【从训练中选择】,然后选择步骤2中训练完成的模型;部署类型:在线服务;其他参数默认即可,参数确认无误后,单击“立即创建”,完成模型创建。返回AI应用列表,当AI应用状态为“正常”时,表示创建成功。说明:导入模型约需【3分钟】3.2.部署在线服务点击已创建AI应用名称前的下拉箭头,点击操作列中【部署】,选择部署菜单栏中的【在线服务】。或点击模型名称进入模型详情页,点击详情页右上角的【部署】,在部署菜单中选择【在线服务】。填写参数如下:① 名称:service-flowers② 是否自动停止:默认关闭③ 描述:自定义⑤ 资源池:公共资源池⑥ 选择AI应用及配置:⑦ AI应用来源:我的AI应用⑧ 选择AI应用及版本:默认已选择所创建的模型名称及版本⑨ 计算节点规格:CPU:2核8GB其他配置默认即可。参数设置完成后,单击“下一步”,根据界面提示,点击“提交”,完成在线服务的部署。您可以进入“在线服务列表”页面,等待服务部署结束,当服务状态变为运行中时,表示服务部署成功。说明:部署模型为导入的模型。部署创建完成后,返回列表需要等待部署成功【约等待2分钟】,部署服务状态显示“运行中”,即可进行下一步操作。发起预测请求下载测试图片:https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com:443/20221121/flower.png点击刚刚部署上线(已完成部署)的在线服务名称,进入服务详情,点击“预测”标签,在此可进行在线预测,如下图所示。操作:点击左侧“上传”按钮,选择选择已下载的预测图片文件,点击“预测”完成操作。预测结果如下,识别出了蒲公英。PS:统一身份认证(Identity and Access Management,简称IAM)是华为云提供权限管理的基础服务,可以帮助您安全地控制云服务和资源的访问权限。OBS是一项面向Internet访问的服务,提供了基于HTTP/HTTPS协议的Web服务接口,用户可以随时随地连接到Internet的电脑上,通过OBS管理控制台或各种OBS工具访问和管理存储在OBS中的数据。此外,OBS支持SDK和OBS API接口,可使用户方便管理自己存储在OBS上的数据,以及开发多种类型的上层业务应用。 ModelArts是一个一站式的开发平台,能够支撑开发者从数据到AI应用的全流程开发过程。包含数据处理、模型训练、模型管理、模型部署等操作,并且提供AI Gallery功能,能够在市场内与其他开发者分享模型。更多详细信息可以查看附上的开发文档
  • [云实验室] 基于华为云自动学习的垃圾分类图像识别系统
    一、简介本项目主要运用华为云 EI 的 ModelArts 的自动学习以及云对象存储的 OBS,实现简单的垃圾分类系统。二、内容描述本垃圾分类图像识别系统主要通过创建图像分类自动学习项目,进行数据标注,进行自动训练和部署测试,再到最后的结束测试。 三、主要流程四、图像分类任务介绍ModelArts 服务之自动学习图像分类项目,是对图像进行检测分类。添加图片并对图像进行分类标注,每个分类识别一种类型的图像。完成图片标注后开始自动训练,即可快速生成图像分类模型。可应用于商品的自动识别、运输车辆种类识别和残次品的自动检测。例如质量检查的场景,则可以上传产品图片,将图片标注“合格”、“不合格”,通过训练部署模型,实现产品的质检。五、系统创建1、创建项目2、添加图片3、数据标注进行“一次性快餐盒-其他垃圾” 的数据标注。 先将左下角的数字选择为 45, 点击图片选择同类的图片(一次可以选择一张或者多张),在标签名栏填写当前选择图片的标签(已有的标签可以直接选择) , 输入标签名, 点击确定。4、自动训练5、部署测试预测结果:
  • [优秀实践] 华为MindSpore开源创新实践课 - 关卡四:移花接木
    1. 相关理论本节梳理迁移学习理论、ResNet其他系列网络结构和差异等、提升网络性能的方法、具体实现思路和策略等相关内容。迁移学习(Transfer Learning)是一种深度学习方法,其基本原理是通过将已经学习到的知识从源任务迁移到目标任务上,以加速目标任务的学习过程并提高其性能。迁移学习的核心思想是认为不同任务之间存在一定的相关性,因此可以通过共享和转移知识来提高目标任务的学习效果。迁移学习之所以能够应用广泛,有以下几个原因:数据稀缺性:在某些领域,获取大规模标注数据可能是困难或昂贵的。迁移学习可以利用源任务上的大规模数据进行预训练,并将学到的知识迁移到目标任务上,从而减少对目标任务数据的需求。知识共享:源任务上学习到的知识可以包含有用的特征、模式和规律,这些知识可以在目标任务中共享和重用。通过迁移学习,目标任务可以从源任务中受益,获得更好的初始化参数或更鲁棒的特征表示。领域适应:源任务和目标任务可能存在不同的数据分布或特征空间。迁移学习可以通过适应目标任务的特点,调整模型参数或特征表示,从而提高模型在目标任务上的泛化性能。任务相关性:源任务和目标任务之间可能存在一定的相关性,例如它们可能涉及相似的概念或共享一些底层结构。通过迁移学习,可以利用这种相关性,将源任务上学到的知识迁移到目标任务上,提供更好的初始状态或引导目标任务的学习过程。迁移学习的起源可以追溯到生物学中的迁移现象。人类和其他动物在学习新任务时往往能够利用之前学到的知识和经验,这种能力在深度学习中也被借鉴并加以应用。迁移学习的应用非常广泛,以下是一些常见的应用领域:图像分类:在计算机视觉领域,通过在大规模图像数据集上进行预训练,如ImageNet数据集,可以学习到丰富的图像特征。这些预训练的模型可以通过迁移学习用于其他图像分类任务,避免从头开始训练,提高模型的性能。自然语言处理:在自然语言处理任务中,例如文本分类、命名实体识别和情感分析等,可以使用预训练的语言模型(如BERT、GPT等)进行迁移学习。这些预训练模型已经在大规模文本数据上进行了训练,可以提供丰富的语义表示和语言理解能力,有助于加速其他相关任务的学习。目标检测和物体识别:在计算机视觉领域,通过在大规模目标检测或物体识别数据集上进行预训练,可以学习到通用的目标检测或物体识别能力。这些预训练模型可以通过迁移学习用于其他具体的目标检测或物体识别任务,从而减少样本标注的需求,提高模型的性能。机器人学习:在机器人学习中,迁移学习可以帮助机器人从先前的任务和环境中获取知识,并将其应用于新任务中。例如,一个机器人在一个模拟环境中学习如何抓取物体,然后将这些知识迁移到真实环境中进行抓取任务。ResNet(Residual Network)是一种深度卷积神经网络架构,提出了残差学习的概念,以解决深层网络训练中的梯度消失和模型退化问题。除了经典的ResNet网络,还有一些其他系列的网络结构,包括ResNetv2、ResNeXt、Wide ResNet等,它们在ResNet的基础上进行了改进和扩展。下面是这些系列网络结构的简要介绍和差异:ResNetv2:ResNetv2是对经典ResNet的改进,主要包括两个方面的修改。首先是去除了原始ResNet中的池化操作,使用步长为2的卷积层来降低特征图的尺寸。其次是引入了批量归一化(Batch Normalization)操作,使得网络更易于训练。ResNetv2相对于原始ResNet具有更好的训练性能和更高的准确率。其核心公式如下:xl=xl+1+F(xl,wl)ResNeXt:ResNeXt在ResNet的基础上引入了一种新的模块结构,称为“Cardinality”。Cardinality是指在一个模块中并行使用多个分支,每个分支具有相同的结构,以增加网络的表示能力。通过增加Cardinality的数量,ResNeXt能够在不增加网络深度和复杂度的情况下提高模型性能。该网络提供了一种新的聚合方式:Wide ResNet:Wide ResNet通过增加网络的宽度(即每个层的通道数)来增加网络的容量。相比于经典的ResNet,Wide ResNet具有更宽的层,这使得网络能够捕获更多的特征信息。通过增加网络的宽度,Wide ResNet可以在一定程度上提高模型的准确率,但也会增加模型的计算和内存开销。下面是拓宽的ResNet图:这些ResNet的变体在保留ResNet的核心思想的基础上,通过改变网络的结构、引入新的模块或增加网络的容量,进一步提高了模型的性能和表示能力。根据具体的任务和需求,选择适合的ResNet系列网络可以帮助提高模型的训练效果。笔者对实验中提高模型精度的方法也进行了总结与尝试具体的改进点为:卷积核的大小改为3X3,通道数改为2的幂次并依此升高增大全连接层的神经元个数使用Batch Normalization(BN)尝试使用Dropout提高训练epoch数量尝试使用新的结构,如ResBlock下面将对上述的各个部分进行理论疏导。第一点,卷积核与通道数。卷积核的大小 卷积核的大小决定了网络在输入数据上进行卷积操作时所关注的局部区域的大小。较小的卷积核可以捕捉到更细节的特征,而较大的卷积核可以覆盖更广阔的区域。通常情况下,常见的卷积核大小为3x3、5x5或7x7。选择卷积核的大小可以根据任务需求和输入数据的特点来决定。对于较小的图像或特征细节较重要的任务,可以选择较小的卷积核;而对于较大的图像或更全局的特征,可以考虑使用较大的卷积核。本实验所用到的cifar10的图像分辨率很小,明显采用3x3的卷积核会更加合适。通道数 通道数指的是卷积核或输入数据在深度维度上的维数。在卷积神经网络中,通道数的确定涉及到输入数据的特征维度和网络层之间的信息传递。通常情况下,初始的输入数据具有多个通道,例如RGB图像具有3个通道。在网络的深度方向,随着网络层的堆叠,通道数也会相应地增加或减少。通过增加通道数,网络可以提取更多丰富的特征表示,有助于提高模型的表达能力和性能。通道数的选择需要考虑输入数据的特征维度和网络的复杂性,可以根据实际问题进行调整和优化。第二点,全连接层神经元个数 提高模型的表达能力 增大全连接层的神经元个数可以增加模型的参数数量,从而提高模型的表达能力。更多的神经元可以学习更复杂的特征表示和模式,使得模型更能适应复杂的任务和数据。增强模型的学习能力 更多的神经元提供了更大的学习空间,可以更好地拟合训练数据。这有助于减少欠拟合的情况,提高模型的学习能力和性能。改善特征的抽象和泛化能力:全连接层可以将前面卷积层或其他特征提取层输出的特征进行组合和抽象,得到更高级别的特征表示。增大全连接层的神经元个数可以增加特征组合的可能性,从而提高特征的抽象和泛化能力。缓解信息瓶颈 在网络的前向传播过程中,信息可能会逐渐减少。通过增大全连接层的神经元个数,可以提供更多的连接和参数,减轻信息瓶颈,使得信息能够更好地在网络中传递和流动。需要注意的是,增大全连接层的神经元个数也会增加模型的复杂性和计算量,可能会导致过拟合和训练时间的增加。因此,在设计网络时需要综合考虑模型的容量和计算资源的限制,进行适当的调整和平衡。合理选择全连接层的神经元个数可以根据具体问题、数据集和实验结果进行调优和验证。第三点,Batch Normalization(BN)Batch Normalization (BN) 是一种常用的神经网络层,用于在深度学习模型中对输入数据进行归一化处理。它的主要目的是加速神经网络的训练过程,并改善模型的收敛性和泛化能力。BN 的原理是对每个特征的输入进行归一化,使其均值接近于0,方差接近于1。这样可以使得输入数据分布更稳定,减少了网络层之间的协变量偏移(covariate shift),有助于提高训练效果。具体来说,BN 在每个小批量数据上计算均值和方差,并将其应用于归一化公式,将输入数据转换为均值为0、方差为1的标准正态分布。BN 的优点包括:加速训练收敛:通过减少内部协变量偏移,BN 可以使每层的激活函数保持在较小的范围内,有助于加速模型的收敛过程。改善模型泛化能力:BN 可以提高模型的泛化能力,减少过拟合的风险。减少对参数初始化的敏感性:BN 对输入数据进行标准化,可以减少对参数初始化的依赖,使得模型更加鲁棒。允许使用较大的学习率:通过减少梯度消失和爆炸问题,BN 可以使用较大的学习率,加快训练速度。需要注意的是,在使用 BN 时,需要注意以下几点:BN 在训练和推断阶段的计算方式不同,需要特别注意推断阶段的处理方式。BN 可能会增加计算开销,特别是在具有大量参数的网络中。BN 的引入可能会改变模型的学习动态,因此需要适当调整学习率和正则化策略。总之,Batch Normalization 是一种常用的技术,用于提高深度神经网络的训练效果和泛化能力,加速模型的收敛过程,并减少对参数初始化的敏感性。第四点,DropoutDropout 是一种常用的正则化技术,用于减少深度神经网络中的过拟合问题。在训练过程中,Dropout 随机地将一部分神经元的输出置为0,即在每个训练批次中丢弃(dropout)一些神经元,以一定的概率将其输出值设置为0。这样可以防止网络过度依赖特定的神经元,从而提高模型的泛化能力。Dropout 的原理是通过在每个训练批次中随机丢弃一些神经元的输出,从而减少神经元之间的协同作用,促使网络的每个神经元都能够独立地学习有用的特征。这种随机丢弃神经元的过程类似于集成学习中的 bagging 方法,通过将多个模型的预测结果进行平均或投票来减少过拟合。使用 Dropout 的主要优点包括:减少过拟合:通过随机丢弃神经元的输出,Dropout 可以减少网络对特定神经元的依赖,从而减少过拟合的风险。提高泛化能力:Dropout 强制网络学习多个独立的特征子集,促使网络对于输入的微小变化具有鲁棒性,从而提高模型的泛化能力。防止协同作用:Dropout 可以减少神经元之间的协同作用,使得网络的每个神经元都能够独立地学习有用的特征。增加网络容量:通过随机丢弃部分神经元的输出,Dropout 可以增加网络的容量,从而提高网络的表达能力。需要注意的是,在使用 Dropout 时,需要适当调整网络的结构和超参数,以平衡减少过拟合和保持模型性能之间的关系。此外,Dropout 通常在训练阶段使用,在推断阶段不需要应用 Dropout。总之,Dropout 是一种常用的正则化技术,通过随机丢弃神经元的输出来减少过拟合,提高模型的泛化能力和鲁棒性。第五点,提高训练epoch数量提高训练 epoch 数量是指增加模型在训练数据上迭代的次数。每个 epoch 表示将整个训练数据集通过模型进行一次正向传播和反向传播的过程。增加训练 epoch 数量可以对模型进行更多次的参数更新和优化,有助于提升模型的性能和收敛到更优的解。增加训练 epoch 数量的主要优点包括:改善模型性能:更多的训练 epoch 可以让模型更充分地学习训练数据中的特征和模式,从而提升模型的性能。减少欠拟合:在训练过程中,模型需要逐渐调整参数以适应数据的特征。如果训练 epoch 数量较少,模型可能无法充分学习数据的复杂性,导致欠拟合。增加训练 epoch 数量可以缓解欠拟合问题。提高模型泛化能力:通过增加训练 epoch 数量,模型可以更好地学习数据中的通用特征,从而提高其泛化能力,使其在未见过的数据上表现更好。然而,需要注意以下几点:过多的训练 epoch 数量可能导致过拟合:如果训练 epoch 数量过大,模型可能过度拟合训练数据,对于未见过的数据表现较差。因此,需要根据模型的训练曲线和验证集表现来确定合适的训练 epoch 数量。训练时间和计算资源的考虑:增加训练 epoch 数量会增加训练的时间和计算资源消耗。在实际应用中,需要根据时间和资源的限制来选择合适的训练 epoch 数量。综上所述,增加训练 epoch 数量可以改善模型性能、减少欠拟合并提高模型的泛化能力,但需要注意过拟合和训练时间与资源的平衡。适当调整训练 epoch 数量可以在训练过程中获得更好的模型性能。窗体顶端第六点,ResBlockResBlock(残差块)是指在深度残差网络(ResNet)中使用的基本构建块。它的设计目的是解决深层神经网络中的梯度消失和梯度爆炸问题,同时提高网络的训练和性能。其中,Input 是输入数据,Output 是残差块的输出,Convolution 是卷积操作,Activation 是激活函数,箭头表示数据流动的方向。ResBlock 的关键在于引入了跳跃连接(skip connection)或者称为残差连接(residual connection)。跳跃连接允许输入数据直接绕过一层或多层的卷积操作,将输入数据与输出数据相加,从而保留了输入数据的信息。这种设计可以使得网络在训练过程中更容易优化,减轻了梯度消失和梯度爆炸的问题。ResBlock 的优点包括:提高信息流动:跳跃连接允许信息直接传递,避免了信息在多层网络中的衰减,有助于信息在网络中更快地传播,促进了特征的学习和传递。加速训练收敛:由于跳跃连接的存在,残差块可以更容易地学习恒等映射,即将输入数据作为输出,从而更容易优化模型。这加速了网络的训练收敛。提高网络性能:通过使用残差块,深层网络可以更轻松地优化,更好地捕捉数据中的复杂特征,从而提高网络的性能和泛化能力。在实践中,ResBlock 可以通过堆叠多个残差块来构建深度残差网络。这种网络结构已被广泛应用于图像分类、目标检测和语义分割等任务中,并取得了很好的效果。总结起来,ResBlock 是深度残差网络中的基本构建块,通过引入跳跃连接来解决梯度消失和梯度爆炸问题,提高信息流动和网络的优化能力,从而提高网络性能和泛化能力。2. 代码及其分析        关卡4实验中,只要完成两个步骤,其一是对一个具有9个类别的毒蘑菇数据集进行分类,采用ResNet50模型,保存其backbone部分模型权重,迁移到另一个2分类的毒蘑菇数据集中,因此本实验的核心代码在于超参数的设计、迁移代码的撰写、以及网络结构的实现。        首先是对9分类的毒蘑菇数据集进行分类,在本实验中,笔者对超参数进行组合设计,探究适宜模型训练的超参数组合,使得模型精度略微提高了3个半分点,其超参数设计如下:config = ed({    # 训练参数    'batch_size': 128,    'epochs': 300,        #网络参数    'class_num': 9,    # 动态学习率调节    'warmup_epochs': 10,    'lr_init': 0.01,    'lr_max': 0.1,    # 优化器参数    'momentum': 0.75,    'weight_decay': e-4}) 在网络结构方面,仍沿用ResNet50的backbone和head结构,不同的是,笔者经过尝试,改变了网络结构的部分超参数,提高了网络模型的拟合能力,使其在这个任务上的表现更加提高,提高了两个百分点,最高可以达到94%。其代码如下:class ResNet50(nn.Cell):    """        ResNet_backbone         (ResidualBlock,         [3, 4, 6, 3],         [64, 256, 512, 1024],         [256, 512, 1024, 2048],         [1, 2, 2, 2])        ResNet_head         (ResidualBlock,        [3, 8, 8, 3],        [64, 256, 512, 1024],        [256, 512, 1024, 2048],        [1, 2, 2, 2],         9)    """    def __init__(self, backbone, head):        super(ResNet50, self).__init__()        self.backbone = backbone        self.head = head    def construct(self, x):        x = self.backbone(x)        x = self.head(x)        return x 在进行2分类毒蘑菇分类的迁移学习时,网络结构没有变化,只是在网络的输出端的类别改为了2,其超参数配置如下:config = ed({    # 训练参数    'batch_size': 128,    'epochs': 300,        #网络参数    'class_num': 9,    # 动态学习率调节    'warmup_epochs': 10,    'lr_init': 0.01,    'lr_max': 0.1,    # 优化器参数    'momentum': 0.75,    'weight_decay': e-4}) 在进行迁移时,最为关键的就是以预训练的模型参数作为待训练模型的初始化参数,也就是说需要在训练之前将已经训练好的模型参数加载进入新的模型,由于两个任务的分类类别不同,因此只能载入模型前面的backbone部分,代码如下:# 网络backbone_net = resnet50_backbone() # backbone网络ms.load_checkpoint('best_param_backbone.ckpt',backbone_net)3. 存在的问题及其解决方法        本实验存在出多问题,下面对此进行一一列举。问题一描述:本实验最初无法直接运行华为官方提供的代码,并且报错提示极其隐晦,一直称Loss无效,或者在正常训练1到2个epoch后训练终止,训练得到的acc为固定的0.5。解决:经过多方查找后,发现在数据集文件中多了一个.checkpoint文件,这个文件是由于之前的代码运行过程中无法正常运行后而生成的回滚文件,使得超参数中设计的类别和实际的数据集文件个数不匹配导致的,手动删除该文件后,该报错解除。问题二描述:本实验的9分类的代码无法应用于2分类的数据集上,且报错信息十分隐晦,不能给予方向上的引导。解决:经过多次查看后发现,数据集的类别指定方式不仅仅是通过最初的超参数设计,后续过程中也有对类别数量的指定,正式因为类别不匹配而导致的报错显示。问题三        描述:在进行迁移学习时,训练2分类的网络载入9分类数据集的网络参数时失败。解决:经观察与分析,某个网络仅能载入固定网络架构的模型参数,而两个数据集对应的网络结构并不完全相同,因此无法直接载入预训练模型。而两个网络的backbone部分完全相同,因此可以载入这部分的网络参数,这也是迁移学习的核心思路,即载入网络结构前面提取特征的部分结构参数,再对网络的输出部分进行微调,从而达到一个更好的效果。问题四描述:模型代码没有问题但是服务器上无法运行,出现loss损失爆炸的情况。解决:Mindspore框架适配硬件的时间比较长,在进行运行模型的时候,每一步尽量不要出现红色的警告通知,有可能红色的警告通知就是硬件层面出现了未知的问题,但是这个问题还不至于报错。当运行训练的语句的时候,第一轮的等待时间比较长,可以在命令台通过top命令查看系统使用资源的情况,如果出现了很多个python类型的进程占用了资源的大部分而非一个python类型进程占用所有的资源,那模型大概率就可以进行正常运行。        想法与建议:本实验的安排,使参与者深入理解与事件如何进行迁移学习。值得一提的是,需要更加完善MindSpore的异常处理机制。MindSpore的底层实现中,其异常处理很不完善,往往一个很容易解决的错误,提供的报错让人感觉八竿子打不着,大大浪费了时间,同时给人的体验很差,这是一个急需改进的地方。其次,在本实验中,网络模型定义部分封装得过于精细,使得实验人员想要了解采用的网络结构的全貌需要递归地看很多个类,使得实验人员难以直接对模型进行修改,这其实是深度学习实验的一个大忌,因为网络的结构很大程度上就决定了网络的性能好坏,因此,设置简单而又可以轻易修改的实验设置,有助于帮助实验人员探究更适合该数据集的网络结构,进一步学习。
总条数:44 到第
上滑加载中