如何从.tfrecords文件中选择TensorFlow中的特定记录?

时间:2016-07-19 10:11:18

标签: python python-2.7 numpy machine-learning tensorflow

我的目标是为固定数量的时期或步骤训练神经网络,我希望每一步都使用.tfrecords文件中特定大小的一批数据。

目前我正在使用此循环从文件中读取:

i = 0
data = np.empty(shape=[x,y])

for serialized_example in tf.python_io.tf_record_iterator(filename):

    example = tf.train.Example()
    example.ParseFromString(serialized_example)

    Labels = example.features.feature['Labels'].byte_list.value
    # Some more features here

    data[i-1] = [Labels[0], # more features here]

    if i == 3:
        break
    i = i + 1

print data # do some stuff etc.

我是一个Python noob,我怀疑在循环外创建“i”并在达到某个值时突然爆发只是一个hacky单词。

有没有办法可以从文件中读取数据,但是指定“我希望在标签功能中包含的byte_list中的前100个值”,然后“我想要接下来的100个值”。< / p>

为了澄清,我不熟悉的是以这种方式循环文件,我不确定如何操纵循环。

感谢。

2 个答案:

答案 0 :(得分:1)

不可能。 TFRecords是一个流媒体阅读器,没有随机访问。

  

TFRecords文件表示一系列(二进制)字符串。格式不是随机访问,因此适用于流式传输大量数据,但如果需要快速分片或其他非顺序访问则不适用。

答案 1 :(得分:1)

出于存档目的,用Shan Carter扩展评论(尽管这不是您问题的理想解决方案)。

如果您想使用enumerate()在某个迭代中退出循环,则可以执行以下操作:

n = 5 # Iteration you would like to stop at
data = np.empty(shape=[x,y])

for i, serialized_example in enumerate(tf.python_io.tf_record_iterator(filename)):

    example = tf.train.Example()
    example.ParseFromString(serialized_example)

    Labels = example.features.feature['Labels'].byte_list.value
    # Some more features here

    data[i-1] = [Labels[0], Labels[1]]# more features here

    if i == n:
       break

print(data) 

解决您的.tfrecords用例

  

我希望每个步骤都使用.tfrecords文件中的一批特定大小的数据。

TimZaman所述,.tfrecords并不意味着可以任意访问数据。但是,由于您只需要连续从.tfrecords文件中提取批次,可能最好使用tf.data API来提供模型。

改编自tf.data guide

Dataset个文件中构建一个.tfrecord

filepath1 = '/path/to/file.tfrecord'
filepath2 = '/path/to/another_file.tfrecord
dataset = tf.data.TFRecordDataset(filenames = [filepath1, filepath2])

从这里开始,如果您使用的是tf.keras API,则可以像这样将dataset作为参数传递给model.fit

model.fit(x = dataset,
          batch_size = None,
          validation_data = some_other_dataset)

额外的东西

这里有一个blog,它比tensorflow文档更好地解释了.tfrecord文件。