我的目标是为固定数量的时期或步骤训练神经网络,我希望每一步都使用.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>
为了澄清,我不熟悉的是以这种方式循环文件,我不确定如何操纵循环。
感谢。
答案 0 :(得分:1)
不可能。 TFRecords是一个流媒体阅读器,没有随机访问。
TFRecords文件表示一系列(二进制)字符串。格式不是随机访问,因此适用于流式传输大量数据,但如果需要快速分片或其他非顺序访问则不适用。
答案 1 :(得分:1)
如果您想使用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
文件。