模型存储:
paddle.save(g_a.state_dict(), model_path+'gen_b2a.pdparams')
paddle.save(g_a_optimizer.state_dict(), model_path+'gen_b2a.pdopt')
模型读取:
ga_para_dict = paddle.load(model_path+'gen_b2a.pdparams')
ga_opt_dict = paddle.load(model_path+'gen_b2a.pdopt')
g_a.set_state_dict(ga_para_dict)
g_a_optimizer.set_state_dict(ga_opt_dict)
训练代码报错:
Start time : 2020-12-11 19:39:15 start step: 16
---------------------------------------------------------------------------AssertionError Traceback (most recent call last) in
165
166 # 继续训练
--> 167 train(PLACE, print_interval=1, max_step=5, load_model=True)
168 # train(PLACE, print_interval=500, max_step=8000, load_model=True)
in train(place, epoch_num, adv_weight, cycle_weight, identity_weight, load_model, model_path, model_path_bkp, print_interval, max_step, model_bkp_interval)
95 ga_loss = ga_gan_loss * adv_weight + ga_cyc_loss * cycle_weight + ga_ide_loss * identity_weight
96 ga_loss.backward()
---> 97 g_a_optimizer.step()
98 g_a_optimizer.clear_grad()
99
in step(self)
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/wrapped_decorator.py in __impl__(func, *args, **kwargs)
23 def __impl__(func, *args, **kwargs):
24 wrapped_func = decorator_func(func)
---> 25 return wrapped_func(*args, **kwargs)
26
27 return __impl__
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/framework.py in __impl__(*args, **kwargs)
222 assert in_dygraph_mode(
223 ), "We only support '%s()' in dynamic graph mode, please call 'paddle.disable_static()' to enter dynamic graph mode." % func.__name__
--> 224 return func(*args, **kwargs)
225
226 return __impl__
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/optimizer/adam.py in step(self)
290
291 optimize_ops = self._apply_optimize(
--> 292 loss=None, startup_program=None, params_grads=params_grads)
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/optimizer/optimizer.py in _apply_optimize(self, loss, startup_program, params_grads)
768 params_grads = append_regularization_ops(params_grads,
769 self.regularization)
--> 770 optimize_ops = self._create_optimization_pass(params_grads)
771 else:
772 program = loss.block.program
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/optimizer/optimizer.py in _create_optimization_pass(self, parameters_and_grads)
587 self._create_accumulators(
588 target_block,
--> 589 [p[0] for p in parameters_and_grads if p[0].trainable])
590 self._create_global_learning_rate()
591
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/optimizer/adam.py in _create_accumulators(self, block, parameters)
164 # Create accumulator tensors for first and second moments
165 for p in parameters:
--> 166 self._add_accumulator(self._moment1_acc_str, p)
167 self._add_accumulator(self._moment2_acc_str, p)
168 self._add_accumulator(
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/optimizer/optimizer.py in _add_accumulator(self, name, param, dtype, fill_value, shape, type, device)
505 if len(self._accumulators_holder) > 0:
506 assert var_name in self._accumulators_holder, \
--> 507 "Optimizer set error, {} should in state dict".format( var_name )
508 var.set_value(self._accumulators_holder[var_name])
509
AssertionError: Optimizer set error, conv2d_468.w_0_moment1_0 should in state dict
如果将设置优化器的代码:
g_a_optimizer.set_state_dict(ga_opt_dict)
去掉,就不抱错了
是我用的不对么?
这是带缩进格式的报错信息
遇到一样的问题,不知道你解决了没有,如果解决了,可以分享一下吗
后来我就没读这个,自己另存了一个,就好了
一般都是文件名、路径之类的原因
遇到存取问题可以查文档
https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/08_model_save_load_cn.html
我遇上的问题可能是模型结构做过改动导致的
保存的模型修改模型的结构了吗?
怀疑是因为修改了模型结构,是用adam吗?adam的当前状态是和上一步训练相关的,要记录当前的moment,ga_opt_dict里面没有新的conv2d的状态,所以报错。一般,fine-tune只保存g_a.state_dict()就可以了;当做checkpoint的话可以保g_a_optimizer.state_dict()。
嗯,就是为了继续训练。
我也遇到这个问题了,https://aistudio.baidu.com/paddle/forum/topic/show/989540
重启环境,这个问题就能解决,怀疑是缓存的问题
蜜汁报错
你这样去掉就是不载入之前的优化器参数了,而你的保存就是优化器在载入参数的时候报错。所以去掉了肯定不会保存。但这没有从根本上解决问题。
保存优化器参数的主要作用是,在恢复训练时,能够从之前停止训练的地方继续训练,而不是从头开始训练。如果不保存优化器参数,需要重新初始化优化器,这可能会导致训练效果变差。
在后续训练中如果只载入模型之前保存的参数,而不载入优化器的参数,模型照样可以继续训练。但是,由于优化器参数的缺失,模型的训练可能会出现一些不稳定的情况,比如出现震荡或者收敛速度变慢。因此,如果有保存优化器参数的需要,最好还是一起载入。
所以你把那一行去掉只是没有载入优化器参数,但是正常来将就是要载入优化器参数来训练的。
这个是paddle一直没有修复的bug