Создайте набор данных TensorFlow для CNN из локального набора данных

#python #tensorflow #dataset #load #local

#python #tensorflow #набор данных #загрузить #Местные новости

Вопрос:

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

  • каталог SELECTION содержит все изображения с меткой = выделение;
  • каталог NEUTRAL содержит все изображения с меткой = нейтральный.

Мне нужно загрузить все эти изображения в набор данных TensorFlow для изменения набора данных MNIST в этом руководстве.

Я пытался следовать этому руководству, и это выглядит хорошо, но есть некоторые проблемы, которые я не знаю, как исправить. Следуя руководству, я дошел до этого:

     from __future__ import absolute_import, division, print_function
    import os
    import pathlib
    import IPython.display as display
    import tensorflow as tf
    import numpy as np
    import matplotlib.pyplot as plt
    np.set_printoptions(threshold=np.nan)

    tf.enable_eager_execution()
    tf.__version__
    os.system('clear')

    #### some tries for the SELECTION dataset ####

    data_root = pathlib.Path('/Users/matteo/Desktop/DATASET_X/SELECTION/TRAIN_IMG')

    all_image_paths = []
    all_image_labels = []
    for item in data_root.iterdir():
        item_tmp = str(item)
        if 'selection.png' in item_tmp:
            all_image_paths.append(str(item))
            all_image_labels.append(0)

    image_count = len(all_image_paths)
    label_names = ['selection', 'neutral']
    label_to_index = dict((name, index) for index, name in enumerate(label_names))
    img_path = all_image_paths[0]
    img_raw = tf.read_file(img_path)

    img_tensor = tf.image.decode_png(
        contents=img_raw,
        channels=1
    )
    print(img_tensor.numpy().min())
    print(img_tensor.numpy().max())
    #### it works fine till here ####

    #### trying to make a function ####
    #### problems from here ####

    def load_and_decode_image(path):
        print('[LOG:load_and_decode_image]: '   str(path))
        image = tf.read_file(path)

        image = tf.image.decode_png(
            contents=image,
            channels=3
        )

        return image


    image_path = all_image_paths[0]
    label = all_image_labels[0]

    image = load_and_decode_image(image_path)
    print('[LOG:image.shape]: '   str(image.shape))

    path_ds = tf.data.Dataset.from_tensor_slices(all_image_paths)

    print('shape: ', repr(path_ds.output_shapes))
    print('type: ', path_ds.output_types)
    print()
    print('[LOG:path_ds]:'   str(path_ds))
  

Если я загружаю только один элемент, это работает, но когда я пытаюсь сделать:

 path_ds = tf.data.Dataset.from_tensor_slices(all_image_paths)
  

если я печатаю, path_ds.shape он возвращает shape: TensorShape([]) , поэтому кажется, что это не работает. Если я попытаюсь продолжить следовать руководству с этим блоком

 image_ds = path_ds.map(load_and_decode_image, num_parallel_calls=AUTOTUNE)
plt.figure(figsize=(8, 8))
for n, image in enumerate(image_ds.take(4)):
    print('[LOG:n, image]: '   str(n)   ', '   str(image))
    plt.subplot(2, 2, n 1)
    plt.imshow(image)
    plt.grid(False)
    plt.xticks([])
    plt.yticks([])
    plt.xlabel(' selection'.encode('utf-8'))
    plt.title(label_names[label].title())
plt.show()
  

это выдает мне следующую ошибку:

 It's not possible open ' < string >': The file was not found (file: // /Users/matteo/Documents/GitHub/Cnn_Genetic/cnn_genetic/<string > ).
  

но проблема в том, что я не знаю, что это за файл и почему он отправляется на его поиск. Я не хочу выводить на экран свои изображения, но я хочу понять, почему это не работает. Если я скопирую / вставлю код руководства, у меня возникнет та же проблема, поэтому я думаю, что есть проблема с новой версией tf.

Итак …. если кто-нибудь может сказать мне, где я ошибаюсь, я был бы очень благодарен. Спасибо за ваше время.

Комментарии:

1. Как указано в вашем сообщении об ошибке, один из файлов отсутствует. Запустите цикл for внутри сеанса, чтобы выяснить

2. Я думаю, что программа отправляется на поиск файла, который не существует, только потому, что он считывает неправильное значение. Файл с именем <string> слишком странный, чтобы быть реальным. Для меня проблема в том, что если я печатаю, path_ds.shape он возвращает shape: TensorShape([]) .

Ответ №1:

Ваша проблема в том, что path_ds должны быть путями к изображениям в виде строк, но вы пытаетесь преобразовать их в список тензоров.

Итак, чтобы получить тензоры, вам нужно только:

 image_ds = all_image_paths.map(load_and_decode_image, num_parallel_calls=AUTOTUNE)