logic_regression模型save_inference_model的时候报错dense_input参数不存在
经过调试发现是函数def _prune_with_input(self, feeded_var_names, targets)保存的模型里面把一些变量都移除了.原因未知,dll无法调试
只剩下了两个变量
var label : LOD_TENSOR.shape(-1, 1).dtype(int64).stop_gradient(True)
var save_infer_model/scale_0.tmp_0 : LOD_TENSOR.shape(-1, 1).dtype(int64).stop_gradient(False)
下面是堆栈
Traceback (most recent call last):
File ".\PaddleRec-master\tools\static_trainer.py", line 288, in
config.ymal 新增了
use inference save model
use_inference: True # 静态图训练时保存为inference model save_inference_feed_varnames: ["dense_input", "sparse_input"] # inference model 的feed参数的名字 save_inference_fetch_varnames: ["label"] # inference model 的fetch参数的名字
“or remove it from feeded_var_names if 'dense_input' is not involved in the target_vars calculation” 就像报错中说的这样,save_inference_model接口会根据fetch_varnames来裁剪组网,如果feed进来的变量对于输出fetch变量没有帮助,就会被裁剪掉并报错。您需要调整save_inference_fetch_varnames中的参数以正确裁剪组网
“or remove it from feeded_var_names if 'dense_input' is not involved in the target_vars calculation” 就像报错中说的这样,save_inference_model接口会根据fetch_varnames来裁剪组网,如果feed进来的变量对于输出fetch变量没有帮助,就会被裁剪掉并报错。您需要调整save_inference_fetch_varnames中的参数以正确裁剪组网
可是组网的逻辑是paddlerec的原始代码,我看不出来为什么feed进来的变量会对fetch变量没有帮助,反而裁剪完之后的变量更奇怪一些,都已经没有input了,我尝试了把fetch变量改成save_infer_model/scale_0.tmp_0,也得到是一样的结果
因为您fetch所需要的变量仅仅是label,就算没有组网label也是直接在数据集中的。所以在裁剪的时候,可能直接将全部的组网裁掉了
您需要梳理一下组网的逻辑,确保写在save_inference_fetch_varnames中的输出,需要且仅需要save_inference_feed_varnames中的输入就可经过组网计算获得。
您需要梳理一下组网的逻辑,确保写在save_inference_fetch_varnames中的输出,需要且仅需要save_inference_feed_varnames中的输入就可经过组网计算获得。
您的意思我明白了,label确实是已经在组网中的,我想问一下我该如何选取呢,我需要的值是最后sigmoid计算的结果。请问是选择sigmoid_0.tmp_0这个变量吗
是的,需要填var名,不是变量名
是的,需要填var名,不是变量名
我把save_inference_fetch_varnames的参数改成了["sigmoid_0.tmp_0"],可以正常生成预测模型了,但是最终生成的服务proto和我想象的不太一样,并没有出现sigmoid_0.tmp_0,而是save_infer_model/scale_0.tmp_2,请问是哪一步有问题吗?下面是serving_server_conf.prototxt feed_var { name: "dense_input" alias_name: "dense_input" is_lod_tensor: false feed_type: 1 shape: 24 } feed_var { name: "sparse_input" alias_name: "sparse_input" is_lod_tensor: false feed_type: 0 shape: 24 } fetch_var { name: "save_infer_model/scale_0.tmp_2" alias_name: "save_infer_model/scale_0.tmp_2" is_lod_tensor: false fetch_type: 1 shape: 1 }
这个是生成的程序 serving_io.inference_model_to_serving("output_model_lr/2", serving_server="serving_server", serving_client="serving_client", model_filename="rec_inference.pdmodel", params_filename="rec_inference.pdiparams")
是的,需要填var名,不是变量名
我把save_inference_fetch_varnames的参数改成了["sigmoid_0.tmp_0"],可以正常生成预测模型了,但是最终生成的服务proto和我想象的不太一样,并没有出现sigmoid_0.tmp_0,而是save_infer_model/scale_0.tmp_2,请问是哪一步有问题吗?下面是serving_server_conf.prototxt feed_var { name: "dense_input" alias_name: "dense_input" is_lod_tensor: false feed_type: 1 shape: 24 } feed_var { name: "sparse_input" alias_name: "sparse_input" is_lod_tensor: false feed_type: 0 shape: 24 } fetch_var { name: "save_infer_model/scale_0.tmp_2" alias_name: "save_infer_model/scale_0.tmp_2" is_lod_tensor: false fetch_type: 1 shape: 1 }
这个是生成的程序 serving_io.inference_model_to_serving("output_model_lr/2", serving_server="serving_server", serving_client="serving_client", model_filename="rec_inference.pdmodel", params_filename="rec_inference.pdiparams")
遇到类似问题,请问解决了吗,另外您知道如何导出动态batch吗