在张量流中处理一批不同形状的张量

时间:2020-09-23 16:54:00

标签: python tensorflow image-processing mapping gpu

假设我们有一批图像为(batches, height, width, channels)的4D张量。并假设我们有一些图像转换函数f0(img...)f1(img...) ...,每个函数仅处理一个表示为3D张量的图像(不是批处理)。同样,此功能的输出张量在形状上可能与输入张量不同,即使某些功能可能会产生一个以上的张量,并且除图像外,功能可能还会有其他参数。

还假设我们拥有non-eager执行模式,这意味着我们首先要在.pb文件中建立一个图,然后为了提​​高效率,大多数情况下在GPU上执行该图。

就像TF一样,第一个batches尺寸可能是未知的,这由值None表示。仅在输入数据进行图形评估时才知道此尺寸的实际大小(用户可以尝试喂入不同大小的批次)。

我们获得了一系列必需的图像转换,这些图像转换指定为带有附加参数的函数列表。任务是通过这些功能以某种方式处理输入的图像批处理。除了以最有效的方式进行操作之外,还不允许使用tf.py_function,这意味着如果所有转换功能都仅在GPU端实现并运行,则不允许中间结果返回并返回。从gpu到cpu作为py_function的输入。

主要困难是由于未知批次数(等于None)。因此,我们不能使用python循环通过函数处理每个图像。当然,我们可以确定一些最大可能的批处理大小,并创建一个达到此最大大小的循环,并且对于没有输入的循环迭代,我们可以有条件地不处理此输入并传递空张量。每个阶段的输入和输出列表长度可能不同的另一个问题是,例如当图像变形将输入图像分割成3-4个不等长的张量或在不同窗口进行多幅裁剪时。

我认为正确的方法是以某种方式使用tf.while_loop,但是我还不了解它的工作原理,以及在每个阶段具有不同形状的可能长度张量的情况下如何应用它。

tf.map_fn非常适合所有输入都具有相同形状和输出的情况。然后我们可以沿变换路径传递单个4D张量。但是事实并非如此,输入的形状和输出也可以不同。

也许有类似python的list的东西,但在TF方面呢?含义列表可保持不同形状的张量,但仅限于TF,不会像python list那样离开GPU。如果存在这样的列表并且与tf.map_fn类似,那么我们可以通过应用一个函数使用此映射来处理不同形状的张量列表。它可以部分解决大部分任务,至少可以肯定地帮助我。

0 个答案:

没有答案
相关问题