Я пытаюсь следовать части "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.
).