如何批量写入TFRecords?

2024-09-27 09:30:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大约有4000万行的CSV。每一行都是一个训练实例。根据datasets#reading_input_data" rel="noreferrer">the documentation on consuming TFRecords我正在尝试对数据进行编码并将其保存在TFRecord文件中。在

我发现的所有示例(even the ones in the TensorFlow repo)都显示了创建TFRecord的过程依赖于类TFRecordWriter。这个类有一个方法write,它将数据的序列化字符串表示作为输入并将其写入磁盘。但是,这似乎是一次只完成一个训练实例。在

如何编写一批序列化数据?

假设我有一个函数:

  def write_row(sentiment, text, encoded):
    feature = {"one_hot": _float_feature(encoded),
               "label": _int64_feature([sentiment]),
               "text": _bytes_feature([text.encode()])}

    example = tf.train.Example(features=tf.train.Features(feature=feature))
    writer.write(example.SerializeToString())

向磁盘写入4000万次(每个示例一次)的速度将非常慢。批处理这些数据并一次编写50k或100k个示例(只要机器的资源允许),效率会高得多。但是,似乎没有任何方法可以在TFRecordWriter内完成此操作。在

大致如下:

^{pr2}$

但是当我读取这个方法创建的文件时,我得到了以下错误:

tensorflow/core/framework/op_kernel.cc:1192] Invalid argument: Could not parse example input, value: '
��

label

��
one_hot����
��

注意:我可以更改编码过程,使每个example原型包含数千个示例,而不是只有一个 我不想在以这种方式写入TFrecord文件时对数据进行预批处理,因为当我希望使用该文件进行具有不同批处理大小的培训时,这会给我的培训管道带来额外的开销。在


Tags: 文件the数据实例方法text示例编码
1条回答
网友
1楼 · 发布于 2024-09-27 09:30:35

TFRecords是二进制格式。在下面的行中,您将其视为文本文件:self.writer.write(os.linesep.join(self.records))

这是因为您使用的操作系统依赖于linesep(或者\n或{})。在

解决方案: 写记录就行了。你要求批写它们。您可以使用缓冲写入程序。对于4000万行,您可能还需要考虑将数据拆分为单独的文件,以实现更好的并行化。在

使用TFRecordWriter时:文件已被缓冲。在

证据来源如下:

  • tf_record.py调用pywrap_tensorflow.PyRecordWriter_New
  • PyRecordWriter调用Env::Default()->NewWritableFile
  • Env->NewWritableFile调用匹配文件系统上的NewWritableFile
  • e、 g.PosixFileSystem调用fopen
  • fopen返回一个流,如果已知该流不引用交互式设备“,则该流在默认情况下是完全缓冲的
  • 这将依赖于文件系统,但WritableFile注意到“由于调用方可能一次将小片段附加到文件中,因此实现必须提供缓冲。”

相关问题 更多 >

    热门问题