qiaoguan / deep-ctr-prediction

CTR prediction models based on deep learning(基于深度学习的广告推荐CTR预估模型)
https://github.com/qiaoguan/deep-ctr-prediction
907 stars 276 forks source link

关于模型导出的一些问题 #7

Closed DJy4ever closed 4 years ago

DJy4ever commented 4 years ago

您好,我现在想把训练好的模型文件单独导入然后用做预测。但是使用tf.estimator我无法找到输入接口。查阅了相关资料,适应如像你代码中的tf.estimator.export.RegressionOutput可以定义输出接口,但是我如何定义输入接口,即sess.run(output,feed_dict=???)。output是哪个?feed_dict又该如何赋值?

qiaoguan commented 4 years ago

输入的接口就是我input_fn里面定义的,你可以看看我train.py里面的export_model和model_predict函数的实现,然后再查查相应的API,单独用做预测的话, 你可以把模型导出之后 通过tenserflow serving 的方式进行预测(使用rest或grpc的格式), 你本地实验的话, 你可以拿一个样本,把它转成tfrecord格式,参考我的model_predict格式就OK

DJy4ever commented 4 years ago

当时我觉得没用我就给删了,最后还是有用。。。还有我想问把feature_column作为input,那相应的input_tesor在哪里呢?我看tf.estimator.export.ServingInputReceiver或者tf.estimator.export.build_raw_serving_input_receiver_fn都是指定placeholder以及对应的tensor名字的。

qiaoguan commented 4 years ago

你看下input_fn里面的代码,看下是怎么解析数据的

DJy4ever commented 4 years ago

是这样的,我现在input_fn函数返回的不是feature,label这种形式而是一个元组,形式是((feature_1,feature_2),(label_1,label_2)),所以我在model_fn函数中第一个参数features先取features[0],features[1],然后分别处理。并且feature_colmuns函数生成的最后也是类似input_fn函数返回的形式,是一个元组,里面的每个元素是一个列表,里面包含着feature_columns(与你的原码相似),因为在model_fn函数中我input_layer了好几次。。。现在的问题是我按照你所写的模型导出方法,export_model函数内部的columns变量我是将feature_colmuns函数生成的元组内部的元素(列表)合并。现在export_model函数报错,报features[0]这部操作的keyerror:0。 想问一下这种情况应该怎么处理,训练和预测阶段都是没问题的,就导出模型报错

qiaoguan commented 4 years ago

模型里面有用到的feature的key,但是你的feature_column里面没有这个key, 这样export就会报错,类似这样 https://github.com/qiaoguan/deep-ctr-prediction/blob/master/Din/train.py#L50

DJy4ever commented 4 years ago

关键这个0并不是key,是索引。。。features并不是一个dict而是一个元组。

qiaoguan commented 4 years ago

你可以参考一下esmm的代码, 里面也是有多个label的, 特征,你在任意的子模型里面都可以指定用哪些特征的, 你看看,然后想想吧, 你要实现的任何功能,这份代码里面应该都是有类似的参考的。

DJy4ever commented 4 years ago

你都是用tf.estimator api写的哇。。。这个api真的是又爱又恨。我在研究研究,感谢耐心解答,麻烦您了!

qiaoguan commented 4 years ago

建议使用这个API,这个API比较高效,性能方面完全没问题,输入采用Dataset API, 就是有些实现最开始不熟悉的时候要摸索下, 你可以多看下我的代码,看看API, 多看几遍就会了,基本上你想实现的任何功能,我的这份代码里面都有的

DJy4ever commented 4 years ago

终于导出成功了,慢慢看的源码一点点改的。主要是适合于model_fn参数中的features直接input_layers的操作,因为导出模型的输入解析字典是根据feature_column来的,如果中间处理操作的这些变量是不被识别的。。。所以现在我导出模型了,如何找到这个input呢(换句话这个导出模型我该如何使用)

qiaoguan commented 4 years ago

没太听懂你的意思,能否再详细一些,举个例子之类的?

DJy4ever commented 4 years ago

就是你的export_model函数我成功运行了,那我如何使用导出的model呢(生成的文件夹中有一个save_model.pb,以及一个variables文件夹)

qiaoguan commented 4 years ago

这个模型使用的话,一般tensorflow serving之类的是使用这种类型的模型.pb, 这个可以应用在工业界, 如果自己用的话,直接用cpkt文件类型的模型就ok,模型模型训练的过程中每隔一段时间,就会保存中间模型,存储的models文件夹

DJy4ever commented 4 years ago

问题是ckpt文件我找不到输入。。。职能部署出来。所以pb文件可以像sess.run这种形式来送进一条样本得到相应的输出么

qiaoguan commented 4 years ago

你可以把代码简单改一下, 改成不训练模型, 只用输入的数据进行evaluate/predict,就ok 了啊

DJy4ever commented 4 years ago

其实吧我现在需要用SHAP来解释模型。SHAP值的API如果用tensorflow的话需要传入两个tensor,一个是input tensor,一个是output tensor。现在就是找哥哥output tensor找不到。内部就是sess.run的结构。

DJy4ever commented 4 years ago

我想问一下,是不是按照你的代码正常export model,是不含梯度信息?也就是使用tf.gradients()计算保存的op是计算不出来梯度的是么?如果是这样,那如何能将梯度信息保存下来呢?

qiaoguan commented 4 years ago

这个我不太确定,我没用过这个,你可以调研一下