Tensorflow - извлечение строки из Tensor - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь следовать части "Load using tf.data" этого урока . В этом уроке они могут работать только со строковыми тензорами, однако мне нужно извлечь строковое представление имени файла, так как мне нужно искать дополнительные данные из словаря. Я не могу извлечь строковую часть Тензорного. Я почти уверен, что атрибут .name в Tensor должен возвращать строку, но я продолжаю получать сообщение об ошибке, говорящее KeyError: 'strided_slice_1:0', так что каким-то образом срезание делает что-то странное?

Я загружаю набор данных, используя:

dataset_list = tf.data.Dataset.list_files(str(DATASET_DIR / "data/*"))

, а затем обработайте его, используя:

def process(t):
    return dataset.process_image_path(t, param_data, param_min_max)

dataset_labeled = dataset_list.map(
    process, 
    num_parallel_calls=AUTOTUNE)

, где param_data и param_min_max - это два загруженных словаря, которые содержат дополнительные данные, необходимые для создайте метку.

Это три функции, которые я использую для обработки данных Тензор (из моего dataset.py):

def process_image_path(image_path, param_data_file, param_max_min_file):
    label = path_to_label(image_path, param_data_file, param_max_min_file)
    img = tf.io.read_file(image_path)
    img = decode_img(img)
    return (img, label)


def decode_img(img):
    """Converts an image to a 3D uint8 tensor"""
    img = tf.image.decode_jpeg(img, channels=3)
    img = tf.image.convert_image_dtype(img, tf.float32)
    return img


def path_to_label(image_path, param_data_file, param_max_min_file):
    """Returns the NORMALIZED label (set of parameter values) of an image."""
    parts = tf.strings.split(image_path, os.path.sep)
    filename = parts[-1]  # Extract filename with extension
    filename = tf.strings.split(filename, ".")[0].name  # Extract filename
    param_data = param_data_file[filename]  # ERROR! .name above doesn't seem to return just the filename
    P = len(param_max_min_file)

    label = np.zeros(P)

    i = 0
    while i < P:
        param = param_max_min_file[i]
        umin = param["user_min"]
        umax = param["user_max"]
        sub_index = param["sub_index"]
        identifier = param["identifier"]
        node = param["node_name"]
        value = param_data[node][identifier]

        label[i] = _normalize(value[sub_index])
        i += 1

    return label

Я проверил, что filename = tf.strings.split(filename, ".")[0] в path_to_label() возвращает правильный Тензор, но мне нужно это как строка. Все это также сложно отладить, так как я не могу получить доступ к атрибутам при отладке (я получаю сообщения об ошибках AttributeError: Tensor.name is meaningless when eager execution is enabled.).

1 Ответ

1 голос
/ 13 февраля 2020

Поле name - это имя самого тензора, а не его содержимое.

Для регулярного поиска в словаре python оберните свою функцию синтаксического анализа в tf.py_func.

import tensorflow as tf
tf.enable_eager_execution()

d = {"a": 1, "b": 3, "c": 10}
dataset = tf.data.Dataset.from_tensor_slices(["a", "b", "c"])

def parse(s):
  return s, d[s]
dataset = dataset.map(lambda s: tf.py_func(parse, [s], (tf.string, tf.int64)))

for element in dataset:
  print(element[1].numpy()) # prints 1, 3, 10
...