tensorflow:批量可变大小的图像

tensorflow: batches of variable-sized images

当传递到tf.train.batch时,看起来必须严格定义元素的形状,否则它会抱怨All shapes must be fully defined如果存在形状为Dimension(None)的张量.那么,如何训练不同尺寸的图像?

您可以在 tf.train.batch 的参数中设置 dynamic_pad=True

dynamic_pad: Boolean. Allow variable dimensions in input shapes. The given dimensions are padded upon dequeue so that tensors within a batch have the same shapes.

通常,图像会调整到一定数量的像素。

根据您的任务,您或许可以使用其他技术来处理不同大小的图像。例如,对于面部识别和 OCR,使用固定大小 window,然后将其移动到图像上。在其他任务上,具有池化层或递归神经网络的卷积神经网络可能会有帮助。

我看到这是一个很老的问题,但是如果有人会搜索可变大小的图像如何仍然可以批量使用,我可以告诉我我为图像到图像卷积网络做了什么(推理) ,这是针对可变图像大小和批次 1 进行训练的。为什么:当我尝试使用填充批量处理图像时,结果变得更糟,因为信号在 "spreading" 内部网络并开始影响其卷积金字塔。

所以当你有源代码并且可以手动将权重加载到卷积层时,我所做的是可能的。我按以下方式修改了网络:连同一批零填充图像,我添加了额外的占位符,它接收了一批二进制掩码,其中 1 表示实际数据在补丁上,0 表示应用了填充。然后我在网络内部的每个卷积层之后将信号乘以这些掩码,战斗"spreading"。乘法不是昂贵的操作,因此对性能影响不大。

结果还没有变形,但仍然有一些边界伪影,所以我通过在输入图像周围添加小的 (2px) 对称填充来进一步修改这种方法(我的 CNN 所有层的内核大小为 3),并通过使用稍微大一点的 (+[2px,2px]) 掩码在传播过程中保持它。

同样的方法也可以用于训练。然后需要某种 "masked" 损失,其中仅使用每个补丁的 ROI 来计算损失。例如,对于 L1/L2 损失,您可以计算生成图像和标签图像之间的差异图像,并在求和之前应用掩码。更复杂的损失可能涉及取消堆叠或迭代批处理,并使用 tf.wheretf.boolean_mask 提取 ROI。

这种训练在某些情况下确实是有益的,因为您可以为网络组合大小输入,而小输入不会受到大填充环境损失的影响。