【问题标题】:How can I pick specific records in TensorFlow from a .tfrecords file?如何从 .t​​frecords 文件中选择 TensorFlow 中的特定记录?
【发布时间】:2016-11-22 04:08:23
【问题描述】:

我的目标是为固定数量的时期或步骤训练神经网络,我希望每个步骤都使用 .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 菜鸟,我怀疑在循环之外创建“i”并在它达到某个值时中断只是一个hacky word-around。

有没有一种方法可以从文件中读取数据,但指定“我想要标签功能中包含的 byte_list 中的前 100 个值”,然后指定“我想要接下来的 100 个值”。

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

谢谢。

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。我想知道您是否可以向我指出某个地方以更多地了解这种格式。大多数情况下,我只是不确定它可能对什么有用。
  • 这是否仅通过可用的 API 是不可能的?也许有一个较低级别的解决方案?
【解决方案2】:

出于存档目的扩展 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:

从.tfrecord 文件构造Dataset

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,它有助于解释.tfrecord 文件,比tensorflow 文档更好。

【讨论】:

    猜你喜欢
    • 2020-04-07
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2021-05-16
    相关资源
    最近更新 更多