【问题标题】:How to enable a Convolutional NN to take variable size input?如何使卷积神经网络能够接受可变大小的输入?
【发布时间】:2017-07-30 02:01:03
【问题描述】:

所以,我看到机器学习中的许多第一个 CNN 示例都使用 MNIST 数据集。每个图像都是 28x28 的,所以我们事先知道输入的形状。对于可变大小的输入,这将如何完成,假设您有一些 56x56 和一些 28x28 的图像。

如果可能的话,我正在寻找与语言和框架无关的答案,或者在 tensorflow 术语中更可取

【问题讨论】:

    标签: machine-learning tensorflow


    【解决方案1】:

    在某些情况下,适当调整图像大小(例如保持纵横比)就足够了。但是,这会引入失真,如果这是有害的,另一种解决方案是使用空间金字塔池 (SPP)。不同图像大小的问题在于它会产生不同大小的层,例如,取某些网络的n-th 层的特征,最终可以得到大小为128*fw*fh 的特征图,其中fw 和@987654326 @ 因输入示例的大小而异。为了缓解这个问题,SPP 所做的就是将这个可变大小的特征图转换为固定长度的特征向量。它通过将图像分成相等的块并对它们执行最大池化来在不同的尺度上运行。我认为this paper 在解释它方面做得很好。示例应用可见here

    作为一个简单的解释,假设您有一个大小为k*fw*fh 的特征图。您可以将其视为k 形式的地图

    X Y
    Z T
    

    每个块的大小为fw/2*fh/2。现在,分别对这些块中的每一个执行最大池化会给您一个大小为4 的向量,因此,您可以将k*fw*fh 映射大致描述为k*4 固定大小的特征向量。

    现在,将这个固定大小的向量称为w 并将其放在一边,这一次,将k*fw*fh 特征图视为k 特征平面,写为

     A B C D
     E F G H
     I J K L
     M N O P
    

    再一次,对每个块分别执行最大池化。因此,使用它,您可以获得更细粒度的表示,作为长度为 v=k*16 的向量。

    现在,连接两个向量 u=[v;w] 为您提供了一个固定大小的表示。这正是 2 级 SPP 所做的事情(当然,您可以更改分区的数量/大小)。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      当您使用 CNN 进行分类任务时,您的网络有两个部分:

      1. 特征生成器。部分通过大小为WI x HICI 通道的图像生成大小为WF x HFCF 通道的特征图。图像大小和特征图大小之间的关系取决于 NN 的结构(例如,池化层的数量和它们的步幅)。

      2. 分类器。部分解决了将带有WF*HF*CF 组件的向量分类为类的任务。

      您可以将不同大小的图像放入特征生成器,得到不同大小的特征图。但是分类器只能在一些固定长度的向量上进行训练。因此,您显然针对某些固定大小的图像训练您的网络。如果您有不同大小的图像,您可以将其调整为输入网络的大小,或裁剪图像的某些部分。

      文章中描述的另一种方式

      K. He, X. Zhang, S. Ren, J. Sun,“用于视觉识别的深度卷积网络中的空间金字塔池化”,arXiv:1406.47292014

      作者提供了空间金字塔池化,它解决了 CNN 输入上不同图像的问题。但是我不确定tensorflow中是否存在空间金字塔池化层。

      【讨论】:

      • 那么在生成特征图之前应该调整图像的大小/裁剪,还是应该调整大小的特征图?
      • 最常见的方法是裁剪/调整图像大小。但我用另一种方法给了这篇文章的链接。我提前使用简单的方法和裁剪/调整图像,然后再将它放到网络上。
      猜你喜欢
      • 2016-12-02
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 2019-03-30
      • 2016-10-20
      • 2017-12-15
      • 2017-07-30
      • 2017-08-31
      相关资源
      最近更新 更多