我正在使用 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]
i
range(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。这样会容易得多,即使它可能会更慢。