Machine learning 如何使卷积神经网络接受可变大小的输入?

Machine learning 如何使卷积神经网络接受可变大小的输入?,machine-learning,tensorflow,Machine Learning,Tensorflow,所以,我看到机器学习中的许多第一个CNN示例都使用MNIST数据集。每个图像都是28x28,因此我们知道输入的形状。对于可变大小的输入,这将如何实现呢?假设您有一些56x56和28x28的图像 如果可能的话,我正在寻找一个语言和框架不可知的答案,或者用tensorflow术语更好当您使用CNN进行分类任务时,您的网络有两部分: 特征生成器。零件通过具有大小WI x HI和CI通道的图像,生成具有大小WF x HF和CF通道的特征图。图像大小和特征贴图大小之间的关系取决于NN的结构(例如,池层的数

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


如果可能的话,我正在寻找一个语言和框架不可知的答案,或者用tensorflow术语更好

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

  • 特征生成器。零件通过具有大小
    WI x HI
    CI
    通道的图像,生成具有大小
    WF x HF
    CF
    通道的特征图。图像大小和特征贴图大小之间的关系取决于NN的结构(例如,池层的数量和步长)

  • 分类器。该部分解决了使用
    WF*HF*CF
    组件将向量分类为类的任务

  • 您可以将不同大小的图像放入特征生成器,得到不同大小的特征地图。但分类器只能在一些固定长度的向量上进行训练。因此,很明显,您需要训练网络以获得一些固定大小的图像。若你们有不同大小的图像,你们可以调整它的大小以输入网络的大小,或者裁剪图像的某些部分

    文章中描述的另一种方式

    何K,张X,任S,孙J,“用于视觉识别的深卷积网络中的空间金字塔池”,2014年


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

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

  • 特征生成器。零件通过具有大小
    WI x HI
    CI
    通道的图像,生成具有大小
    WF x HF
    CF
    通道的特征图。图像大小和特征贴图大小之间的关系取决于NN的结构(例如,池层的数量和步长)

  • 分类器。该部分解决了使用
    WF*HF*CF
    组件将向量分类为类的任务

  • 您可以将不同大小的图像放入特征生成器,得到不同大小的特征地图。但分类器只能在一些固定长度的向量上进行训练。因此,很明显,您需要训练网络以获得一些固定大小的图像。若你们有不同大小的图像,你们可以调整它的大小以输入网络的大小,或者裁剪图像的某些部分

    文章中描述的另一种方式

    何K,张X,任S,孙J,“用于视觉识别的深卷积网络中的空间金字塔池”,2014年


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

    在某些情况下,适当调整图像大小(例如保持aspectratio)就足够了。但是,这可能会引入失真,如果这是有害的,另一种解决方案是使用空间金字塔池(SPP)。不同图像大小的问题在于,它会产生不同大小的层,例如,考虑到某些网络的
    n-th
    层的特征,您可以得到大小
    128*fw*fh
    的特征图,其中
    fw
    fh
    根据输入示例的大小而变化。为了缓解这个问题,SPP所做的是将这个可变大小的特征映射转化为一个固定长度的特征向量。它在不同的尺度上运行,将图像划分为相等的面片并对其执行最大池。我认为在解释它方面做得很好。可以看到一个示例应用程序

    作为一个快速的解释,假设您有一个大小为
    k*fw*fh
    的特征图。您可以将其视为<代码> k>代码>窗体

    的映射。
    X Y
    Z T
    
    其中每个块的大小为
    fw/2*fh/2
    。现在,分别对这些块中的每个块执行maxpooling将为您提供大小为
    4
    的向量,因此,您可以大致将
    k*fw*fh
    映射描述为
    k*4
    固定大小的特征向量

    现在,调用这个固定大小的向量<代码> W>代码>并将其放在一边,这次考虑“<代码> k*fw *fh < /COD>特性图为<代码> k < /COD>作为

    的特征平面。
     A B C D
     E F G H
     I J K L
     M N O P
    
    同样,在每个块上分别执行maxpooling。因此,使用它,您可以获得更细粒度的表示,作为长度为v=k*16的向量

    现在,将两个向量
    u=[v;w]
    串联在一起可以得到一个固定大小的表示。这正是2级SPP所做的(当然,您可以更改分区的数量/大小)


    希望这能有所帮助。

    在某些情况下,适当调整图像大小(例如保持aspectratio)就足够了。但是,这可能会引入失真,如果这是有害的,另一种解决方案是使用空间金字塔池(SPP)。不同图像大小的问题在于,它会产生不同大小的层,例如,考虑到某些网络的
    n-th
    层的特征,您可以得到大小
    128*fw*fh
    的特征图,其中
    fw
    fh
    根据输入示例的大小而变化。为了缓解这个问题,SPP所做的是将这个可变大小的特征映射转化为一个固定长度的特征向量。它在不同的尺度上运行,将图像划分为相等的面片并对其执行最大池。我认为在解释它方面做得很好。可以看到一个示例应用程序

    作为一个快速的解释,假设您有一个大小为
    k*fw*fh
    的特征图。您可以将其视为<代码> k>代码>窗体

    的映射。
    X Y
    Z T
    
    其中每个块的大小
    fw/2*fh/2