当传递给tf.train.batch时,看起来必须严格定义元素的形状,否则如果存在形状为All shapes must be fully defined
的张量,它会抱怨Dimension(None)
。那么,如何训练不同大小的图像呢?
答案 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.where
或tf.boolean_mask
提取ROI。
在某些情况下,这种培训确实是有益的,因为您可以将网络的大小输入合并在一起,而小的输入不会受到大的填充环境的损失的影响。