如何在张量流中表示稀疏特征列表?

时间:2018-07-03 19:33:08

标签: python tensorflow nlp deep-learning sequence

我正在尝试使用tensorflow.SequenceExample存储我的功能,例如以下所述的问答系统。

给出一个问题文本,例如“家有多远”。我想将其视为一个序列,并使用稀疏表示法表示每个单词。这不是一键编码。每个单词都有多个布尔特征。

how -> [ 1 0 0 0 1] -> [1,5]
far -> [ 0 1 1 0 0] -> [2,3]
is  -> [ 1 1 0 0 1] -> [1,2,5]
home-> [ 0 0 1 1 0] -> [3,4]

我的文字现在表示为:[[1,5],[2,3],[1,2,5],[3,4]]

类似地,我还有另一句话说answer text,它具有类似的列表列表表示方式。

如何以tensorflow的TFRecord格式编写此代码?我已经在下面的代码中尝试过了。我知道这是一个错误,因为我正在向一个仅期望单个int64list值的函数发送int64

有人代表这样的数据成功吗?

import tensorflow as tf


example = {

    'query': [[123, 543, 234, 2322],
              [133, 243, 233, 256, 4332],
              [232, 356, 632],
              [153, 143, 231, 456]],
    'document': [[1156, 12322],
                 [2133, 14332],
                 [1143, 1343, 1232, 1356, 1632],
                 [1153, 1143]],
    'label': 1
}

tmp_filename = 'tf.tmp'


def make_example(example):
    """
    Makes a single example from Python lists that follows the
    format of tf.train.SequenceExample.
    """
    query_features = example['query']
    keyword_features = example['document']
    example_sequence = tf.train.SequenceExample()

    example_sequence.context.feature["query_length"].int64_list.value.append(len(query_features))
    example_sequence.context.feature["keyword_length"].int64_list.value.append(len(keyword_features))

    query = example_sequence.feature_lists.feature_list["query"]
    document = example_sequence.feature_lists.feature_list["document"]

    for feat in query_features:
        print("Appending: ", feat)
        #query.feature.add().int64_list.value.append(feat)
        query.feature.add().list.value.append(feat)


    for feat in keyword_features:
        document.feature.add().int64_list.value.append(feat)

    return example_sequence


# Write all examples into a TFRecords file
def save_tf(filename):
    with open(filename, 'w') as fp:
        writer = tf.python_io.TFRecordWriter(fp.name)

        ex = make_example(example)
        writer.write(ex.SerializeToString())
        writer.close()


#
def read_and_decode_single_example(filename):
    filename_queue = tf.train.string_input_producer([filename],
                                                    num_epochs=None)

    reader = tf.TFRecordReader()
    _, serialized_example = reader.read(filename_queue)

    context_features = {
        "length": tf.FixedLenFeature([], dtype=tf.int64)
    }

    sequence_features = {

        "query": tf.VarLenFeature([], dtype=tf.int64),
        "document": tf.VarLenFeature([], dtype=tf.int64)
    }

    return serialized_example, context_features, sequence_feature

1 个答案:

答案 0 :(得分:2)

以我的经验,编码数组的最佳方法是使用numpy的tostring提取原始字节。在读取数据集时,您可以使用TensorFlow的decode_raw

以下内容足以满足您的编码要求:

for feat in query_features:
    print("Appending: ", feat)
    raw_feat = np.array(feat, dtype=np.int64).tostring()
    query.feature.add().bytes_list.value.append(raw_feat)

for feat in keyword_features:
    raw_feat = np.array(feat, dtype=np.int64).tostring()
    document.feature.add().bytes_list.value.append(raw_feat) 

请注意,在解码时必须确保在另一侧使用相同的数据类型(在此示例中为tf.int64),否则最终将变得乱码。