我有一个大约有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文件时对数据进行预批处理,因为当我希望使用该文件进行具有不同批处理大小的培训时,这会给我的培训管道带来额外的开销。在
TFRecords是二进制格式。在下面的行中,您将其视为文本文件:
self.writer.write(os.linesep.join(self.records))
这是因为您使用的操作系统依赖于})。在
linesep
(或者\n
或{解决方案: 写记录就行了。你要求批写它们。您可以使用缓冲写入程序。对于4000万行,您可能还需要考虑将数据拆分为单独的文件,以实现更好的并行化。在
使用TFRecordWriter时:文件已被缓冲。在
证据来源如下:
pywrap_tensorflow.PyRecordWriter_New
Env::Default()->NewWritableFile
NewWritableFile
fopen
相关问题 更多 >
编程相关推荐