我有如下功能:
tf.feature_column.indicator_column(tf.feature_column.categorical_column_with_vocabulary_file(...))
对应的'vocabulary_file'
包含如下整数值:
10
20
32
44
5
1212
...
考虑这样的训练样例:
Jack,男,22岁," [10,20]" ,2.33,1
Sara,女,24岁," [32,44,5,1212]" ,5.6,-1
每个训练示例都有一个可变长度列表数据,如 [10,20] 或 [32,44,5,1212]
现在,我想将此数据从csv文件捕获到'indicator_column'
功能中,然后将多热表示(结果)提供给深层模型。
decode_csv
函数仅支持float32
,float64
,int32
,int64
,string
,我对'list'
类型数据有疑问在csv。
系统信息:
OS平台:Win8, TensorFlow安装自:二进制, TensorFlow版本:1.5, Python版本:3.6, Bazel版本:无, CUDA / cuDNN版本:无, GPU模型和存储器:GPU>没有| CPU> AMD(Phenom II x4),
重现的确切命令很明确。
答案 0 :(得分:0)
这里有两个问题。首先,官方CSV格式没有任何递归概念 - 单个单元格实际上是要解析的多个值。
如果通过调用decode_csv
两次(ipython REPL使用急切执行)内部列表的大小不变,您可以实现所需的目标:
In [21]: a, b, c = tf.decode_csv(tf.constant('"Jack","10, 20",1'), ["", "", 0])
In [22]: tf.decode_csv(b, [0, 0])
Out[22]:
[<tf.Tensor: id=113, shape=(), dtype=int32, numpy=10>,
<tf.Tensor: id=114, shape=(), dtype=int32, numpy=20>]
但是,官方CSV格式也不支持可变长度数据 - 每行应该具有相同数量的字段/列。
鉴于CSV的所有这些限制,我建议采用以下替代方法(假设您希望保留文本 - 如果没有,您可以在TFRecord中对数据进行编码):
tf.py_func
调用它。见https://www.tensorflow.org/programmers_guide/datasets#applying_arbitrary_python_logic_with_tfpy_func。答案 1 :(得分:0)
您可以像这样使用sklearn.preprocessing.MultiLabelBinarizer
和tf.feature_column.indicator_column
:
mlb = sklearn.preprocessing.MultiLabelBinarizer()
mlb.fit([item.split(",") for item in user_df[column]])
multi_hot_column_dict[column] = tf.feature_column.indicator_column(tf.feature_column.categorical_column_with_vocabulary_list(column, mlb.classes_))