PaddlePaddle / models

Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.
Apache License 2.0
6.9k stars 2.91k forks source link

[论文复现]如何在动态图中导入静态图的预训练参数 #4788

Open thrkingd opened 4 years ago

thrkingd commented 4 years ago

我使用飞桨例子中dygraph文件夹下面的resnet模型,这个模型是用动态图方式实现的,参数名称与同一个模型在静态图下面的预训练参数不一样,怎么把这个静态图下面的预训练参数导入动态图中? 静态图的预训练参数是:http://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_pretrained.tar

AndersonZhangyq commented 4 years ago

可以参考 https://github.com/PaddlePaddle/Paddle/issues/25883 不过我试了一下1.8.3可以,1.8.0会报错 另外use_structured_name也不需要设置成False

thrkingd commented 4 years ago

这个issue的连接打不开啊??

littletomatodonkey commented 4 years ago

可以参考这里的写法: args.pretrained_model给的就是静态图的模型地址

https://github.com/PaddlePaddle/PaddleClas/blob/95ed78e2a68a51cea1af0d1e07a9ef0fe15d054e/tools/infer/infer.py#L72-L87

thrkingd commented 4 years ago

我看了一下, 这种写法要求pre_weights_dict(静态图)和当前dy_weights_dict(动态图)的变量名称要一致,但是静态图构建的时候是可以为参数指定名称的(有参数name)动态图构建的时候怎么为参数指定名称(dygragh的函数没有name参数)?

littletomatodonkey commented 4 years ago

动态图也是可以指定名字的,可以参考PaddleClas中的动态图resnet.py https://github.com/PaddlePaddle/PaddleClas/blob/dygraph/ppcls/modeling/architectures/resnet.py 和静态图resnet.py的写法 https://github.com/PaddlePaddle/PaddleClas/blob/master/ppcls/modeling/architectures/resnet.py

thrkingd commented 4 years ago

这个命名的方法确实是可以的,但是我还遇到了两个问题:

  1. 我下载的resnet-50是老的模型参数,就是一堆小的文件,我去load参数时报错了: program_state = fluid.load_program_state('./ResNet18_pretrained') 2020-08-07 08:15:09,478-WARNING: ./ResNet18_pretrained.pdparams not found, try to load model file saved with [ save_params, save_persistables, save_vars ] 2020-08-07 08:15:09,478-WARNING: ./ResNet18_pretrained.pdparams not found, try to load model file saved with [ save_params, save_persistables, save_vars ] d:\Users\wang\Anaconda3\envs\wj\lib\site-packages\paddle\fluid\executor.py:789: UserWarning: The following exception is not an EOF exception. "The following exception is not an EOF exception.") Traceback (most recent call last):

    File "", line 1, in program_state = fluid.load_program_state('./ResNet18_pretrained')

    File "d:\Users\wang\Anaconda3\envs\wj\lib\site-packages\paddle\fluid\io.py", line 1868, in load_program_state "Failed to load model file , please make sure model file is saved with the "

RuntimeError: Failed to load model file , please make sure model file is saved with the following APIs: save_params, save_persistables, save_vars 但是load单个的大的pdparams文件是没有问题的 2.在动态图模式下怎么保存模型结构以便可视化?用 fluid.dygraph.save_dygraph好像只能保存模型参数

shippingwang commented 4 years ago

确实dygraph.save_dygraph只保存下来了模型参数,你可以参考 https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/dygraph/jit.py#L585 jit.save接口

thrkingd commented 4 years ago

第一个问题怎么解决啊?

littletomatodonkey commented 4 years ago

第一个问题怎么解决啊?

你好,应该是预训练模型文件夹中包含了一些其他的文件,导致无法Paddle无法加载该文件,你可以看下里面是否包含一些比如__pycache__之类的

Hsoms commented 3 years ago

你好,我遇到了同样的问题,请问你现在解决了这个预训练模型导入的问题吗?