【发布时间】:2020-11-30 17:53:02
【问题描述】:
我有一个功能是字节字符串列表,例如
data = [b"lksjdflksdjfdlk", b"owiueroiewuroi.skjdf", b"oweiureoiwlkapq"]
这里是创建、写出和读回 + 解析 tfrecord 的示例代码。
>>> data = [b"lksjdflksdjfdlk", b"owiueroiewuroi.skjdf", b"oweiureoiwlkapq"]
>>> feature = tf.train.Feature(bytes_list=tf.train.BytesList(value=data))
>>> feature
{'raws': bytes_list {
value: "lksjdflksdjfdlk"
value: "owiueroiewuroi.skjdf"
value: "oweiureoiwlkapq"
}}
>>> example = tf.train.Example(features=features).SerializeToString()
>>> with tf.io.TFRecordWriter("/tmp/out.tfrecord") as writer:
writer.write(example)
>>> # Now read it back in and parse thee example
>>> feature_desc = {'raws': tf.io.FixedLenFeature([], tf.string)}
>>> def _parse(example):
return tf.io.parse_single_example(example, feature_desc)
>>> ds = tf.data.TFRecordDataset(["/tmp/out.tfrecord"])
>>> parsed = ds.map(_parse)
>>> @tf.function
def upper(x):
x['raws'] = [s.upper() for s in x['raws']]
>>> parsed.map(upper)
这会导致以下错误:
OperatorNotAllowedInGraphError: in user code:
<ipython-input-33-be19a774366f>:3 upper *
x['raws'] = [s.upper() for s in x['raws']]
/data/jkyle/venv/lib/python3.6/site-packages/tensorflow/python/framework/ops.py:503 __iter__
self._disallow_iteration()
/data/jkyle/venv/lib/python3.6/site-packages/tensorflow/python/framework/ops.py:496 _disallow_iteration
self._disallow_when_autograph_enabled("iterating over `tf.Tensor`")
/data/jkyle/venv/lib/python3.6/site-packages/tensorflow/python/framework/ops.py:474 _disallow_when_autograph_enabled
" indicate you are trying to use an unsupported feature.".format(task))
OperatorNotAllowedInGraphError: iterating over `tf.Tensor` is not allowed: AutoGraph did convert this function. This might indicate you are trying to use an unsupported feature.
对于完整的上下文,列表是原生不支持的原始图像格式的字节字符串。每个原始图像都是一个帧。我需要遍历列表,转换为 jpeg,然后将它们堆叠成一个三维数组。转换需要由 OpenCV 完成。所以 raw -> jpeg -> numpy 矩阵,例如
输入:[b'raw1', b'raw2', b'raw3'] 输出:形状为(1920,1080,3)的图像数组
但是,当然,在我弄清楚如何迭代列表之前,不能执行任何这些操作。
【问题讨论】:
-
你应该先将其转换为图像文件,然后在tensorflow中将图像文件转换为numpy
-
通过这种方式,我们可以让张量流在初始转换期间处理批处理和并行化。
-
我们在这里缺少太多细节,或者您的问题缺乏重点。如果您只想知道如何迭代张量,请查看
tf.py_function和tf.numpy_function。如果您想实际解码原始格式,我们需要知道可以对该格式做出什么样的假设。例如,data数组中的所有字节字符串的长度是否相同?最后,您应该修复您的 TfRecords 创建示例,它没有运行。 -
可以将列表理解替换为传递 lambda 函数的 tf.map_fn 吗?
标签: python tensorflow tensorflow2.0 tensorflow-datasets