PaddlePaddle Fluid版本的PaddlePaddle如何在训练前加载此前训练好的模型?

  • 关键字:Fluid版本 预训练

  • 问题描述:Fluid版本的PaddlePaddle在模型保存上与旧版的PaddlePaddle差异较大,文档中也没有对这方面的详细描述,所以存有疑惑,可以简单解释一下?

  • 背景知识:
    预训练模型加载时深度学习中很常见的需求,特别是在图像识别、图像分割领域,这是因为图像处理方面,模型结构通常都比较深,如VGG、GoogleNet等都有比较深的结构,而且图像模型的训练数据集量往往也比较大,这就导致训练成本会比较高,如果每次都要使用ImageNet数据集来训练一个图像模型,是非常费力的,所以加载已有预训练模型就是一个不错的选择,因为图像数据集底层分布结构是相似的,所以对于其他图像网络而言,预训练的图像模式是可以借来使用的,即所谓迁移学习,将预训练模型的底层特征拿过来使用,接在新的图像模型结构上,对新的数据进行训练,这样就大大减少了训练数据量。

  • 问题讨论:
    在Fluid中,模型由一个或多个program来表示,program包含了block,block中包含了op和variable。

在保存模型时,program–block–{op, variable}这一系列的拓扑结构会被保存成一个文件,variable具体的值会被保存在其他文件里。

下面来讨论一下如何保存模型。

保存一个训练中的模型,你需要做两步:

1.保存program:

with open(filename, "wb") as f:
        f.write(program.desc.serialize_to_string())

2.保存program中各个persistable的varibale的值:

fluid.io.save_persistables(executor, dirname, main_program)

其中main_program就是刚刚被保存的那个program。

接着来看如何恢复模型:

同样,从保存的文件中恢复,也需要两步:

1.恢复program:

with open(filename, "rb") as f:
        program_desc_str = f.read()
program = Program.parse_from_string(program_desc_str)

2.恢复persistable的variable:

load_persistables(executor, dirname, main_program)

同样,main_program应当是刚刚恢复出来的那个program。

然后,program就可以放到exe.run()里面去做正常的训练了。

  • 问题分析:
    要使用加载预训练模型,就要弄明白Fluid版本的PaddlePaddle如何加载以及保存模型,通过问题讨论已经知道了,目前Fluid版本的PaddlePaddle只能将加载以及保存分开来执行。

但通过这种方法加载的模型通常用来预测,即训练好了一个模型后,然后将训练好的模型加载进来,并用来进行执行相关的预测任务,同样,这种方式也可以用来加载模型,然后继续训练,目前Fluid版本的PaddlePaddle还没有提供相应的接口来直接实现加载模型然后继续训练的功能,只能通过上面的方式将两种操作分开来执行。

  • 问题拓展:
    在官方示例代码中,保存模型具体操作为:
fluid.io.save_inference_model(model_path, ['image'], [out], exe)

即使用了save_inference_model方法来对模型进行保存操作,那与之前讨论的模型加载和模型保存操作有什么关系呢?

save_inference_model内部也是调用了问题讨论中提及的那两个接口。另外,在调用这两个接口之前,save_inference_model还会做一些模型裁剪的工作,裁减掉backward的部分。backward部分对于inference来说不需要,但对模型的继续训练是需要的。

但save_inference_model这个封装并不适用与你的需求,即“保存模型,下次恢复出来继续训练”这个需求,目前Fluid版本的PaddlePaddle还没有高层的API能够实现,这个接口在未来应该会很快实现,相关的讨论如下:

https://github.com/PaddlePaddle/Paddle/issues/10248

猜你喜欢

转载自blog.csdn.net/PaddlePaddle/article/details/87642278
今日推荐