High level API的一些使用问题
Created by: qingqing01
背景是要升级一些models里模型,遇到若干问题:
-
如何使得训练中的test_program和train_program不同?
- 问题:类似以下定义,如何只给test_program里加一些op,train_program里不加?
loss = fluid.layers.ssd_loss(locs, confs, gt_box, gt_label, box,box_var) loss = fluid.layers.reduce_sum(loss) test_program = fluid.default_main_program().clone(for_test=True) with fluid.program_guard(test_program): map_eval = fluid.evaluator.DetectionMAP(...)
- 当前内部实现问题:只从train_program里clone出来test_program。(也没有加for_test=True,这样对有BatchNorm、Dropout的网络在测试时的行为是正确的吗?) self.test_program = self.train_program.clone()
- 问题:类似以下定义,如何只给test_program里加一些op,train_program里不加?
-
如何Load部分参数做初始化?
- Low-level API方法:当前在models里的一些例子,采用如下方法,必需定义
predicate
的一个函数传入给load_vars
才能只load部分参数。
place = fluid.CUDAPlace(0) # or fluid.CPUPlace() exe = fluid.Executor(place) exe.run(fluid.default_startup_program()) def if_exist(var): return os.path.exists(os.path.join(pretrained_model_dir, var.name)) fluid.io.load_vars(exe, pretrained_model_dir, predicate=if_exist)
- 问题:High level API如何做? io.load_persistables(exe, dirname=param_path)当前这样使用,无法只load部分参数。
- Low-level API方法:当前在models里的一些例子,采用如下方法,必需定义
-
如何做内存优化?
- Low-level API目前使用如下:
# 定义网络部分省略 opts = optimizer.minimize(avg_cost) fluid.memory_optimize(fluid.default_main_program()) #优化内存
- 问题:High level API如何做?
- Low-level API目前使用如下: