[PaddlePaddle/Paddle]预训练权重加载问题,Paddle关于这部分的文档好像是基本没有的?

2024-03-22 719 views
9

你好,如果想把预训练好的param参数文件里部分参数(如除去最后一层的参数fc_76)加载到模型中,该如何处理呢

def load_test_weights_file(self, exe, weights, prog, place):
   """
   load_test_weights_file
   """
   load_vars = [x for x in prog.list_vars() \
                if isinstance(x, fluid.framework.Parameter)]
   load_vars = list(filter(lambda x: "fc_76" not in x.name, load_vars))  # 

   fluid.io.load_vars(exe,
                      dirname=weights,
                      vars=load_vars,
                      filename="param")

以上是我尝试的代码,但对缺失的那部分参数paddle会报错,针对这种预训练场景,paddle有没有相关的文档?另PaddleVideo那个仓库基本不回答问题,好奇怪,是后续不继续维护了吗

回答

0

使用的预训练权重,路径类似于:checkpoints_save/param
**使用predicate**
def load_test_weights_file(self, exe, weights, prog, place):
    """
    load_test_weights_file
    """

    def if_exist(var):
        if "fc_76" not in var.name:
            return True
        else:
            return True

    fluid.io.load_vars(exe,
                       dirname=weights,
                       predicate=if_exist,
                       filename="param")
报以下的错误

Traceback (most recent call last): File "scenario_lib/train.py", line 262, in train(args) File "scenario_lib/train.py", line 197, in train train_model.load_test_weights_file(exe, args.pretrain, train_prog, place) File "./scenario_lib/models/attention_lstm_ernie.py", line 428, in load_test_weights_file filename="param") File "lib/python3.7/site-packages/paddle/fluid/io.py", line 844, in load_vars filename=filename) File "lib/python3.7/site-packages/paddle/fluid/io.py", line 961, in load_vars executor.run(load_prog) File "lib/python3.7/site-packages/paddle/fluid/executor.py", line 1299, in run six.reraise(*sys.exc_info()) File "lib/python3.7/site-packages/six.py", line 703, in reraise raise value File "lib/python3.7/site-packages/paddle/fluid/executor.py", line 1295, in run return_merged=return_merged) File "lib/python3.7/site-packages/paddle/fluid/executor.py", line 1464, in _run_impl return new_exe.run(list(feed.keys()), fetch_list, return_numpy) File "lib/python3.7/site-packages/paddle/fluid/executor.py", line 547, in run tensors = self._new_exe.run(feed_names, fetch_list)._move_to_list() ValueError: (InvalidArgument) The number of variables to be loaded is 0, expect it to be greater than 0. [Hint: Expected out_var_names.size() > 0UL, but received out_var_names.size():0 <= 0UL:0.] (at /paddle/paddle/fluid/operators/load_combine_op.h:45)

0

你加载的模型是所有参数保存到同一个文件还是各个参数分别保存到各个文件? 从报错看起来是前者,这种情况是不能选择只加载其中某些参数 image 可以先load所有参数,然后用save_vars把各个参数分开保存,再用load_vars加载你想要的参数

0

请问有相关的文档吗?

6

目前我是在load_vars后实现save_vars的

def load_test_weights_file(self, exe, weights, prog, place):
    """
    load_test_weights_file
    """
    load_vars = [x for x in prog.list_vars() \
                 if isinstance(x, fluid.framework.Parameter)]
    fluid.io.load_vars(exe,
                       dirname=weights,
                       vars=load_vars,
                       filename="param")

    def name_has_fc(var):
        return True
    fluid.io.save_vars(executor=exe, dirname="save_vars_tmp", main_program=prog, predicate=name_has_fc)

出现了以下的错误:

  File "./scenario_lib/models/attention_lstm_ernie.py", line 416, in load_test_weights_file
    fluid.io.save_vars(executor=exe, dirname="save_vars_tmp", main_program=prog, predicate=name_has_fc)
  File "<decorator-gen-118>", line 2, in save_vars
  File "/lib/python3.7/site-packages/paddle/fluid/wrapped_decorator.py", line 25, in __impl__
    return wrapped_func(*args, **kwargs)
  File "/lib/python3.7/site-packages/paddle/fluid/framework.py", line 425, in __impl__
    return func(*args, **kwargs)
  File "/lib/python3.7/site-packages/paddle/fluid/io.py", line 376, in save_vars
    filename=filename)
  File "<decorator-gen-118>", line 2, in save_vars
  File "/lib/python3.7/site-packages/paddle/fluid/wrapped_decorator.py", line 25, in __impl__
    return wrapped_func(*args, **kwargs)
  File "/lib/python3.7/site-packages/paddle/fluid/framework.py", line 425, in __impl__
    return func(*args, **kwargs)
  File "/lib/python3.7/site-packages/paddle/fluid/io.py", line 394, in save_vars
    new_var = _clone_var_in_block_(save_block, each_var)
  File "/lib/python3.7/site-packages/paddle/fluid/io.py", line 249, in _clone_var_in_block_
    shape=var.shape,
  File "/lib/python3.7/site-packages/paddle/fluid/framework.py", line 1841, in shape
    return tuple(self.desc.shape())
RuntimeError: (Unavailable) Getting 'tensor_desc' is not supported by the _generated_var_0 type variable. (at /paddle/paddle/fluid/framework/var_desc.cc:224)
8

save_vars直接保存全部参数,load_vars再load部分参数呢

3

这个报错是在save_vars这一步出现的:(Unavailable) Getting 'tensor_desc' is not supported by the _generated_var_0 type variable..这个报错的具体原因是什么呢?

4

先save后load,这样model的参数是会随机初始化吗,如果是这样,预训练权重岂不是没法加载到model上了?

5

这次可以了,感谢感谢(PS:后续paddle会考虑相关文档或者example吗?如果有这些的话,效率感觉会提升很多)