1

我正在使用 TensorFlow Alpha 2.0。

我有我正在读取的 TFRecords 文件,每个文件都包含一个短视频剪辑,每个帧都编码为 jpeg 字节字符串以节省空间:

{
  'numframes': tf.io.FixedLenFeature([], tf.int64),
  'frames': tf.io.VarLenFeature(tf.string)
}

我的 tf.data.Dataset 管道中有一个映射步骤,可以成功解析每个示例:

def parse_tfrecord(p):
    return tf.io.parse_single_example(p, example_schema)

我的下一步是从 from 中读取帧数并在每个帧上numframes运行 tf.io.decode_jpeg 函数:frames.values[i]irange(numframes)

def parse_jpegs(p):
    numframes = p['numframes']
    return tf.map_fn(tf.io.decode_jpeg, [p['frames'].values[i] for i in range(numframes)])

我的数据集管道完整性:

def dataset():
    dataset = tf.data.Dataset.list_files("*.tfrecord")
    dataset = tf.data.TFRecordDataset(dataset)
    dataset = dataset.shuffle(1000).repeat()
    dataset = dataset.map(parse_tfrecord)
    dataset = dataset.map(parse_jpegs)
    return dataset

如果我排除该dataset.map(parse_jpegs)行,一切正常,向我展示类似{'frames': <tensorflow.python.framework.sparse_tensor.SparseTensor at 0x7f394c285518>, 'numframes': <tf.Tensor: id=2937, shape=(), dtype=int64, numpy=25>}

(请注意,numframes 张量包含 25 的 numpy 值。我可以使用 tensor.numpy() 方法在我的数据集管道之外获取它)

但是,在该映射函数中,我无法调用 .numpy() 从张量中获取值,并且在打印张量本身时,它尚未被评估或其他什么,因为还没有显示任何值。

在数据集管道中解析所有这些帧的最佳方法是什么?

TypeError: 'Tensor' object cannot be interpreted as an integer编辑:尝试获取 numframes 时,我收到的错误消息位于 parse_jpegs 中。这对我来说很有意义,为什么不能将张量解释为 int,但是如何从该张量中获取值以用于设置范围?

我遇到的问题归结为每个“帧”对象具有不同数量的帧。如果我可以应用tf.io.decode_jpeg到该列表中的每个帧而不需要单独记录帧数我会很好,但我在这里有“numframes”,所以我知道我的“frames”列表中需要解码多少帧。

编辑:我会向其他可能觉得有帮助的人提出这个问题,但我最终只是返回原始字节串并在数据集 API 之外的单独生成器函数中执行 decode_jpeg。这样会容易得多,即使它可能会更慢。

4

1 回答 1

0

在我的具体情况下,我最终发现 map_fn 试图将我的输入张量转换为相同类型的输出张量。在这种情况下,tf.io.decode_jpeg接收一个字符串(字节)并输出一个 uint8 数组,这会导致问题。另一个论点tf.map_fn(... output_type=tf.uint8)似乎已经为我解决了!自从我提出这个问题后,我继续修改它,可能不完全像写的那样,但我现在让它工作了。

于 2019-03-22T14:56:55.090 回答