Tensorflow - 从张量中提取字符串

3
我将尝试遵循此教程中的“使用tf.data加载”部分。在教程中,他们只需要处理字符串张量,但是我需要提取文件名的字符串表示形式,因为我需要从字典中查找额外数据。我似乎无法提取张量的字符串部分。我相当确定张量的.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_dataparam_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在启用急切执行时是无意义的。)。

1个回答

3

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

谢谢,但我决定应该将所有内容保留为张量。所以现在我将值输出为CSV文件!我可以使用tf.data.experimental.CsvDataset读取这个文件,然后将其与图像数据集进行压缩,并将它们映射为元组。 - Zorobay
2
tf版本2.7.0中,tf.py_func必须更改为tf.py_function - nipun
除了@nipun所说的之外,你不需要第二行,因为在Tensorflow 2中,默认情况下已启用了急切执行。 - kevininhe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接