[{"data":1,"prerenderedAt":283},["ShallowReactive",2],{"content-query-IURKvpKPiU":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"cover":11,"type":12,"category":13,"body":14,"_type":277,"_id":278,"_source":279,"_file":280,"_stem":281,"_extension":282},"/technology-blogs/zh/1828","zh",false,"","【MindSpore易点通】网络构建总结上篇","使用低阶API模式训练，用户可以自己控制哪些数据输入网络。","2022-09-09","https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2022/09/26/8e265b1c8d224d46ba3c9e6a5c13b848.png","technology-blogs","基础知识",{"type":15,"children":16,"toc":264},"root",[17,25,36,42,46,56,61,74,82,94,102,114,126,134,146,153,165,177,191,202,219,230,245],{"type":18,"tag":19,"props":20,"children":22},"element","h1",{"id":21},"mindspore易点通网络构建总结上篇",[23],{"type":24,"value":8},"text",{"type":18,"tag":26,"props":27,"children":29},"h2",{"id":28},"低阶api改下沉时dataset输出应和network输入匹配",[30],{"type":18,"tag":31,"props":32,"children":33},"strong",{},[34],{"type":24,"value":35},"低阶API改下沉时dataset输出应和network输入匹配",{"type":18,"tag":37,"props":38,"children":39},"p",{},[40],{"type":24,"value":41},"低阶API模式训练，即使用for循环进行训练与验证。由于低阶API不支持数据下沉训练，因此需将低阶API改成高阶API，即可使用数据下沉模式进行训练，以提升性能。(本例中，性能对比：低阶API模式:770imgs/sec ；低阶API改下沉模式：840imgs/sec)",{"type":18,"tag":37,"props":43,"children":44},{},[45],{"type":24,"value":9},{"type":18,"tag":47,"props":48,"children":50},"pre",{"code":49},"for epoch in range(epoch_max):\n\n        print(\"\\nEpoch:\", epoch+1, \"/\", epoch_max)\n\n        t_start = time.time()\n\n        train_loss = 0\n\n        train_correct = 0\n\n        train_total = 0\n\n        for _, (data, gt_classes, _) in enumerate(ds_train):\n\n            model.set_train()\n\n            # 向网络中传入图片数据和标签\n\n            loss, output = model(data, gt_classes)\n\n            train_loss += loss\n\n            correct = correct_num(output, gt_classes)\n\n            correct = correct.asnumpy()\n\n            train_correct += correct.sum()\n\n            cb_params.cur_step_num += 1\n\n            ckpoint_cb.step_end(run_context)\n\n",[51],{"type":18,"tag":52,"props":53,"children":54},"code",{"__ignoreMap":7},[55],{"type":24,"value":49},{"type":18,"tag":37,"props":57,"children":58},{},[59],{"type":24,"value":60},"低阶API模式改下沉后，则会将整个dataset输入网络，不能控制哪些数据输入网络，则需将dataset输出和network输入匹配。若不匹配则会报错。",{"type":18,"tag":62,"props":63,"children":65},"h3",{"id":64},"错误情形1dataset输出多于network输入",[66],{"type":18,"tag":31,"props":67,"children":68},{},[69],{"type":18,"tag":31,"props":70,"children":71},{},[72],{"type":24,"value":73},"错误情形1：dataset输出多于network输入",{"type":18,"tag":37,"props":75,"children":76},{},[77],{"type":18,"tag":31,"props":78,"children":79},{},[80],{"type":24,"value":81},"dataset输出为：input_data、label和flag。而网络中需输入input_data和label。",{"type":18,"tag":37,"props":83,"children":84},{},[85],{"type":18,"tag":31,"props":86,"children":87},{},[88],{"type":18,"tag":52,"props":89,"children":91},{"className":90},[],[92],{"type":24,"value":93},"class Dataset:      def __init__(self, image_list, label_list):          super(Dataset, self).__init__()          self.imgs = image_list          self.labels = label_list        def __getitem__(self, index):          img = Image.open(self.imgs[index]).convert('RGB')          flag = self.labels[index]          return img, self.labels[index], flag            def __len__(self):          return len(self.imgs)                    def create_dataset(data_path, do_train, batch_size, repeat_num=1):       dataset = Dataset(save_image_list, save_label_list)        sampler = MySampler(dataset)        print(\"sample\")      cifar_ds = ds.GeneratorDataset(dataset,              column_names=[\"image\", \"label\", \"flag\"], sampler=sampler, shuffle=True)       steps_per_epoch = cifar_ds.get_dataset_size()      cifar_ds = cifar_ds.repeat(repeat_num)              return cifar_ds, steps_per_epoch   ds_train, steps_per_epoch_train = create_dataset(data_path, do_train=True,                  batch_size=train_batch_size, repeat_num=1)   model.train(epoch_max, ds_train,              callbacks=[ckpoint_cb, LossMonitor(), fps],              dataset_sink_mode=sink_mode, sink_size=steps_per_epoch_train)",{"type":18,"tag":37,"props":95,"children":96},{},[97],{"type":18,"tag":31,"props":98,"children":99},{},[100],{"type":24,"value":101},"将会出现如下报错：",{"type":18,"tag":37,"props":103,"children":104},{},[105],{"type":18,"tag":31,"props":106,"children":107},{},[108],{"type":18,"tag":52,"props":109,"children":111},{"className":110},[],[112],{"type":24,"value":113},"[ERROR] ANALYZER(26833,python):2021-07-15-07:03:21.469.703 [mindspore/ccsrc/pipeline/jit/static_analysis/evaluator.cc:74] Eval] Function construct, The number of parameters of this function is 2, but the number of provided arguments is 3. NodeInfo: In file MindSpore_1P_definedata_high.py(35)      def construct(self, input_data, label):      ^    Traceback (most recent call last):    File \"MindSpore_1P_definedata_high.py\", line 344, in       VAL_BATCH_SIZE, REPEAT_SIZE, dataset_sink_mode)    File \"MindSpore_1P_definedata_high.py\", line 279, in train_net      dataset_sink_mode=sink_mode, sink_size=steps_per_epoch_train)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/model.py\", line 627, in train      sink_size=sink_size)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/model.py\", line 413, in _train      self._train_dataset_sink_process(epoch, train_dataset, list_callback, cb_params, sink_size)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/model.py\", line 475, in _train_dataset_sink_process      outputs = self._train_network(*inputs)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/nn/cell.py\", line 341, in __call__      out = self.compile_and_run(*inputs)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/nn/cell.py\", line 608, in compile_and_run      self.compile(*inputs)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/nn/cell.py\", line 595, in compile      _executor.compile(self, *inputs, phase=self.phase, auto_parallel_mode=self._auto_parallel_mode)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/common/api.py\", line 494, in compile      result = self._executor.compile(obj, args_list, phase, use_vm)  TypeError: mindspore/ccsrc/pipeline/jit/static_analysis/evaluator.cc:74 Eval] Function construct, The number of parameters of this function is 2, but the number of provided arguments is 3. NodeInfo: In file MindSpore_1P_definedata_high.py(35)      def construct(self, input_data, label):      ^    The function call stack (See file 'analyze_fail.dat' for details):# 0 In file /home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/dataset_helper.py(75)          return self.network(*outputs)                 ^# 1 In file MindSpore_1P_definedata_high.py(56)          loss = self.network(*inputs)",{"type":18,"tag":62,"props":115,"children":117},{"id":116},"错误情形2dataset输出少于network输入",[118],{"type":18,"tag":31,"props":119,"children":120},{},[121],{"type":18,"tag":31,"props":122,"children":123},{},[124],{"type":24,"value":125},"错误情形2：dataset输出少于network输入",{"type":18,"tag":37,"props":127,"children":128},{},[129],{"type":18,"tag":31,"props":130,"children":131},{},[132],{"type":24,"value":133},"dataset输出为：input_data。而网络中需输入input_data和label。",{"type":18,"tag":37,"props":135,"children":136},{},[137],{"type":18,"tag":31,"props":138,"children":139},{},[140],{"type":18,"tag":52,"props":141,"children":143},{"className":142},[],[144],{"type":24,"value":145},"class Dataset:      def __init__(self, image_list, label_list):          super(Dataset, self).__init__()          self.imgs = image_list          self.labels = label_list        def __getitem__(self, index):          img = Image.open(self.imgs[index]).convert('RGB')          return img            def __len__(self):          return len(self.imgs)                    def create_dataset(data_path, do_train, batch_size, repeat_num=1):      dataset = Dataset(save_image_list, save_label_list)        sampler = MySampler(dataset)        print(\"sample\")      cifar_ds = ds.GeneratorDataset(dataset,              column_names=[\"image\"], sampler=sampler, shuffle=True)       steps_per_epoch = cifar_ds.get_dataset_size()      cifar_ds = cifar_ds.repeat(repeat_num)              return cifar_ds, steps_per_epoch   ds_train, steps_per_epoch_train = create_dataset(data_path, do_train=True,                  batch_size=train_batch_size, repeat_num=1)   model.train(epoch_max, ds_train,              callbacks=[ckpoint_cb, LossMonitor(), fps],              dataset_sink_mode=sink_mode, sink_size=steps_per_epoch_train)",{"type":18,"tag":37,"props":147,"children":148},{},[149],{"type":18,"tag":31,"props":150,"children":151},{},[152],{"type":24,"value":101},{"type":18,"tag":37,"props":154,"children":155},{},[156],{"type":18,"tag":31,"props":157,"children":158},{},[159],{"type":18,"tag":52,"props":160,"children":162},{"className":161},[],[163],{"type":24,"value":164},"Traceback (most recent call last):    File \"MindSpore_1P_definedata_high.py\", line 344, in       VAL_BATCH_SIZE, REPEAT_SIZE, dataset_sink_mode)    File \"MindSpore_1P_definedata_high.py\", line 279, in train_net      dataset_sink_mode=sink_mode, sink_size=steps_per_epoch_train)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/model.py\", line 627, in train      sink_size=sink_size)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/model.py\", line 413, in _train      self._train_dataset_sink_process(epoch, train_dataset, list_callback, cb_params, sink_size)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/model.py\", line 466, in _train_dataset_sink_process      dataset_helper=dataset_helper)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/model.py\", line 292, in _exec_preprocess      dataset_helper = DatasetHelper(dataset, dataset_sink_mode, sink_size, epoch_num)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/dataset_helper.py\", line 218, in __init__      self.iter = iterclass(dataset, sink_size, epoch_num)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/dataset_helper.py\", line 360, in __init__      super().__init__(dataset, sink_size, epoch_num)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/dataset_helper.py\", line 268, in __init__      create_data_info_queue=create_data_info_queue)    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/train/_utils.py\", line 59, in _exec_datagraph      batch_size = exec_dataset.get_batch_size()    File \"/home/ma-user/miniconda3/envs/MindSpore-python3.7-aarch64/lib/python3.7/site-packages/mindspore/dataset/engine/datasets.py\", line 1567, in get_batch_size      self._batch_size = runtime_getter[0].GetBatchSize()  RuntimeError: Thread ID 281473819629872 Unexpected error. input column name: label doesn't exist in the dataset columns.  Line of code : 366  File         : /home/jenkins/agent-working-dir/workspace/Compile_Ascend_ARM_EulerOS/mindspore/mindspore/ccsrc/minddata/dataset/engine/datasetops/map_op/map_op.cc",{"type":18,"tag":26,"props":166,"children":168},{"id":167},"定义多loss输出的网络结构",[169],{"type":18,"tag":31,"props":170,"children":171},{},[172],{"type":18,"tag":31,"props":173,"children":174},{},[175],{"type":24,"value":176},"定义多Loss输出的网络结构",{"type":18,"tag":62,"props":178,"children":180},{"id":179},"背景信息",[181],{"type":18,"tag":31,"props":182,"children":183},{},[184],{"type":18,"tag":31,"props":185,"children":186},{},[187],{"type":18,"tag":31,"props":188,"children":189},{},[190],{"type":24,"value":179},{"type":18,"tag":37,"props":192,"children":193},{},[194],{"type":18,"tag":31,"props":195,"children":196},{},[197],{"type":18,"tag":31,"props":198,"children":199},{},[200],{"type":24,"value":201},"有的任务需要同时训练多个Loss，比如检测任务，这时需要同时输出多个Loss的值方便查看各个Loss的趋势。",{"type":18,"tag":62,"props":203,"children":205},{"id":204},"经验总结",[206],{"type":18,"tag":31,"props":207,"children":208},{},[209],{"type":18,"tag":31,"props":210,"children":211},{},[212],{"type":18,"tag":31,"props":213,"children":214},{},[215],{"type":18,"tag":31,"props":216,"children":217},{},[218],{"type":24,"value":204},{"type":18,"tag":37,"props":220,"children":221},{},[222],{"type":18,"tag":31,"props":223,"children":224},{},[225],{"type":18,"tag":31,"props":226,"children":227},{},[228],{"type":24,"value":229},"MindSpore默认只支持单Loss的输出，如果要同时输出多个Loss需要重写TrainOneStepCell函数（原本MindSpore的内置函数），主要重写部分为construct中关于梯度计算的部分。 具体代码如下所示：",{"type":18,"tag":37,"props":231,"children":232},{},[233],{"type":18,"tag":31,"props":234,"children":235},{},[236],{"type":18,"tag":31,"props":237,"children":238},{},[239],{"type":18,"tag":52,"props":240,"children":242},{"className":241},[],[243],{"type":24,"value":244},"class TrainOneStepCell(nn.Cell):      def __init__(self, network, optimizer, sens=1.0):          super(TrainOneStepCell, self).__init__(auto_prefix=False)          self.network = network          self.network.add_flags(defer_inline=True)          self.weights = ParameterTuple(network.trainable_params())          self.optimizer = optimizer          self.grad = C.GradOperation('grad', get_by_list=True, sens_param=True)          self.sens = sens          self.reducer_flag = False          self.grad_reducer = None          parallel_mode = _get_parallel_mode()          if parallel_mode in (ParallelMode.DATA_PARALLEL, ParallelMode.HYBRID_PARALLEL):              self.reducer_flag = True          if self.reducer_flag:              mean = _get_mirror_mean()              degree = _get_device_num()              self.grad_reducer = DistributedGradReducer(optimizer.parameters, mean, degree)        def construct(self, data, label):          weights = self.weights          loss1, loss2 = self.network(data, label)          sens1 = P.Fill()(P.DType()(loss1), P.Shape()(loss1), self.sens)          sens2 = P.Fill()(P.DType()(loss2), P.Shape()(loss2), self.sens)          sens = (sens1, sens2)          grads = self.grad(self.network, weights)(data, label, sens)          if self.reducer_flag:              # apply grad reducer on grads              grads = self.grad_reducer(grads)            return F.depend(loss1, self.optimizer(grads)), F.depend(loss2, self.optimizer(grads))",{"type":18,"tag":37,"props":246,"children":247},{},[248],{"type":18,"tag":31,"props":249,"children":250},{},[251],{"type":18,"tag":31,"props":252,"children":253},{},[254,256],{"type":24,"value":255},"详细代码请前往MindSpore论坛进行下载：",{"type":18,"tag":257,"props":258,"children":262},"a",{"href":259,"rel":260},"https://bbs.huaweicloud.com/forum/thread-0221980893779600015-1-1.html",[261],"nofollow",[263],{"type":24,"value":259},{"title":7,"searchDepth":265,"depth":265,"links":266},4,[267,273],{"id":28,"depth":268,"text":35,"children":269},2,[270,272],{"id":64,"depth":271,"text":73},3,{"id":116,"depth":271,"text":125},{"id":167,"depth":268,"text":176,"children":274},[275,276],{"id":179,"depth":271,"text":179},{"id":204,"depth":271,"text":204},"markdown","content:technology-blogs:zh:1828.md","content","technology-blogs/zh/1828.md","technology-blogs/zh/1828","md",1776506115997]