В моем конвейере 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
, то, конечно же, выдает ту же ошибку.
Любое предложение об обходном пути или правильном способе решения этой проблемы будет высоко оценено!