как загрузить данные из файлов tfrecord только один раз - PullRequest
0 голосов
/ 27 августа 2018

Я играю с 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 только один раз в начале обучения?

...