Создать набор данных тензорного потока из локального каталога изображения - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть очень большая база данных изображений локально, с распределением данных, как каждая папка содержит изображения одного класса.

Я хотел бы использовать API набора данных tenorflow для получения пакетов данных без необходимостиизображения загружены в память.

Я пробовал что-то вроде этого:

def _parse_function(filename, label):
    image_string = tf.read_file(filename, "file_reader")
    image_decoded = tf.image.decode_jpeg(image_string, channels=3)
    image = tf.cast(image_decoded, tf.float32)
    return image, label

image_list, label_list, label_map_dict = read_data()

dataset = tf.data.Dataset.from_tensor_slices((tf.constant(image_list), tf.constant(label_list)))
dataset = dataset.shuffle(len(image_list))
dataset = dataset.repeat(epochs).batch(batch_size)

dataset = dataset.map(_parse_function)

iterator = dataset.make_one_shot_iterator()

image_list - это список, в который добавлены путь (и имя) изображений, а label_list - это список.где класс каждого изображения был добавлен в том же порядке.

Но функция _parse_ не работает, я получаю сообщение об ошибке:

ValueError: Shape должен иметь ранг 0, но это ранг1 для 'file_reader' (op: 'ReadFile') с формами ввода: [?].

Я погуглил ошибку, но у меня ничего не работает.

Если я не используюФункция map, я просто получаю путь к изображениям (которые хранятся в image_list), поэтому я думаю, что мне нужна функция map для чтения изображений, но я не могу заставить ее работать.

Спасиботы в деле заранее.

РЕДАКТИРОВАТЬ:

    def read_data():
        image_list = []
        label_list = []
        label_map_dict = {}
        count_label = 0

        for class_name in os.listdir(base_path):
            class_path = os.path.join(base_path, class_name)
            label_map_dict[class_name]=count_label

            for image_name in os.listdir(class_path):
                image_path = os.path.join(class_path, image_name)

                label_list.append(count_label)
                image_list.append(image_path)

            count_label += 1

1 Ответ

0 голосов
/ 11 февраля 2019

Ошибка в этой строке dataset = dataset.repeat(epochs).batch(batch_size) Ваш конвейер добавляет размер пакета в качестве измерения для ввода.

Вам нужно пакетировать ваш набор данных после функции карты, как это

    dataset = tf.data.Dataset.from_tensor_slices((tf.constant(image_list), tf.constant(label_list)))
    dataset = dataset.shuffle(len(image_list))
    dataset = dataset.repeat(epochs)
    dataset = dataset.map(_parse_function).batch(batch_size)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...