【问题标题】:How to extract individual tensors from a batch of tensors?如何从一批张量中提取单个张量?
【发布时间】:2017-12-10 03:17:27
【问题描述】:

我正在尝试使用指导图对双边网格进行上采样(遵循this 研究论文)。

我创建了一个 Keras 层,它接受 3 个输入并将提供上采样图像:

  1. 形状的双边网格(无、16、16、96)
  2. GuidanceMaps of shape(无、256、256)
  3. 形状的输入图像(无、256、256、3)

这里,'None' 是批量大小,将在运行时决定。

我的动机是按如下方式执行像素计算:

def slicing(BilateralGrids, GuidanceMaps, InputImages):
  output_images = []
  for i in range(batchSize):
    grid = BilateralGrids[i]
    guide = GuidanceMaps[i]
    input_img = InputImages[i]

    output = performPixelwiseComputation(grid, guide, input_img)
    #output.shape => (256, 256, 3)
    output_images.append(output)

  return output_images #output_images.shape => (BatchSize, 256, 256, 3)

问题是我们无法在批量大小上运行循环,因为它是未知的。

我尝试了以下方法,但没有解决问题:

  1. 最初我以为 lambda 层会一个一个地提供输入,但它提供了完整的批次。
  2. 然后我在 python 中尝试了 zip(),但它不能在张量上工作。 [我需要 zip() 之类的东西]
  3. 我尝试了 tf.stack(),但它需要张量的所有形状和等级完全相同(这在我的情况下是不可能的)

PS:这是我的第一个 StackOverflow 问题。如果没有以理想的方式询问,我深表歉意。

【问题讨论】:

  • 有没有办法 performPixelwiseComputation 可以使用 tensorflow 操作一次在整个批次上使用?否则,在我看来,这似乎是编写自己的内核并设计整个批次所需的任何操作的好机会。
  • @Sunreef 不,tensorflow 默认操作对我不起作用。 pielwiseComputation 需要从每个输入访问每个像素,并且由于它们具有不同的维度,我需要编写自己的计算。我对编写自己的内核没有任何想法或经验。我在 C++ 中看到了一些创建其内核的代码,但除了跟踪代码流之外,我无法理解其工作原理。您能否将我转发到一些链接,我可以在其中找到有关此的更多信息。另外,我们可以用 Keras 或 tensorflow 编写内核,还是必须用 C++ 编写内核?
  • 您是否要求函数不知道批量大小?可以使用 32 左右的固定批量大小吗?
  • 我希望它是未知的并在运行时决定,但出于测试目的,我可以尝试使用固定的批量大小。你能告诉我如何修复批量大小,因为我认为它是由 keras 内部处理的,我们对此没有控制权。
  • @AparSinghal 为了在 C++ 中创建自己的操作,我发现 Tensorflow tutorial 提供了足够的信息。

标签: tensorflow deep-learning keras


【解决方案1】:

你需要的是tf.py_funclink

基本上,您需要编写一个自定义函数来满足您的需求。然而,tensorflow 是一个符号框架。这会阻止您在编写普通 python 时声明自定义操作。您可以通过 py_func 'hack' 访问、修改和执行您想要执行的任何操作。但是,如果您在 ff 网络中有任何决策算法,您可能还需要定义反向传播层和计算。此外,调试这种方法非常棘手和困难。

或者,尝试像 Chainer 这样的运行定义框架。这样,您就可以在键入时运行网络。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多