Я играю с tf.data.Dataset
и файлами tfrecord, чтобы выяснить горлышко бутылки в моем коде тензорного потока.В скрипте игрушки ниже, во второй эпохе, данные стираются и не могут быть прочитаны с диска.
import os
import tensorflow as tf
import numpy as np
tf.enable_eager_execution()
xs = [[1,2,3], [2,4,45,5],[5,5,56,2]]
names = ['a','b','c']
os.mkdir('foo')
for name, x in zip(names, xs):
features = tf.train.Features(feature={
'x': tf.train.Feature(int64_list=tf.train.Int64List(value=x))})
ex = tf.train.Example(features=features)
writer = tf.python_io.TFRecordWriter(f'foo/{name}')
writer.write(ex.SerializeToString())
writer.close()
def _parse_function(example_proto):
features={'x':tf.VarLenFeature(tf.int64),
}
parsed_features = tf.parse_single_example(example_proto, features)
return parsed_features
dataset = tf.data.TFRecordDataset(['foo/'+ f for f in os.listdir('foo')])
dataset.shuffle(buffer_size=3)
dataset.map(_parse_function)
dataset.cache()
dataset.repeat(3)
for i in range(3):
if i == 1:
for f in os.listdir('foo'):
os.remove('foo/'+f)
for d in dataset:
print(d)
Во второй эпохе я получил эту ошибку:
tensorflow.python.framework.errors_impl.NotFoundError:
foo/c; No such file or directory [Op:IteratorGetNextSync].
Это означает, что tf.data.TFRecordDataset()
читает данные с диска каждую эпоху, даже с tf.data.TFRecordDataset.cache()
.
Я предполагал, что весь набор данных будет кэшироваться в памяти, и файл io может не появиться после первой эпохи.Это не тот случай, по-видимому.Что делает метод cache()
?Кроме того, есть ли способ загрузить целые файлы tfrecord только один раз в начале обучения?