使用Tensorflow / Tensorflow Extended的列之间的数组中的元素检查

时间:2019-11-30 22:01:11

标签: python-3.x tensorflow tfx

我有一个数据集,我正在尝试为它设计一些功能,其中涉及检查列或数组中的元素是否出现在另一个数组中。我正在尝试在Tensorflow Extended中执行此操作,以便此操作成为服务中图表的一部分,但我对TF和TFX还是陌生的,并且无法对其进行静默处理。例如,假设我们有以下数据集:

>>> data = {"p_id": [100, 200, 300], 
...:        "topic": [('python', 'numpy'), ('pandas',), ('cpp',)], 
...:        "preferred_ids": [(200, 300, 400), (200, 300, 400), ()], 
...:        "trending_topics": [('pandas', 'tensorflow', 'python'), ('pandas', 'tensorflow', 'python'), ('c', 'cpp')] 
...:  }                                                                                                                                                                                                                                                   

>>> df = pd.DataFrame(data)                                                                                                                                                                                                                              

>>> df
   p_id            topic    preferred_ids               trending_topics
0   100  (python, numpy)  (200, 300, 400)  (pandas, tensorflow, python)
1   200        (pandas,)  (200, 300, 400)     (flask, tensorflow, nump)
2   300         (cpp, c)               ()                      (c, cpp)

我正在尝试定义函数in_preferred_idsmatches_trending,以便最终的转换将创建如下所示的特征列

   p_id            topic    preferred_ids               trending_topics  in_preferred_ids  matches_trending
0   100  (python, numpy)  (200, 300, 400)  (pandas, tensorflow, python)                 0                 1
1   200        (pandas,)  (200, 300, 400)     (flask, tensorflow, nump)                 1                 0
2   300         (cpp, c)               ()                      (c, cpp)                 0                 2

我尝试使用reduce_any转到in_preferred_ids,但最终遇到以下错误

TypeError: Expected int32, got <tensorflow.python.framework.sparse_tensor.SparseTensor object at 0x7f22d8731b70> of type 'SparseTensor' instead.

我怀疑这是因为p_id是带有元素的列,而reduce_any可能要求这两列都是数组,但是我不确定如何解决。我的完整尝试如下。任何帮助将不胜感激

def element_is_in(x, y):
    return tf.reduce_any(tf.convert_to_tensor(x.values) == tf.convert_to_tensor(y.values))

def preprocessing_fn(inputs):
    outputs = {
        "in_preferred_ids": (
            tf.where(
                element_is_in(inputs["p_id"], inputs["preferred_ids"]),
                tf.cast(tf.zeros(inputs["p_id"]), tf.int64),
                tf.cast(tf.ones(inputs["p_id"]), tf.int64),
            )
        )
    }

    return outputs

0 个答案:

没有答案