我正在尝试使用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
答案 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
),否则最终将变得乱码。