【发布时间】:2017-12-10 03:17:27
【问题描述】:
我正在尝试使用指导图对双边网格进行上采样(遵循this 研究论文)。
我创建了一个 Keras 层,它接受 3 个输入并将提供上采样图像:
- 形状的双边网格(无、16、16、96)
- GuidanceMaps of shape(无、256、256)
- 形状的输入图像(无、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)
问题是我们无法在批量大小上运行循环,因为它是未知的。
我尝试了以下方法,但没有解决问题:
- 最初我以为 lambda 层会一个一个地提供输入,但它提供了完整的批次。
- 然后我在 python 中尝试了 zip(),但它不能在张量上工作。 [我需要 zip() 之类的东西]
- 我尝试了 tf.stack(),但它需要张量的所有形状和等级完全相同(这在我的情况下是不可能的)
PS:这是我的第一个 StackOverflow 问题。如果没有以理想的方式询问,我深表歉意。
【问题讨论】:
-
有没有办法
performPixelwiseComputation可以使用 tensorflow 操作一次在整个批次上使用?否则,在我看来,这似乎是编写自己的内核并设计整个批次所需的任何操作的好机会。 -
@Sunreef 不,tensorflow 默认操作对我不起作用。 pielwiseComputation 需要从每个输入访问每个像素,并且由于它们具有不同的维度,我需要编写自己的计算。我对编写自己的内核没有任何想法或经验。我在 C++ 中看到了一些创建其内核的代码,但除了跟踪代码流之外,我无法理解其工作原理。您能否将我转发到一些链接,我可以在其中找到有关此的更多信息。另外,我们可以用 Keras 或 tensorflow 编写内核,还是必须用 C++ 编写内核?
-
您是否要求函数不知道批量大小?可以使用 32 左右的固定批量大小吗?
-
我希望它是未知的并在运行时决定,但出于测试目的,我可以尝试使用固定的批量大小。你能告诉我如何修复批量大小,因为我认为它是由 keras 内部处理的,我们对此没有控制权。
-
@AparSinghal 为了在 C++ 中创建自己的操作,我发现 Tensorflow tutorial 提供了足够的信息。
标签: tensorflow deep-learning keras