У меня есть очень большая база данных изображений локально, с распределением данных, как каждая папка содержит изображения одного класса.
Я хотел бы использовать 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