Я бы попробовал это с tf.data.Dataset.from_tensor_slices
Предположим, у вас есть путь для набора поездов train_path
.Сначала вы создаете объект набора данных из него.Также вы можете передавать не путь, а пути from_tensor_slices((image_path, labels_path))
или списки имен файлов / меток.Позже он может быть обработан с помощью функции синтаксического анализа.
dataset = tf.data.Dataset.from_tensor_slices(image_path)
Затем вы можете перемешать, пакетировать и отобразить любую функцию синтаксического анализа в этом наборе данных.Вы можете контролировать, сколько примеров будет предварительно загружено с помощью буфера перемешивания.Повторите контроль количества эпох и лучше не указывать ни одного, поэтому он будет повторяться бесконечно.Вы можете использовать либо обычную пакетную функцию, либо комбинировать ее с
dataset = dataset.shuffle().repeat()
dataset.apply(tf.data.experimental.map_and_batch(map_func=parse_func, batch_size,num_parallel_batches))
. Вам нужно определить функцию синтаксического анализа для загрузки фактических данных из имени файла
def parse_func(filename):
f = tf.read_file(filename)
img = tf.image.decode_image(f)
label = #get label from filename
return img, l
После применения этого к объекту набора данных он будет содержать пакетыпар image / label.
Помните, что пакетирование происходит внутри этого конвейера, поэтому вам не нужно использовать пакет в model.fit, но вам нужно передавать число эпох и шагов за эпоху.Последнее может быть немного сложнее, потому что вы не можете сделать что-то вроде len (набора данных), поэтому его следует рассчитать заранее.
model.fit(dataset, epochs, steps_per_epoch)
Вы можете сделать то же самое для тестового набора данных.Вы также можете проверить его содержимое с помощью
iterator = dataset.make_one_shot_iterator()
with tf.Session() as sess:
print(sess.run(iterator.get_next()))
. Это выведет num_batches.