我正在尝试遵循this tutorial的“使用tf.data加载”部分。在教程中,仅使用字符串Tensors可以使他们摆脱困境,但是,我需要提取文件名的字符串表示形式,因为我需要从字典中查找额外的数据。我似乎无法提取张量的字符串部分。我很确定Tensor的.name
属性应该返回字符串,但是我不断收到一条错误消息,说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()
确实返回了正确的Tensor,但是我需要它作为字符串。事实证明,整个过程也很难调试,因为调试时我无法访问属性(出现错误提示AttributeError: Tensor.name is meaningless when eager execution is enabled.
)。
我正在尝试遵循本教程的“使用tf.data加载”部分。在本教程中,仅使用字符串Tensors可以使他们脱身,但是,我需要提取...
name
字段是张量本身的名称,而不是张量的内容。