Как прикрепить или получить имена файлов из MapDataset из image_dataset_from_directory() в Keras?

#python #tensorflow #keras #tensorflow-datasets #tf.keras

#python #tensorflow #keras #tensorflow-datasets #tf.keras

Вопрос:

Я обучаю сверточный автоэнкодер, и у меня есть этот код для загрузки данных (изображений):

 train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    'path/to/images',
    image_size=image_size
)
normalization_layer = layers.experimental.preprocessing.Rescaling(1./255)

def adjust_inputs(images, labels):
    return normalization_layer(images), normalization_layer(images)

normalized_train_ds = train_ds.map(adjust_inputs)
 

Поскольку мне не нужны метки классов, а сами изображения как Y, я сопоставляю функцию adjust_inputs с dataset . Но теперь, когда я пытаюсь получить доступ к атрибуту filenames , я получаю сообщение об ошибке: AttributeError: 'MapDataset' object has no attribute 'filenames' . Это логично, потому что MapDataset не является Dataset .

Как мне прикрепить или получить имена файлов загруженных изображений, которые находятся в моем наборе данных?

Я действительно удивлен, что для этого нет более простого интерфейса, это выглядит довольно распространенной вещью.

Ответ №1:

На всякий случай, если вы хотите добавить filepaths как часть вашего набора данных:

 import tensorflow as tf
import pathlib
import matplotlib.pyplot as plt

dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
data_dir = pathlib.Path(data_dir)

batch_size = 32
train_ds = tf.keras.utils.image_dataset_from_directory(data_dir, shuffle=False, batch_size=batch_size)

normalization_layer = tf.keras.layers.Rescaling(1./255)
def change_inputs(images, labels, paths):
  x = normalization_layer(images)
  return x, x, tf.constant(paths)

normalized_ds = train_ds.map(lambda images, labels: change_inputs(images, labels, paths=train_ds.file_paths))

images, images, paths = next(iter(normalized_ds.take(1)))

image = images[0]
path = paths[0]
print(path)
plt.imshow(image.numpy())
 
 Found 3670 files belonging to 5 classes.
tf.Tensor(b'/root/.keras/datasets/flower_photos/daisy/100080576_f52e8ee070_n.jpg', shape=(), dtype=string)
<matplotlib.image.AxesImage at 0x7f9b113d1a10>
 

введите описание изображения здесь

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

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

1. Как мне передать это в мою модель? Эта идея пришла мне в голову, но это будет иметь три значения в кортеже, и я не думаю, что функция model.fit() будет довольна этим.

2. Верно, но если вы используете пользовательский цикл обучения , вы сможете контролировать, какие данные вы передаете в свою модель.

Ответ №2:

Я сделал это следующим образом.

После обучения моей модели я просто перезагрузил все изображения, на этот раз с опцией shuffle=False , и прогнал их через свою модель для извлечения функций. Поскольку shuffle отключен, порядок изображений и путей к файлам одинаковый. Таким образом, изображение с индексом 0 с соответствующими функциями с индексом 0 имеет свой путь к файлу с индексом 0.