当前位置: 首页 > 知识库问答 >
问题:

tf.data.数据集如何动态传递tf.io.FixedLenFeature的大小

王飞虎
2023-03-14

我们有tfrecord文件,其中每个tfrecord文件都包含一个示例,但其中的功能包含一个值列表。我们正在使用tf。数据数据集以以下方式:

n_rows_per_record_file = 100

def parse_tfrecord_to_example(record_bytes):
    col_map = {
    "my_col": tf.io.FixedLenFeature(
        shape=n_rows_per_record_file, dtype=tf.int64
    )}

ds = (
    tf.data.TFRecordDataset(file_paths)
    .map(parse_tfrecord_to_example)
    )

我们希望查找给定文件路径的行数,而不是对n_rows_per_record_file使用固定常量。

关于如何实现这一点有什么想法吗?

我们试着用这样的东西

def get_shape(filepath):
    return filepath, shapes[filepath]
ds = (
    tf.data.list_files(file_paths)
    .map(get_shape)
    .map(
        lambda f, shape: tf.data.TFRecordDataset(f).map(
           lambda shape: parse_tfrecord_to_example(shape)
       )
    )

但这失败了,因为tf。直到需要时,数据才会急切地评估文件路径(即,它仍然是一个tf.Tensor)

共有1个答案

袁高明
2023-03-14

您提出的解决方案看起来不错,是的,您的文件路径将是一个张量,但在您的情况下,您不能使用一些外部python对象,如shapes。如果您使用tf。Data不幸的是,您需要学习许多Tensorflow特定的函数来完成“基本”python任务。例如,在您的情况下,可能需要拆分文件名,然后将字符串转换为int。是的,一切都是张量。

你在评论中也提到了广播<代码>tf。数据不用于广播<代码>tf。数据用于逐个记录快速加载内存中的数据。所以,无论何时,只要你想应用矢量化或广播,你就应该使用其他东西。第一个选项是,在将数据保存到TFRecords之前,使用您想要的任何工具准备数据:pandas、dask、spark等。第二个选项是,使用一种tf查找实现动态丰富数据。例如,如果您有一个带有形状的字典,并且希望根据某个类别或id将此功能添加到每个记录中,请将该数据加载到StaticHashTable并添加预处理查找步骤。注意:这些丰富的数据必须非常小,因为您必须在内存中,如果您使用GPU,甚至可能是GPU内存。

下面是一个查找表的示例:

dataset = tf.data.Dataset.from_tensor_slices([range(10)])
keys_tensor = tf.constant(range(10))
vals_tensor = tf.constant(range(100, 110))
lookup = tf.lookup.StaticHashTable(
    tf.lookup.KeyValueTensorInitializer(keys_tensor, vals_tensor), default_value=-1)

def map_numbers(v):
    return lookup[v]

for element in dataset.map(map_numbers):
    print(element)

tf.Tensor([100 101 102 103 104 105 106 107 108 109], shape=(10,), dtype=int32)
 类似资料:
  • 问题内容: 我需要使用jquery动态地将数据传递到我的选择列表。我在控制台中看到了该数据,但列表为空。您能帮我找到解决方案吗? 我的选择清单 问题答案: 将您的JavaScript代码更改为此

  • 我尝试使用以下代码来完成此操作: 我得到以下输出: sim(测试,“测试”)

  • 问题内容: 我是Spring的新手。 这是bean注册的代码: 这是我的bean类: 这是我执行操作的主要方法: 现在,我想用参数调用此构造函数,并且这些参数是在我的主要方法中动态生成的。这就是我想动态传递- 而不是像文件中声明的那样静态传递的意思。 问题答案: 请看一下构造函数注入。 此外,请查看IntializingBean和BeanPostProcessor,以了解Springbean的其他

  • 我不熟悉Spring。 这是bean注册的代码: 这是我的豆子课: 这是我执行动作的主要方法: 现在我想用参数调用这个构造函数,这些参数是在我的主要方法中动态生成的。这就是我想动态传递的意思——而不是静态传递,就像我的文件中声明的那样。

  • nuxtjs 我要这样传递动态参数 http://localhost:3000/product/app/1 http://localhost:3000/product/app/2 http://localhost:3000/product/app/3 发现生成了很多文件,但大家都知道json是动态的 如何解决?

  • 使用角(5)我显示电子邮件的列表 我的问题是在“名称”属性中。我希望索引“i”作为一个数字传递,尽管它传递i本身(字母)。正确传递索引的方法是什么? 我尝试了这样的东西: 但显然没有成功。 任何帮助都是受欢迎的。