我正在使用TF-Ranking训练推荐引擎。我遇到了一个问题,该问题似乎是与tf.feature_column
API有关的版本不兼容问题。
我的问题的简短版本是:什么是v2功能专栏(TF 2.0?)(例如,请参见this),如何确保我将功能专栏视为v2?仍使用TF 1.14。
这是详细信息:
我无法充分缩短代码长度以提供可重复的示例。但我将尝试用语言来描述问题。
TF版本:1.14 操作系统:Ubuntu 18.04
最初,我的模型中有两个特征user
和item
,它们都是稀疏的分类特征,它们包装在自己的tf.feature_column.embedding_column
中。我能够使用train_and_evaluate
的{{1}}方法并导出用于投放的模型。
然后,我添加了一个新功能Estimator
,该功能仅在预测过程中存在(作为上下文功能)。这与curr_item
共享嵌入。所以现在我有了一个item
,它同时包裹了tf.feature_column.shared_embedding_columns
和item
。
现在调用current_item
会导致以下错误(短信缩短):
ValueError:无法从检查点加载所有请求的变量。请确保您的model_fn不期望未保存在检查点中的变量。 在检查点中找不到关键的input_layer / user_embedding / embedding_weights
请注意,调用train_and_evaluate
方法只能正常工作。我的理解是,一旦进行评估,它将尝试从检查点加载变量,但是该变量不存在。我做了一些调试,发现了原因:
在训练过程中调用train
时(依次调用encode_listwise_features
),所有功能(encode_features
和user
)均为“ V2”(不确定这意味着什么)因此以下if语句成立:
和两个变量都以item
前缀(作用域名称?)命名:
encoding_layer / user_embedding / embedding_weights encoding_layer / item_embedding / embedding_weights
但是,当我为所有三个功能调用相同的功能时(在eval或预测模式下有点困惑),其中一些不是“ V2”,我们最终处于上述条件的其他部分,即encoding_layer
直接使用,变量使用input_layer
前缀命名。现在TF正在尝试还原
input_layer / user_embedding / embedding_weights
从检查点开始,但该名称在检查点中不存在,因为它被称为
encoding_layer / user_embedding / embedding_weights
在训练中。
所以:
1)如何确保在所有阶段将我的所有功能都视为v2?我尝试使用input_layer
,但没有帮助。在上面的if语句中已经有一个ToDo注释。
2)是否可以修改tf.compat.v2.feature_column
以避免这种情况?例如引发异常并提供有用的消息?