tensorflow:批量可变大小的图像

时间:2017-07-17 14:59:48

标签: tensorflow neural-network conv-neural-network training-data

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

3 个答案:

答案 0 :(得分:6)

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

  

dynamic_pad:布尔值。允许输入形状中的可变尺寸。给定的尺寸在出列时填充,以便批次中的张量具有相同的形状。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

我看到这是一个非常古老的问题,但是如果有人要搜索如何仍然可以批量使用可变大小图像,我可以告诉我我对图像到图像卷积网络所做的工作(推断),接受过可变图像大小和批次1的培训。为什么:当我尝试使用填充来批量处理图像时,结果变得更糟,因为信号在网络内部“传播”并开始影响它的卷积金字塔。

因此,当您拥有源代码并且可以将权重手动加载到卷积层中时,我所做的就是可能的。我以以下方式修改了网络:与一批零填充的图像一起,我添加了额外的占位符,该占位符接收了一批二进制掩码,其中1表示实际数据在补丁上,0表示填充。然后,我将信号乘以网络内部每个卷积层之后的这些掩码 ,以对抗“扩散”。乘法并不是昂贵的运算,因此它不会对性能产生太大影响。

结果还没有变形,但是仍然有一些边界伪像,因此我通过在输入图像周围添加小的(2px)对称填充(CNN的所有层的内核大小为3)来进一步修改了此方法,在传播过程中使用略大(+ [2px,2px])的蒙版。

一个人也可以将相同的方法应用于培训。然后,需要某种“掩盖”的损失,其中仅每个补丁上的ROI用于计算损失。例如,对于L1 / L2损失,您可以计算生成的图像和标签图像之间的差异图像,并在求和之前应用蒙版。更复杂的损失可能涉及拆堆或迭代批处理,以及使用tf.wheretf.boolean_mask提取ROI。

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