如何训练图像,当它们有不同的大小?

时间:2017-01-28 07:58:17

标签: tensorflow neural-network classification deep-learning

我正在尝试训练我的模型对图像进行分类。 我遇到的问题是,它们有不同的尺寸。是否有可能在没有调整大小的情况下训练这些图像。

2 个答案:

答案 0 :(得分:124)

您没有说出您正在谈论的架构。既然你说你想要对图像进行分类,我假设它是一个部分卷积的,部分完全连接的网络,如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)

他们完全了解它并且无论如何都要这样做。

根据您想要或需要走多远,实际上有一篇论文here称为用于视觉识别的深度卷积网络中的空间金字塔池,它通过处理来处理任意大小的输入他们以一种非常特殊的方式。

答案 1 :(得分:8)

尝试制作空间金字塔合并图层。然后将它放在最后一个卷积层之后,这样FC层总是得到恒定的维向量作为输入。在训练期间,使用特定图像大小训练来自整个数据集的图像一个时期。然后,对于下一个纪元,切换到不同的图像大小并继续训练。