我试图在TensorFlow中创建一个模型,它通过预测数字向量来预测用户的理想项目。 我在Spark中创建了一个数据集,并使用Spark TensorFlow连接器将其保存为TFRecord。 在数据集中,我有几百个功能,每行有20个标签。为了便于操作,我给每一列都添加了一个前缀' feature _'或者'标签_'。 现在我尝试为TensorFlow编写输入函数,但我无法弄清楚如何解析数据。 到目前为止,我写了这个:
def dataset_input_fn():
path = ['data.tfrecord']
dataset = tf.data.TFRecordDataset(path)
def parser(record):
example = tf.train.Example()
example.ParseFromString(record)
# TODO: no idea what to do here
# features = parsed["features"]
# label = parsed["label"]
# return features, label
dataset = dataset.map(parser)
dataset = dataset.shuffle(buffer_size=10000)
dataset = dataset.batch(32)
dataset = dataset.repeat(100)
iterator = dataset.make_one_shot_iterator()
features, labels = iterator.get_next()
return features, labels
如何将示例拆分为功能集和标签集?我试图将示例拆分为两部分,但是甚至无法访问它。我设法访问它的唯一方法是将示例打印出来,这给了我类似的东西。
features {
...
feature {
key: "feature_wishlist_hour"
value {
int64_list {
value: 0
}
}
}
feature {
key: "label_emb_1"
value {
float_list {
value: 0.4
}
}
}
feature {
key: "label_emb_2"
value {
float_list {
value: 0.8
}
}
}
...
}
答案 0 :(得分:2)
您的解析器功能应与构建example proto
的方式类似。在你的情况下,它应该类似于:
# example proto decode
def parser(example_proto):
keys_to_features = {'feature_wishlist_hour':tf.FixedLenFeature((), tf.int64),
'label_emb_1': tf.FixedLenFeature((), tf.float32),
'label_emb_2': tf.FixedLenFeature((), tf.float32)}
parsed_features = tf.parse_single_example(example_proto, keys_to_features)
return parsed_features['feature_wishlist_hour'], (parsed_features['label_emb_1'], parsed_features['label_emb_2'])
编辑:从评论看来,您似乎将每个功能编码为键,值对,这是不对的。请查看以下答案:Numpy to TFrecords: Is there a more simple way to handle batch inputs from tfrecords?,了解如何以正确的方式编写它。