从Tensorflow中的.tfrecords文件中获取记录总数

Huc*_*inn 24 tensorflow tfrecord

是否有可能从.tfrecords文件中获取记录总数?与此相关,人们如何通常跟踪训练模型时已经过的时期数?虽然我们可以指定batch_sizenum_of_epochs,但我不确定是否可以直接获得诸如current epoch每个时期的批次数等值- 这样我就可以更好地控制培训的进展情况.目前,我只是使用一个肮脏的黑客来计算这个,因为我事先知道我的.tfrecords文件中有多少记录和我的miniatches的大小.感谢任何帮助..

drp*_*png 31

要计算记录数,您应该可以使用tf.python_io.tf_record_iterator.

c = 0
for fn in tf_records_filenames:
  for record in tf.python_io.tf_record_iterator(fn):
     c += 1
Run Code Online (Sandbox Code Playgroud)

为了跟踪模型训练,张量就派上用场了.

  • 不幸的是,tfrecords 文件中没有元数据。每条记录的开头都有一个大小(uint64 长度,uint32 crc),但它是_within_ 压缩流,因此您需要解压缩所有内容。所以没有很好的方法来获取这些信息。 (3认同)
  • 谢谢 !我想知道.tfrecords文件中是否有一些元数据可以用来(找到记录的总数)而不是使用`tf_python_io.tf_record_iterator()`函数迭代整个数据集 (2认同)

Sal*_*ali 17

不,这是不可能的.TFRecord不存储有关存储在其中的数据的任何元数据.这个文件

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

如果需要,可以手动存储此元数据或使用record_iterator获取数字(您需要遍历所有记录:

sum(1 for _ in tf.python_io.tf_record_iterator(file_name))
Run Code Online (Sandbox Code Playgroud)

如果您想知道当前的纪元,可以从张量板或通过从循环中打印数字来实现.


BiB*_*iBi 9

由于tf.io.tf_record_iterator已被弃用,萨尔瓦多·达利 (Salvador Dali)的精彩回答现在应该阅读

tf.enable_eager_execution()
sum(1 for _ in tf.data.TFRecordDataset(file_name))
Run Code Online (Sandbox Code Playgroud)


Rus*_*ell 5

根据tf_record_iterator上的弃用警告,我们还可以使用Eager Execution 来计算记录数。

#!/usr/bin/env python
from __future__ import print_function

import tensorflow as tf
import sys

assert len(sys.argv) == 2, \
    "USAGE: {} <file_glob>".format(sys.argv[0])

tf.enable_eager_execution()

input_pattern = sys.argv[1]

# Expand glob if there is one
input_files = tf.io.gfile.glob(input_pattern)

# Create the dataset
data_set = tf.data.TFRecordDataset(input_files)

# Count the records
records_n = sum(1 for record in data_set)

print("records_n = {}".format(records_n))
Run Code Online (Sandbox Code Playgroud)