精华内容
下载资源
问答
  • 池化

    2020-09-08 21:18:54
    池化

    池化

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 综述:最大池化,平均池化,全局最大池化和全局平均池化?区别原来是这样

    综述:最大池化,平均池化,全局最大池化和全局平均池化?区别原来是这样


    摘要

    创建ConvNets通常与池化层并驾齐驱。更具体地说,我们经常看到其他层,例如最大池化。但是他们是什么?为什么有必要,以及它们如何帮助训练机器学习模型?以及如何使用它们?

    我们在此博客文章中回答这些问题。

    首先,我们将从概念层面看一下池化操作。我们探索了ConvNet的内部工作原理,并通过此分析显示了合并层如何帮助这些模型中生成的空间层次结构。然后,我们继续确定池的四种类型-最大池化,平均池化,全局最大池化和全局平均池化。

    随后,我们从理论转向实践:我们展示池化如何在Keras(当今最广泛使用的深度学习框架)中表示。然后,我们通过基于MaxPooling的示例来结束本博客。

    什么是池化?

    假设您正在训练卷积神经网络。您的目标是对数据集中的图像进行分类。由您的神经网络中的第一卷积层执行的操作可以表示如下:
    在这里插入图片描述

    该层的输入是图像,高度为 H,宽度 w ^并具有三个渠道。因此,它们很可能是RGB图像。使用3x3x3内核,对输入图像执行卷积运算,生成N所谓的“特征图”的大小Hfm×WfmH_{f m} \times W_{f m}。一个特征图学习图像中存在的一个特定特征。通过激活,这些特征图有助于训练过程中的结果预测以及新数据的预测。N可以在开始训练过程之前由机器学习工程师进行配置。

    在上述示例的情况下,图像为32 x 32像素,第一个卷积操作(假设步长为1,无任何填充)将生成30 x 30像素的特征图;说我们设置N= 64,则将在第一层中生成64个此类地图。

    对输入进行下采样

    现在让我们退后一步,想一想成功训练ConvNet所要实现的目标。假设我们有一个图像分类器,其主要目标是正确分类图像。

    如果我们像人类那样去做,那么我们将同时关注细节和高级模式。

    现在,让我们再次看一下特征图的概念。在第一层中,您将基于图像的“具体”方面学习特征图。在此,特征图由图像中的非常低级的元素组成,例如曲线和边缘,也称为细节。但是,我们看不到只有一个卷积层的高级模式。我们需要很多人一起学习这些模式。这也称为建立空间层次结构(Chollet,2017)。良好的空间层次结构从下到上移动时基本上可以汇总数据,就像金字塔一样。这是一个好人与一个坏人:

    在这里插入图片描述
    好的空间层次结构(左)与较差的空间层次结构(右)。

    如您所知,在ConvNet的卷积操作中,有一个小块在整个输入图像上滑动,并对当前滑动的图像部分进行逐元素乘法运算(Chollet,2017)。这是一个相对昂贵的操作。难道不能以更简单的方式做到这一点吗?我们真的需要仅由卷积建立层次结构吗?答案是否定的,池化操作证明了这一点。

    引入池化

    这是池化的一种定义:

    池化基本上是“downscaling”从先前图层获得的图像。可以将其与缩小图像以减小其像素密度进行比较。

    好吧,缩小比例。但这也可以通过更简单的方式完成:通过执行诸如的硬编码张量操作max,而不是通过学习的变换,我们不需要学习权重的相对昂贵的操作(Chollet,2017)。这样,我们只需花费一小部分成本就能获得一个不错的,可能有用的空间层次结构。

    在本博文的其余部分,我们介绍了四种类型的池化操作:

    最大池化Max Pooling;
    平均池化Average pooling;
    全局最大池化Global max pooling;
    全局平均池化Global average pooling.
    让我们先来看一下Max Pooling。

    最大池化

    假设这是来自ConvNet的4 x 4像素特征图之一:
    在这里插入图片描述

    如果要对它进行降采样,则可以使用称为“最大池化”的池化操作(更具体地说,这是二维最大池化)。在此合并操作中,H× W “块”滑过输入数据,其中 H 是高度和 w 宽度。步幅(即在滑动操作过程中步幅)通常等于池的大小,因此其作用等于减小高度和宽度。

    对于每个块或“池”,操作仅涉及计算max,像这样:
    在这里插入图片描述

    对每个池这样做,我们得到了很好的降采样结果,极大地受益于我们需要的空间层次结构:

    在这里插入图片描述

    Max Pooling如何帮助平移不变性

    除了便宜地代替卷积层之外,最大池化在ConvNet中非常有用的另一个原因是:平移不变性。

    当模型是平移不变的时,则意味着图片中的对象不在哪里都无关紧要;无论如何,它将被识别。例如,如果我将电话放在头部附近或口袋附近,则两次电话都应属于分类的同一个。

    可以想象,在模型中实现平移不变性将极大地提高其预测能力,因为您不再需要提供对象恰好位于所需位置的图像。相反,您仅可以提供包含对象的大量图像,并可能获得性能良好的模型。

    现在,最大池化如何在神经网络中实现平移不变性?

    假设我们有一个1像素的对象,这有点奇怪,因为对象通常是多像素,但这对我们的解释很有帮助。该对象具有最高的对比度,因此会为输入图像中的像素生成较高的值。假设上图红色部分中(0,4)处的4是我们选择的像素。如我们所见,对于最大池化,它仍然包含在输出中。

    现在,假设该对象(即4)不在(0,4),而是在(1,3)。它会从模型中消失吗?不会。最大池化层的输出仍将为4。因此,对象位于红色块中的位置并不重要,因为无论如何它都会被“捕获”。

    这就是为什么最大池化意味着平移不变性,以及它真正有用的原因,除了相对便宜(计算少)之外。

    如果对象是在任何非红色区域中,识别将会发生在那个地方,但只有当没有什么更大的像素值存在的情况下。因此,如果仅提供对象始终位于很小 区域的图片,则最大池化不会产生平移不变性。但是,如果您的数据集变化很大,并且对象位于不同的位置,则最大池化确实会真正有益于模型的性能。

    为什么最大池化是最常用的池化操作

    接下来,我们将看平均池化,这是另一个池化操作。它可以用作Max Pooling的直接替代。但是,当您查看神经网络理论(例如Chollet,2017)时,您会发现Max Pooling一直都是首选。

    为什么会这样呢?

    论点相对简单:由于感兴趣的对象可能会产生最大的像素值,因此在某个块中采用最大值比采用平均值会更有趣(Chollet,2017)。

    糟糕,现在我已经放弃了平均池的功能🙂

    平均池化

    池化层的另一种类型是平均池化层。这里,计算每个块的avg而不是max:

    在这里插入图片描述
    如您所见,输出也有所不同-与“最大池化”相比,不是那么极端了:

    在这里插入图片描述
    平均池与最大池化的不同之处在于,它保留了有关块或池中“次重要”元素的大量信息。尽管“最大池化”只是通过选择最大值来丢弃它们,但“平均池化”将它们混合在一起。这在各种情况下有用,其中此类信息很有用。我们将在下一节中看到一个。

    为什么要考虑平均池化?

    在互联网上,可以找到许多赞成和反对平均池化的论点,通常建议采用最大池化作为替代方案。答案主要是解决上述差异。

    例如:

    因此,要回答您的问题,我认为平均池比最大池化没有任何明显的优势。但是,在某些情况下,最大池化过滤器中的方差不大,两个池化将给出相同的类型结果。但是在极端情况下,最大池化肯定会提供更好的结果。

    但是也:

    我还要增加一个论点–最大池化层在保留局部信息方面效果较差。

    因此,唯一正确的答案是:它完全取决于您要解决的问题。

    如果对象的位置不重要,则“最大池化”似乎是更好的选择。如果是这样,则使用平均池似乎可以实现更好的结果。

    全局最大池化

    池化层的另一种类型是全局最大池化层。在这里,我们将池大小设置为等于输入大小,以便max将整个输入的都计算为输出值(Dernoncourt,2017):

    在这里插入图片描述
    或者,以不同的方式可视化它:

    在这里插入图片描述
    全局池化可以在多种情况下使用。首先,它可用于减少某些卷积层输出的特征图的维数,以取代分类器中的Flattening甚至有时是Dense层(Christlein,2019)。此外,它还可以用于 word spotting(Sudholt&Fink,2016)。这是由于其允许检测噪声的特性,因此可以“大输出”(例如,上例中的值9)。但是,这也是全局最大池化的缺点之一,与常规方法一样,我们接下来将介绍全局平均池化。

    全局平均池化

    应用全局平均池化时,池大小仍设置为图层输入的大小,但取最大值而不是最大值:
    在这里插入图片描述

    或者,再次以不同的方式可视化时:

    在这里插入图片描述
    它们通常用于替换分类器中的全连接层或密集连接层。取而代之的是,模型以卷积层结束,该卷积层生成与目标类数量一样多的特征图,并对每个特征集应用全局平均池化,以便将每个特征图转换为一个值(Mudau,nd)。由于特征图可以识别输入数据中的某些元素,因此最后一层中的图可以有效地学习以“识别”该体系结构中特定类的存在。通过将由全局平均池化生成的值输入到Softmax激活函数中,您可以再次获得所需的多类概率分布。

    而且,由于“分类器”对“特征提取器”的固有性(nativeness )(它们都是卷积的,而不是dense layer),这种方法可能会提高模型性能,并且由于没有参数需要学习,可用于减少过拟合.

    Keras API中的池层

    现在让我们看一下Keras如何在其API中表示池化层。

    最大池化

    Max Pooling具有一维,二维和三维形式(Keras,nd)。一维变量可以与Conv1D层一起使用,因此可以用于时间数据:

    keras.layers.MaxPooling1D(pool_size=2, strides=None, padding='valid', data_format='channels_last')
    
    

    在此,可以通过设置池大小为整数值pool_size,跨度和填充,并可以设置数据格式。使用大步None距pool_size(如果保留默认值,则为大步距),可以定义池在输入上“跳跃”多少;在默认情况下减半。使用填充时,如果由于池和输入大小之间的不兼容性而导致边缘保留下来,我们可能会考虑这些边缘。最后,数据格式告诉我们有关数据集的渠道策略(首先是渠道还是最后是渠道)的信息。

    Max Pooling也可用于2D数据,可与Conv2D一起用于空间数据(Keras,nd):

    keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
    

    该API确实非常相似,除了pool_size。可以将其定义为整数值(例如pool_size = 3),但将在(3, 3)内部将其转换为整数。显然,您也可以设置一个元组,从而在池的形状上具有更大的灵活性。

    3D Max Pooling可用于空间或时空数据(Keras,nd):

    keras.layers.MaxPooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None)
    
    

    在这里,同样的情况适用于pool_size:它既可以设置为整数值,也可以设置为三维元组。

    平均池化

    对于平均池,该API与最大池化没有什么不同,因此,除了API表示法(Keras,nd)之外,我在这里不再重复其他内容:

    keras.layers.AveragePooling1D(pool_size=2, strides=None, padding='valid', data_format='channels_last')
    keras.layers.AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
    keras.layers.AveragePooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None)
    

    全局最大池化

    由于全局池化的独特结构(池形状等于输入形状),它们在Keras API中的表示非常简单。例如,对于全局最大池化(Keras,nd):

    keras.layers.GlobalMaxPooling1D(data_format='channels_last')
    keras.layers.GlobalMaxPooling2D(data_format='channels_last')
    keras.layers.GlobalMaxPooling3D(data_format='channels_last')
    

    在这里,唯一要配置的是data_format,它告诉我们有关数据中维顺序的信息,可以是channels_last或channels_first。

    全局平均池化

    对于全局平均池化化(Keras,nd)可以观察到同样的情况:

    keras.layers.GlobalAveragePooling1D(data_format='channels_last')
    keras.layers.GlobalAveragePooling2D(data_format='channels_last')
    keras.layers.GlobalAveragePooling3D(data_format='channels_last')
    

    Keras的Conv2D和合并示例

    现在我们知道了池化层以及它们在Keras中的表示方式,我们可以举个例子。在此示例中,我们将向您展示之前创建的模型,以展示稀疏分类交叉熵的工作原理。因此,在这里没有为您显示创建模型的所有步骤。

    但是我们要做的是向您展示应用池化的片段。这里是:

    # Create the model
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(256, activation='relu'))
    model.add(Dense(no_classes, activation='softmax'))
    

    本质上,这是我们模型的架构。使用Sequential API,您可以看到我们添加了Conv2D图层,然后添加了具有(2, 2)池大小的MaxPooling2D图层-每次都有效地将输入减半。有助于提高模型的泛化能力。

    Charles@Sunway, 3rd, April,2020

    展开全文
  • 池化与非池化

    2017-12-18 13:55:34
    在使用arcgis后,发现很多问题,学习之后了解到,池化与非池化的概念,例如请求ogc服务中,客户端向服务器请求实例,若池化则会是获取和释放,若非池化,则是创建与关闭。这几个字已经很清楚了,我理解就像是数据库...

    在使用arcgis后,发现很多问题,学习之后了解到,池化与非池化的概念,例如请求ogc服务中,客户端向服务器请求实例,若池化则会是获取和释放,若非池化,则是创建与关闭。这几个字已经很清楚了,我理解就像是数据库连接池一样的作用。

    开始的问题出现在请求wms时一个客户端请求8个图层会出现卡顿,bug,原因不明,后发现改池化中的最大最小实例数能有效的解决这一问题,因在普通计算机上测试,arcgis server启动服务后,池化我设置成最小0,最大20,应该可以有20个实例,然而,两个客户端同时打开并请求8个服务没问题,但普通计算机会变得很卡,4g内存基本满,cpu蹦到100,应该加个切片缓存一类的东西。

    展开全文
  • 池化

    2020-09-09 16:29:43
    同卷积层⼀样,池化层每次对输⼊数据的⼀个固定形状窗⼝(⼜称池化窗⼝)中的元素计算输出。不同于卷积层里计算输⼊和核的互相关性,池化层直接计算池化窗口内元素的最大值或者平均值。该运算也分别叫做最大池化或...

    《动手学深度学习pytorch》部分学习笔记,仅用作自己复习。

    池化层

    池化(pooling)层,它的提出是为了缓解卷积层对位置的过度敏感性。

    ⼆维最⼤池化层和平均池化层

    同卷积层⼀样,池化层每次对输⼊数据的⼀个固定形状窗⼝(⼜称池化窗⼝)中的元素计算输出。不同于卷积层里计算输⼊和核的互相关性,池化层直接计算池化窗口内元素的最大值或者平均值。该运算也分别叫做最大池化或平均池化。

    让我们再次回到本节开始提到的物体边缘检测的例子。

    现在我们将卷积层的输出作为 2x2最⼤池化的输⼊。设该卷积层输⼊是 X 、池化层输出为 Y 。⽆论是 X[i, j] 和 X[i, j+1] 值不不同,还是 X[i,j+1] 和 X[i, j+2] 不不同,池化层输出均有 Y[i, j]=1 。也就是说,使⽤2x2 最⼤池化层时,只要卷积层识别的模式在⾼高和宽上移动不超过一个元素,我们依然可以将它检测出来。
    下⾯把池化层的前向计算实现在 pool2d 函数里。它跟5.1节(二维卷积层)⾥ corr2d 函数非常类似,唯一的区别在计算输出 Y 上。

    import torch
    from torch import nn
    def pool2d(X, pool_size, mode='max'):
        X = X.float()
        p_h, p_w = pool_size
        Y = torch.zeros(X.shape[0] - p_h + 1, X.shape[1] - p_w + 1)
        for i in range(Y.shape[0]):
            for j in range(Y.shape[1]):
                if mode == 'max':
                    Y[i, j] = X[i: i + p_h, j: j + p_w].max()
                elif mode == 'avg':
                    Y[i, j] = X[i: i + p_h, j: j + p_w].mean()
         return Y

    我们可以构造图5.6中的输⼊数组 X 来验证⼆维最大池化层的输出。

    X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
    pool2d(X, (2, 2))

    输出:

    tensor([[4., 5.],
    [7., 8.]])

    实验⼀下平均池化层。

    pool2d(X, (2, 2), 'avg') 

    输出:tensor([[2., 3.],
    [5., 6.]])

    填充和步幅

    同卷积层⼀样,池化层也可以在输⼊的⾼和宽两侧的填充并调整窗⼝的移动步幅来改变输出形状。池化层填充和步幅与卷积层填充和步幅的⼯作机制⼀样。我们将通过 nn 模块⾥里里的二维最大池化层 MaxPool2d 来演示池化层填充和步幅的⼯作机制。

    # 我们先构造一个形状为(1, 1, 4, 4)的输⼊数据,前两个维度分别是批量和通道。
    X = torch.arange(16, dtype=torch.float).view((1, 1, 4, 4))
    X

    输出:tensor([[[[ 0., 1., 2., 3.],
    [ 4., 5., 6., 7.],
    [ 8., 9., 10., 11.],
    [12., 13., 14., 15.]]]])

    默认情况下, MaxPool2d 实例例⾥步幅和池化窗口形状相同。下⾯使用形状为(3, 3)的池化窗口,默认获得形状为(3, 3)的步幅。

    pool2d = nn.MaxPool2d(3)
    pool2d(X)

    输出:tensor([[[[10.]]]]) 

    我们可以⼿动指定步幅和填充。

    pool2d = nn.MaxPool2d(3, padding=1, stride=2)
    pool2d(X)

    输出:tensor([[[[ 5., 7.],
    [13., 15.]]]])

    当然,我们也可以指定⾮正方形的池化窗⼝,并分别指定⾼和宽上的填充和步幅。

    pool2d = nn.MaxPool2d((2, 4), padding=(1, 2), stride=(2, 3))
    pool2d(X)

    输出:tensor([[[[ 1., 3.],
    [ 9., 11.],
    [13., 15.]]]])

    多通道

    在处理理多通道输⼊数据时,池化层对每个输⼊通道分别池化,⽽不是像卷积层那样将各通道的输入按通道相加。这意味着池化层的输出通道数与输⼊通道数相等。下⾯将数组 X 和 X+1 在通道维上连结来构造通道数为2的输入。

    X = torch.cat((X, X + 1), dim=1)
    X

    输出:

    tensor([[[[ 0., 1., 2., 3.],
    [ 4., 5., 6., 7.],
    [ 8., 9., 10., 11.],
    [12., 13., 14., 15.]],
    [[ 1., 2., 3., 4.],
    [ 5., 6., 7., 8.],
    [ 9., 10., 11., 12.],
    [13., 14., 15., 16.]]]])

    池化后,我们发现输出通道数仍然是2。

    pool2d = nn.MaxPool2d(3, padding=1, stride=2)
    pool2d(X)

    输出:

    tensor([[[[ 5., 7.],
    [13., 15.]],
    [[ 6., 8.],
    [14., 16.]]]])

    小结

    • 最⼤池化和平均池化分别取池化窗⼝中输⼊元素的最大值和平均值作为输出。
    • 池化层的⼀个主要作用是缓解卷积层对位置的过度敏感性。
    • 可以指定池化层的填充和步幅。
    • 池化层的输出通道数跟输⼊入通道数相同。
    展开全文
  • 目录  Same最大值池化  多深度的same池化  Same平均值池化  Valid池化 ...池化操作分为same池化和valid池化,同时还可以设置移动的步长 Same最大值池化 举例:4行4列的张量x和...
  • 池化层理解

    万次阅读 多人点赞 2019-04-15 14:31:41
    参考网址: ...池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。 简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。 下采样层也叫池化层,其具体操作与卷积层...
  • 1.2 池化的分类1.3 池化的特点1.3 池化的意义1.4 其它池化方式1.5 池化和卷积的比较1.6 卷积和池化的组合使用二: 反池化2.1 反平均池化2.2 反最大池化 一、池化 1.1 什么是池化?      ...
  • 池化方法

    2020-04-15 09:52:52
    池化方法 池化操作是卷积神经网络中的一个特殊的操作,主要就是在一定的区域内提出该区域的关键信息(一个亚采样过程)。其操作往往出现在卷积层之后,它能起到减少卷积层输出的特征量数目的作用,从而能减少模型参数...
  • 池化技术

    2019-09-13 18:31:44
    池化技术 简单来说就是提前保存大量的资源,以备不时之需 核心是复用 池化技术作用 复用相同的资源,减少浪费,减少新建和销毁的成本; 减少单独管理的成本,统一交由"池"; 集中管理,减少"碎片"; 提高系统响应...
  • 传统池化:规则形状N×N的常规空间池化本文的方法:引入一种称为条带池化的新池化策略来重新考虑空间池化的公式,该策略考虑了一个长而窄的核,即1×N或 N×1。本文基于条带池化,通过以下步骤研究空间池化体系结构...
  • 池化函数

    2019-02-10 11:52:17
    在CNN中,池化函数一般放在卷积层之后,图片经过卷积层,获得的特征更加适合分类器的学习,然而如果进行的是同卷积或者全卷积,得到的特征大小不比原来的小,这样我们就需要降维,为此引入池化函数。 池化函数tf.nn...
  • 金字塔池化

    2020-09-29 21:13:56
    金字塔池化,大的预测边界框和小的预测边界框的特征图是不一样的,为了使得FC
  • 5.4 池化

    2021-01-07 03:00:59
    回忆一下,在“二维卷积层”一节里介绍的图像物体边缘检测应用中,我们构造卷积核从而精确地找到了像素变化的位置。...在本节中我们介绍池化(pooling)层,它的提出是为了缓解卷积层对位置的过度敏感性。 5.4
  • 最大池化与平均池化的选择

    千次阅读 2019-08-09 14:32:39
    在目标对象是偏向于纹理、轮廓是,选用最大池化较好 在目标对象时偏向于背景或其他信息是,选用平均池化较好 在可以在较浅层使用最大池化,用来过滤无用的信息,在较深层使用平均池化,防止丢掉太多高维信息 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,336
精华内容 4,134
关键字:

池化