我正在尝试训练对图像进行分类的模型。我的问题是,它们的尺寸不同。我应该如何格式化我的图像/或模型架构?
你没有说你在谈论什么架构。既然您说要对图像进行分类,我假设它是一个部分卷积、部分全连接的网络,如 AlexNet、GoogLeNet 等。一般而言,您的问题的答案取决于您使用的网络类型。
例如,如果您的网络仅包含卷积单元 - 也就是说,不包含完全连接的层 - 它可以不受输入图像大小的影响。这样的网络可以处理输入图像,然后返回另一个图像(“一直卷积”);您必须确保输出符合您的预期,因为您必须以某种方式确定损失,当然。
但是,如果您使用的是完全连接的单元,那么您就有麻烦了:在这里,您的网络必须使用固定数量的学习权重,因此不同的输入将需要不同数量的权重 - 这是不可能的。
如果这是您的问题,您可以执行以下操作:
不要关心压缩图像。无论如何,网络可能会学会理解内容。规模和视角对内容有什么意义吗?
将图像居中裁剪为特定大小。如果您担心丢失数据,请进行多次裁剪并使用它们来扩充您的输入数据,以便将原始图像拆分为 N 个大小正确的不同图像。
用纯色填充图像到平方大小,然后调整大小。
做一个组合。
填充选项可能会为网络的预测引入额外的错误源,因为网络可能(阅读:可能会)偏向于包含这种填充边界的图像。如果您需要一些想法,请查看 TensorFlow 文档的 Images 部分,其中有 resize_image_with_crop_or_pad
之类的部分可以帮助您完成更大的工作。
至于只是不关心挤压,here's 著名的 Inception 网络的一段预处理管道:
# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.
# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
distorted_image,
lambda x, method: tf.image.resize_images(x, [height, width], method=method),
num_cases=num_resize_cases)
他们完全意识到这一点,并且无论如何都会这样做。
根据您想要或需要走多远,实际上有一篇名为 Spatial Pyramid Pooling in Deep Convolution Networks for Visual Recognition 的论文here通过以非常特殊的方式处理任意大小的输入来处理它们方法。
尝试制作一个空间金字塔池化层。然后将其放在最后一个卷积层之后,以便 FC 层始终获得恒定维度向量作为输入。在训练期间,使用一个时期的特定图像大小训练来自整个数据集的图像。然后对于下一个 epoch,切换到不同的图像大小并继续训练。
不定期副业成功案例分享