Проверьте, существует ли путь к файлу, используя tf.io.gfile.exists из Tensorflow - PullRequest
2 голосов
/ 18 марта 2020

В моем конвейере Tensorflow я определил функцию load(), которая требуется для проверки, существует ли указанный файл изображения c по указанному пути. Это выглядит примерно так:

import tensorflow as tf

def load(image_file):

  if tf.io.gfile.exists(image_file):
    input_image = tf.io.read_file(image_file)
    # do things with input_image

  return input_image

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

train_dataset = tf.data.Dataset.list_files(IMAGE_PATH)
train_dataset = train_dataset.map(load,
                              num_parallel_calls=tf.data.experimental.AUTOTUNE)


#...
TypeError: in converted code:

<ipython-input-22-bdfc518ba578>:13 load  *
    if tf.io.gfile.exists(image_file):
/home/bdavid/.conda/envs/DL_env/lib/python3.7/site-packages/tensorflow_core/python/lib/io/file_io.py:280 file_exists_v2
    pywrap_tensorflow.FileExists(compat.as_bytes(path))
/home/bdavid/.conda/envs/DL_env/lib/python3.7/site-packages/tensorflow_core/python/util/compat.py:87 as_bytes
    (bytes_or_text,))

TypeError: Expected binary or unicode string, got <tf.Tensor 'args_0:0' shape=() dtype=string>

Проблема, по-видимому, заключается в оценке image_file в EagerMode, поскольку tf.io.gfile.exists требует строку в качестве ввода, а не тензор типа строки.

Я уже пытался вернуть строковое значение, используя image_file.numpy(), что привело к AttributeError: 'Tensor' object has no attribute 'numpy'.

Я также попытался обернуть свою функцию в tf.py_function(), как это было предложено в связанный вопрос , который приводит к тому же TypeError во время выполнения. Если использовать os.path.exists вместо tf.io.gfile.exists, то, конечно же, выдает ту же ошибку.

Любое предложение об обходном пути или правильном способе решения этой проблемы будет высоко оценено!

1 Ответ

1 голос
/ 20 марта 2020

Я создал обходной путь, используя map_fn и match_files , которые я выполнил без ошибок.

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

def load(image_file):
  if tf.io.gfile.exists(image_file.numpy()):
    input_image = tf.io.read_file(image_file)

  return input_image

IMAGE_PATH = '/content/images'
# train_dataset = tf.data.Dataset.list_files(IMAGE_PATH)
tf_matching = tf.io.matching_files('/content/images/*.png')
# train_dataset = train_dataset.map(load, num_parallel_calls=tf.data.experimental.AUTOTUNE)
train_dataset = tf.map_fn(load, tf_matching)

Я также включил закомментированный код для вашего сравнения.

Вы можете прочитать больше об этих функциях, которые я использовал в этих ссылках.
Ссылка для Функция карты TensorFlow в этой ссылке .
Ссылка для файлов соответствия TensorFlow по этой ссылке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...