精华内容
下载资源
问答
  • 池化操作时在卷积神经网络中经常采用过的一个基本操作,一般在卷积层后面都会接一个池化操作,但是近些年比较主流的ImageNet上的分类算法模型都是使用的max-pooling,很少使用average-pooling,这对我们平时设计模型...
  • def max_pooling(feature_map, size=2, stride=2): """max_pooling""" channel = feature_map.shape[0] height = feature_map.shape[1] width = feature_map.shape[2] # 确定最后的输出形状 out_height = np....
  • 今天小编就为大家分享一篇PyTorch的自适应池化Adaptive Pooling实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Event Extraction via Dynamic Multi-Pooling Convolutional NeuralNetworks
  • 题目 输入:从控制台获取n,m,a,b;其中n*m为矩阵大小,a*b为滑动窗口大小 矩阵中的值,通过(i*j)mod 10 得到, 在滑动过程中,需要获得每次滑动窗口中的最大值,并存储下来 输出:所有最大值的和 ...
  • 之前一直想可视化模型的注意...ValueError: Unable to determine penultimate Conv or Pooling layer for layer_idx: 2 但是如果是自己定义的模型就可以正常输出。 看起来应该是一个找不到对应layer的错误。于是很自然
  • compact bilinear pooling(tensorflow版本),可用于细粒度分类,特征融合
  • Pooling Networks for Video-based Person Re-Identification}, author={Shuangjie Xu, Yu Cheng, Kang Gu, Yang Yang, Shiyu Chang and Pan Zhou}, booktitle={ICCV}, year={2017} } 依存关系 以下库是必需的: ...
  • power, this paper presents a simple but effective scheme called multiscale orderless pooling (MOP-CNN). This scheme extracts CNN activations for local patches at multiple scale levels, performs ...
  • 双线性池化(Bilinear pooling)tensorflow版,可以用于细粒度分类
  • work, we equip the networks with another pooling strategy, “spatial pyramid pooling”, to eliminate the above requirement. The new network structure, called SPP-net, can generate a fixed-length ...
  • Deep Learning pooling.pdf

    2020-07-09 13:40:48
    Deep Learning pooling.pdf
  • 池化层定义在tensorflow/python/layers/pooling.py. 有最大值池化和均值池化。 1、tf.layers.max_pooling2d max_pooling2d( inputs, pool_size, strides, padding='valid', data_format='channels_last', ...
  • Gnn池 GNN的合并层实验
  • 一、MaxPooling前向传播与反向传播 MaxPooling就是对卷积区域进行最大值计算。 1、MaxPooling池化区域与步长相同时,即只对最大区域进行梯度计算,最后将梯度平均到四个区域中。 1314524696123456conv(2,2)stride=2&...

    一、MaxPooling前向传播与反向传播

    MaxPooling就是对卷积区域进行最大值计算。
    1、MaxPooling池化区域与步长相同时,即只对最大区域进行梯度计算,最后将梯度平均到四个区域中。
    1 3 1 4 5 2 4 6 9 6 1 2 3 4 5 6 c o n v ( 2 , 2 ) s t r i d e = 2 > 5 6 9 6 梯 度 坐 标 > 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 梯 度 值 > 0 0 0 0 0.25 0 0 0.25 0.25 0 0 0 0 0 0 0.25 \begin{gathered} \begin{matrix} 1 & 3 & 1 & 4 \\ 5 & 2 &4 & 6 \\ 9 & 6 & 1 & 2 \\ 3 & 4 & 5 & 6\end{matrix} \quad conv(2,2) stride=2 > \begin{matrix} 5 & 6 \\ 9 & 6\end{matrix} \quad 梯度坐标> \begin{matrix} 0 & 0 & 0 & 0 \\ 1 & 0 & 0 & 1 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1\end{matrix} \quad 梯度值> \begin{matrix} 0 & 0 & 0 & 0 \\ 0.25 & 0 & 0 & 0.25 \\ 0.25 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0.25\end{matrix} \end{gathered} 1593326414154626conv(2,2)stride=2>5966>0110000000000101>00.250.2500000000000.2500.25
    下图中,红色的框表示池化区域,得到5,而对应的下标计数为1,最后将所有的梯度平均。1/4
    在这里插入图片描述
    2、MaxPooling池化区域与步长不相同时,进行池化操作之后,对于重复出现的最大值进行重复计数,最后再根据计数进行梯度平均。
    1 3 1 4 5 2 4 6 9 6 1 2 3 4 5 6 c o n v ( 2 , 2 ) s t r i d e = 1 > 5 4 6 9 6 6 9 6 6 梯 度 坐 标 > 0 0 0 0 1 0 1 2 2 2 0 0 0 0 0 1 梯 度 值 > 0 0 0 0 0.11 0.11 0 0.22 0.22 0.22 0 0 0 0 0 0.11 \begin{gathered} \begin{matrix} 1 & 3 & 1 & 4 \\ 5 & 2 &4 & 6 \\ 9 & 6 & 1 & 2 \\ 3 & 4 & 5 & 6\end{matrix} \quad conv(2,2) stride=1 > \begin{matrix} 5 & 4& 6 \\ 9 & 6 & 6 \\9 & 6 & 6\end{matrix} \quad 梯度坐标> \begin{matrix} 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 2 \\ 2 & 2 & 0 & 0 \\ 0 & 0 & 0 & 1\end{matrix} \quad 梯度值> \begin{matrix} 0 & 0 & 0 & 0 \\ 0.11 & 0.11 & 0 & 0.22 \\ 0.22 & 0.22 & 0 & 0 \\ 0 & 0 & 0 & 0.11\end{matrix} \end{gathered} 1593326414154626conv(2,2)stride=1>599466666>0120002001000201>00.110.22000.110.220000000.2200.11
    当步长小于池化区域时,存在重叠区域,那么将进行重复计算,对应梯度也按照权重分配。
    在这里插入图片描述
    上图中,5、4分别是最大值,因此梯度计数回到对应的位置分别为1。下图中,绿、红的最大值均为6,因此被计数两次,梯度坐标为2。
    在这里插入图片描述

    二、AvgPooling前向传播与反向传播

    AvgPooling就是对卷积区域进行均值计算。
    1、AvgPooling池化区域与步长相同时,对全局进行梯度平均。
    1 3 1 4 5 2 4 6 9 6 1 2 3 4 5 6 c o n v ( 2 , 2 ) s t r i d e = 2 > 2.75 3.75 5.5 3.5 梯 度 坐 标 > 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 梯 度 值 > 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 \begin{gathered} \begin{matrix} 1 & 3 & 1 & 4 \\ 5 & 2 &4 & 6 \\ 9 & 6 & 1 & 2 \\ 3 & 4 & 5 & 6\end{matrix} \quad conv(2,2) stride=2 > \begin{matrix} 2.75 & 3.75 \\ 5.5 & 3.5\end{matrix} \quad 梯度坐标> \begin{matrix} 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1\end{matrix} \quad 梯度值> \begin{matrix} 0.0265 & 0.0265 & 0.0265 & 0.0265 \\ 0.0265 & 0.0265 & 0.0265 & 0.0265 \\ 0.0265 & 0.0265 & 0.0265 & 0.0265 \\ 0.0265 & 0.0265 & 0.0265 & 0.0265\end{matrix} \end{gathered} 1593326414154626conv(2,2)stride=2>2.755.53.753.5>1111111111111111>0.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.0265
    2、AvgPooling池化区域与步长不相同时,对全局按照重叠区域进行权重平均。对重复计算的区域进行重复计数。
    1 3 1 4 5 2 4 6 9 6 1 2 3 4 5 6 c o n v ( 2 , 2 ) s t r i d e = 1 > 2.75 2.5 3.75 5.5 3.25 3.25 5.5 4 3.5 梯 度 坐 标 > 1 2 2 1 2 4 4 2 2 4 4 2 1 2 2 1 梯 度 值 > 0.0287 0.0556 0.0556 0.0287 0.0556 0.1111 0.1111 0.0556 0.0556 0.1111 0.1111 0.0556 0.0287 0.0265 0.0265 0.0287 \begin{gathered} \begin{matrix} 1 & 3 & 1 & 4 \\ 5 & 2 &4 & 6 \\ 9 & 6 & 1 & 2 \\ 3 & 4 & 5 & 6\end{matrix} \quad conv(2,2) stride=1 > \begin{matrix} 2.75 & 2.5 &3.75\\ 5.5 & 3.25 & 3.25 \\5.5&4&3.5\end{matrix} \quad 梯度坐标> \begin{matrix} 1 & 2 & 2 & 1 \\ 2 & 4 & 4 & 2 \\ 2 & 4 & 4 & 2 \\ 1 & 2 & 2 & 1\end{matrix} \quad 梯度值> \begin{matrix} 0.0287& 0.0556& 0.0556& 0.0287\\ 0.0556& 0.1111 & 0.1111 & 0.0556\\ 0.0556& 0.1111 & 0.1111 & 0.0556 \\ 0.0287& 0.0265 & 0.0265 & 0.0287\end{matrix} \end{gathered} 1593326414154626conv(2,2)stride=1>2.755.55.52.53.2543.753.253.5>1221244224421221>0.02870.05560.05560.02870.05560.11110.11110.02650.05560.11110.11110.02650.02870.05560.05560.0287
    这里把重复计数问题通过滑动窗口的形式表现出来:
    在这里插入图片描述
    左图中数字1,在进行平均池化计算时,由于会被红色个窗口进行平均计算,因此梯度坐标为1,即均值计算计数为1;3经过红、黑两个窗口进行均值计算,计数梯度为2;2这个数字经过红、黑、绿、粉四个窗口进行均值计算,因此计数为4。

    三、代码

    import torch
    import numpy as np
    img = np.array([
            [1,3,1,4],
            [5,2,4,6],
            [9,6,1,2],
            [3,4,5,6],])
    img = img.astype(np.float)
    img = torch.tensor(img,requires_grad=True).float()
    img = img.unsqueeze(0)
    img.retain_grad() #保留梯度
    pool = torch.nn.functional.avg_pool2d(img,kernel_size=(2,2),stride=1) #平均池化
    # pool = torch.nn.functional.max_pool2d(vara,kernel_size=(2,2),stride=1) # 最大池化
    print(pool) #池化结果
    pool = torch.mean(pool) #均值计算
    pool.backward() #梯度回传
    print(img.grad) #输出梯度
    

    代码参考

    展开全文
  • 通过广义池增强句子嵌入 Pytorch重新实现了而不会受到惩罚。 这是一个非正式的实现。 有实现,在Theano上实现。 结果 数据集: 模型 有效累积(%) 试验合格率(%) 本文的基准(无惩罚) ...
  • 本文档主要介绍了SPP-Net一文中的网络架构和主要思想。
  • Pooling 操作合集

    千次阅读 2020-03-24 15:24:41
    一、Max pooling ...在卷积后还会有一个 pooling 的操作,尽管有其他的比如 average pooling 等,这里只提 max pooling。 max pooling 的操作如下图所示:整个图片被不重叠的分割成若干个同样大小...

    原来来源雷锋网,地址为:https://www.leiphone.com/news/201707/8sX3XVS7ce2UfkrY.html,侵权则删

    一、Max pooling

    在卷积后还会有一个 pooling 的操作,尽管有其他的比如 average pooling 等,这里只提 max pooling。

    max pooling 的操作如下图所示:整个图片被不重叠的分割成若干个同样大小的小块(pooling size)。每个小块内只取最大的数字,再舍弃其他节点后,保持原有的平面结构得出 output。

    CNN中的maxpool到底是什么原理?

    图片来源:cs231n

    max pooling 在不同的 depth 上是分开执行的,且不需要参数控制。 那么问题就 max pooling 有什么作用?部分信息被舍弃后难道没有影响吗?

    CNN中的maxpool到底是什么原理?

    图片来源:cs231n

    Max pooling 的主要功能是 downsampling,却不会损坏识别结果。 这意味着卷积后的 Feature Map 中有对于识别物体不必要的冗余信息。 那么我们就反过来思考,这些 “冗余” 信息是如何产生的。

    直觉上,我们为了探测到某个特定形状的存在,用一个 filter 对整个图片进行逐步扫描。但只有出现了该特定形状的区域所卷积获得的输出才是真正有用的,用该 filter 卷积其他区域得出的数值就可能对该形状是否存在的判定影响较小。 比如下图中,我们还是考虑探测 “横折” 这个形状。 卷积后得到 3x3 的 Feature Map 中,真正有用的就是数字为 3 的那个节点,其余数值对于这个任务而言都是无关的。 所以用 3x3 的 Max pooling 后,并没有对 “横折” 的探测产生影响。 试想在这里例子中如果不使用 Max pooling,而让网络自己去学习。 网络也会去学习与 Max pooling 近似效果的权重。因为是近似效果,增加了更多的 parameters 的代价,却还不如直接进行 Max pooling。

    CNN中的maxpool到底是什么原理?

    Max pooling 还有类似 “选择句” 的功能。假如有两个节点,其中第一个节点会在某些输入情况下最大,那么网络就只在这个节点上流通信息;而另一些输入又会让第二个节点的值最大,那么网络就转而走这个节点的分支。

    但是 Max pooling 也有不好的地方。因为并非所有的抓取都像上图这样的极端例子。有些周边信息对某个概念是否存在的判定也有影响。 并且 Max pooling 是对所有的 Feature Maps 进行等价的操作。就好比用相同网孔的渔网打鱼,一定会有漏网之鱼。

     

    二、SUM Pooling

    基于 SUM pooling 的中层特征表示方法,指的是针对中间层的任意一个 channel(比如 VGGNet16, pool5 有 512 个 channel),将该 channel 的 feature map 的所有像素值求和,这样每一个 channel 得到一个实数值,N 个 channel 最终会得到一个长度为 N 的向量,该向量即为 SUM pooling 的结果。

     

    三、AVE pooling

    AVE pooling 就是 average pooling,本质上它跟 SUM pooling 是一样的,只不过是将像素值求和后还除以了 feature map 的尺寸。作者以为,AVE pooling 可以带来一定意义上的平滑,可以减小图像尺寸变化的干扰。设想一张 224224 的图像,将其 resize 到 448448 后,分别采用 SUM pooling 和 AVE pooling 对这两张图像提取特征,我们猜测的结果是,SUM pooling 计算出来的余弦相似度相比于 AVE pooling 算出来的应该更小,也就是 AVE pooling 应该稍微优于 SUM pooling 一些。

     

    四、MOP pooling

    MOP Pooling 源自 Multi-scale Orderless Pooling of Deep Convolutional Activation Features这篇文章,一作是 Yunchao Gong,此前在搞哈希的时候,读过他的一些论文,其中比较都代表性的论文是 ITQ,笔者还专门写过一篇笔记论文阅读:Iterative Quantization 迭代量化。MOP pooling 的基本思想是多尺度与 VLAD(VLAD 原理可以参考笔者之前写的博文图像检索:BoF、VLAD、FV 三剑客),其具体的 pooling 步骤如下:

    CNN中的maxpool到底是什么原理?

    来源:Multi-scale Orderless Pooling of Deep Convolutional Activation Features

    Overview of multi-scale orderless pooling for CNN activations (MOP-CNN). Our proposed feature is a concatenation of the feature vectors from three levels: (a)Level 1, corresponding to the 4096-dimensional CNN activation for the entire 256256image; (b) Level 2, formed by extracting activations from 128128 patches and VLADpooling them with a codebook of 100 centers; (c) Level 3, formed in the same way aslevel 2 but with 64*64 patches.

    具体地,在 L=1 的尺度下,也就是全图,直接 resize 到 256*256 的大小,然后送进网络,得到第七层全连接层 4096 维的特征;在 L=2 时,使用 128*128(步长为 32) 的窗口进行滑窗,由于网络的图像输入最小尺寸是 256*256,所以作者将其上采样到 256256,这样可以得到很多的局部特征,然后对其进行 VLAD 编码,其中聚类中心设置为 100,4096 维的特征降到了 500 维,这样便得到了 50000 维的特征,然后将这 50000 维的特征再降维得到 4096 维的特征;L=3 的处理过程与 L=2 的处理过程一样,只不过窗口的大小编程了 64*64 的大小。

    作者通过实验论证了 MOP pooling 这种方式得到的特征一定的不变性。基于这种 MOP pooling 笔者并没有做过具体的实验,所以实验效果只能参考论文本身了。

     

    五、CROW pooling

    对于 Object Retrieval,在使用 CNN 提取特征的时候,我们所希望的是在有物体的区域进行特征提取,就像提取局部特征比如 SIFT 特征构 BoW、VLAD、FV 向量的时候,可以采用 MSER、Saliency 等手段将 SIFT 特征限制在有物体的区域。同样基于这样一种思路,在采用 CNN 做 Object Retrieval 的时候,我们有两种方式来更细化 Object Retrieval 的特征:一种是先做物体检测然后在检测到的物体区域里面提取 CNN 特征;另一种方式是我们通过某种权重自适应的方式,加大有物体区域的权重,而减小非物体区域的权重。CROW pooling ( Cross-dimensional Weighting for Aggregated Deep Convolutional Features ) 即是采用的后一种方法,通过构建 Spatial 权重和 Channel 权重,CROW pooling 能够在一定程度上加大感兴趣区域的权重,降低非物体区域的权重。其具体的特征表示构建过程如下图所示:

    CNN中的maxpool到底是什么原理?

    其核心的过程是 Spatial Weight 和 Channel Weight 两个权重。Spatial Weight 具体在计算的时候,是直接对每个 channel 的 feature map 求和相加,这个 Spatial Weight 其实可以理解为 saliency map。我们知道,通过卷积滤波,响应强的地方一般都是物体的边缘等,因而将多个通道相加求和后,那些非零且响应大的区域,也一般都是物体所在的区域,因而我们可以将它作为 feature map 的权重。Channel Weight 借用了 IDF 权重的思想,即对于一些高频的单词,比如 “the”,这类词出现的频率非常大,但是它对于信息的表达其实是没多大用处的,也就是它包含的信息量太少了,因此在 BoW 模型中,这类停用词需要降低它们的权重。借用到 Channel Weight 的计算过程中,我们可以想象这样一种情况,比如某一个 channel,其 feature map 每个像素值都是非零的,且都比较大,从视觉上看上去,白色区域占据了整个 feature map,我们可以想到,这个 channel 的 feature map 是不利于我们去定位物体的区域的,因此我们需要降低这个 channel 的权重,而对于白色区域占 feature map 面积很小的 channel,我们认为它对于定位物体包含有很大的信息,因此应该加大这种 channel 的权重。而这一现象跟 IDF 的思想特别吻合,所以作者采用了 IDF 这一权重定义了 Channel Weight。

    总体来说,这个 Spatial Weight 和 Channel Weight 的设计还是非常巧妙的,不过这样一种 pooling 的方式只能在一定程度上契合感兴趣区域,我们可以看一下 Spatial Weight*Channel Weight 的热力图:

    CNN中的maxpool到底是什么原理?

    从上面可以看到,权重大的部分主要在塔尖部分,这一部分可以认为是 discriminate 区域,当然我们还可以看到,在图像的其他区域,还有一些比较大的权重分布,这些区域是我们不想要的。当然,从笔者可视化了一些其他的图片来看,这种 crow pooling 方式并不总是成功的,也存在着一些图片,其权重大的区域并不是图像中物体的主体。不过,从千万级图库上跑出来的结果来看,crow pooling 这种方式还是可以取得不错的效果。

     

    六、RMAC pooling

    RMAC pooling 的池化方式源自于 Particular object retrieval with integral max-pooling of CNN activations,三作是 Hervé Jégou(和 Matthijs Douze 是好基友)。在这篇文章中,作者提出来了一种 RMAC pooling 的池化方式,其主要的思想还是跟上面讲过的 MOP pooling 类似,采用的是一种变窗口的方式进行滑窗,只不过在滑窗的时候,不是在图像上进行滑窗,而是在 feature map 上进行的 (极大的加快了特征提取速度),此外在合并 local 特征的时候,MOP pooling 采用的是 VLAD 的方式进行合并的,而 RMAC pooling 则处理得更简单 (简单并不代表效果不好),直接将 local 特征相加得到最终的 global 特征。其具体的滑窗方式如下图所示:

    CNN中的maxpool到底是什么原理?

    图片来源:Day 2 Lecture 6 Content-based Image Retrieval

    图中示意的是三种窗口大小,图中‘x’代表的是窗口的中心,对于每一个窗口的 feature map,论文中采用的是 MAX pooling 的方式,在 L=3 时,也就是采用图中所示的三种窗口大小,我们可以得到 20 个 local 特征,此外,我们对整个 fature map 做一次 MAX pooling 会得到一个 global 特征,这样对于一幅图像,我们可以得到 21 个 local 特征 (如果把得到的 global 特征也视为 local 的话),这 21 个 local 特征直接相加求和,即得到最终全局的 global 特征。论文中作者对比了滑动窗口数量对 mAP 的影响,从 L=1 到 L=3,mAP 是逐步提升的,但是在 L=4 时,mAP 不再提升了。实际上 RMAC pooling 中设计的窗口的作用是定位物体位置的 (CROW pooling 通过权重图定位物体位置)。如上图所示,在窗口与窗口之间,都是一定的 overlap,而最终在构成 global 特征的时候,是采用求和相加的方式,因此可以看到,那些重叠的区域我们可以认为是给予了较大的权重。

    上面说到的 20 个 local 特征和 1 个 global 特征,采用的是直接合并相加的方式,当然我们还可以把这 20 个 local 特征相加后再跟剩下的那一个 global 特征串接起来。实际实验的时候,发现串接起来的方式比前一种方式有 2%-3% 的提升。在规模 100 万的图库上测试,RMAC pooling 能够取得不错的效果,跟 Crow pooling 相比,两者差别不大。

    上面总结了 6 中不同的 pooling 方式,当然还有很多的 pooling 方式没涵盖不到,在实际应用的时候,笔者比较推荐采用 RMAC pooling 和 CROW pooling 的方式,主要是这两种 pooling 方式效果比较好,计算复杂度也比较低。

     

    展开全文
  • 2 前人工作 2.1 Hand-crafted Pooling特征 下采样已被广泛应用于手工编码的特征提取方法之中,如Bag-of-Words和Bag-of-Features,在这些方法中图像被视为局部斑块的集合,通过pooling和encode为向量。该方法还与...

    图片

    本文提出了一种快速、高效的池化方法SoftPool,Softpool可以以指数加权方式累加激活。与一系列其他池化方法相比,SoftPool在下采样激活映射中保留了更多的信息,可以获得更好的分类精度。在ImageNet上,对于一系列流行的CNN架构,用SoftPool替换原来的池化操作可以带来1-2%的一致性精度提升。


    作者单位:乌得勒支大学 华威大学

    1 简介

    通常卷积神经网络(CNNs)都会使用池化pool操作来减少Feature Map的尺寸。这个过程对于实现局部空间不变和增加后续卷积的感受野是至关重要的。因此池化pool操作应该尽量减少Feature Map映射中信息的丢失。同时,应该限制计算和内存开销。

    为了满足这些需求,本文提出了一种快速、高效的池化方法SoftPool,softpool可以以指数加权方式累加激活。与一系列其他池化方法相比,SoftPool在下采样激活映射中保留了更多的信息。更精细的下采样导致更好的分类精度。在ImageNet上,对于一系列流行的CNN架构,用SoftPool替换原来的池化操作可以带来1-2%的一致性精度提升。SoftPool在视频数据集上的动作识别。同样,在计算负载和内存仍然有限的情况下,仅替换池化层依然可以提高精度。

    图片

    2 前人工作

    2.1 Hand-crafted Pooling特征

    下采样已被广泛应用于手工编码的特征提取方法之中,如Bag-of-Words和Bag-of-Features,在这些方法中图像被视为局部斑块的集合,通过pooling和encode为向量。该方法还与空间金字塔匹配相结合进行了研究,以保持空间信息。

    后来的工作考虑了空间区域中最大SIFT特征的选择。脑池化主要与max-pooling的使用有关,因为生物学上类似max的皮层信号具有鲁棒性。Boureau等人研究了最大池化(Max Pooling)和平均池化(Avg Pooling)。Max-pooling已经被有效地应用并由不错的效果和性能。

    2.2 Pooling in CNNs

    传统上,池化的主要好处是创建了比原始版本小得多的表征,从而减少了计算需求,并支持创建更大、更深层次的网络架构。

    下采样的池化方法

    • Average Pooling:区域平均值。

    • Max Pooling:区域最大值。

    • Stochastic Pooling:它使用一个核区域内激活的概率加权抽样。

    • Mix Pooling:基于最大池化和平均池化的混合池化。

    • Power average Pooling:基于平均和最大化的结合,幂平均(Lp)池化利用一个学习参数p来确定这两种方法的相对重要性;当p=1时,使用局部求和,而p为无穷大时,对应max-pooling。

    图片

    网格采样的池化方法

    • S3 Pooling:对原始Feature Map网格中的行和列进行随机采样。

    • Preserving Pooling:使用平均池化,同时用高于平均值的值增强激活。

    • Local Importance Pooling:进一步评估了如何将学习到的权值作为一种基于子网络注意的机制来使用,该机制可用于汇集信息特征,同时丢弃无信息特征。

    图片

    与前面描述的操作相比,一些池化方法有严格的架构或基于任务的标准,这些标准将它们的应用限制在特定的CNN架构和任务上:

    • Spatial Pyramid Pooling

    • ROI-Pool

    • ROI-align

    上述大多数方法都是依赖于最大池化和平均池化的不同组合。而SoftPool的工作不是结合现有的方法,而是基于softmax加权方法来保留输入的基本属性,同时放大更大强度的特征激活。与max-pooling不同softpool是可微的。

    图片

    因此,在反向传播过程中为每个输入获得一个梯度,这可能会提高训练效果。我们在上图中演示了SoftPool的效果。

    其他以前的方法使用可训练的参数导致计算成本增加,直接影响较大网络的可用性。相比之下,SoftPool可以替代任何池化操作,包括最大池化和平均池化,而且计算和内存效率都很高。

    3 SoftPool方法

    从这里开始正式介绍SoftPool中信息的正向传播和反向传播。考虑activation map(a)中的 local region (R),其维数为C×H×W,通道数为C,通道高度为H,通道宽度为W。为了简化符号这里省略通道维数,并假设R是与考虑的二维空间区域的激活相对应的索引集。对于大小为k×k的池化kernel定义。池化操作的输出为,对应的梯度用表示。

    3.1 Exponential maximum kernels

    SoftPool受到Riesenhuber和Poggio的皮层神经模拟以及早期使用Boureau等人的手工编码特征的池化实验的影响。该方法以自然指数(e)为基础,保证了较大的激活值对输出的影响较大。

    SoftPool是可微的,这意味着所有在局部邻域内的激活在反向传播期间将被分配至少一个最小梯度值。这与使用最大池化的方法相反。SoftPool利用激活区域内的最大近似R。每一个指数为的激活应用一个权重,该权重计算为该激活的自然指数与邻域R内所有激活的自然指数之和的比值:

    图片

    权重与相应的激活值一起用作非线性变换。较高的激活比较低的激活占更多的主导地位。因为大多数池化操作都是在高维的特征空间中执行的,突出显示具有更大效果的激活比简单地选择最大值是一种更平衡的方法。

    在后一种情况下,丢弃大部分激活会带来丢失重要信息的风险。相反,平均池化中激活的贡献相等,可以显著降低整体区域特征强度。

    SoftPool操作的输出值是通过对内核邻域R内所有加权激活的标准求和得到的:

    图片

    与其他基于最大池化和平均池化的方法相比,使用区域的softmax产生归一化结果,其概率分布与每个激活值相对于核区域的邻近激活值成比例。这与最大激活值选择或对内核区域的所有激活取平均形成了直接对比,而内核区域的输出激活是没有规则化的。因此是可微的。

    Pytorch实现soft_pool2d如下:

    def soft_pool2d(x, kernel_size=2, stride=None, force_inplace=False):
        if x.is_cuda and not force_inplace:
            return CUDA_SOFTPOOL2d.apply(x, kernel_size, stride)
        kernel_size = _pair(kernel_size)
        if stride is None:
            stride = kernel_size
        else:
            stride = _pair(stride)
        # Get input sizes
        _, c, h, w = x.size()
        # Create per-element exponential value sum : Tensor [b x 1 x h x w]
        e_x = torch.sum(torch.exp(x),dim=1,keepdim=True)
        # Apply mask to input and pool and calculate the exponential sum
        # Tensor: [b x c x h x w] -> [b x c x h' x w']
        return F.avg_pool2d(x.mul(e_x), kernel_size, stride=stride).mul_(sum(kernel_size)).div_(F.avg_pool2d(e_x, kernel_size, stride=stride).mul_(sum(kernel_size)))
    

    3.2 Gradient calculation

    完整的向前和向后信息流下图所示:

    图片

    在训练的更新阶段,所有网络参数的梯度都是根据在上一层计算的误差导数进行更新的。当在整个网络体系结构中反向传播时,这会创建一个更新链。在SoftPool中,梯度更新与前向传播过程中计算的权重成比例。这对应于较小激活的梯度更新小于实质性激活的梯度更新。

    Softmax与max或随机池化不同,Softmax是可微的。因此,在反向传播期间,一个最小的非零权值将被分配给一个核区域内的每一个激活。这样就可以计算出该区域每一次激活的梯度。

    在SoftPool实现中使用了给定精度级别有限范围的可能值,保留了softmax的可微性质,通过给定每个类型使用的比特数分配一个较低的算术限制。这可以防止算术下溢。也为内核值和最终求和中使用的生成的激活值实现了这种机制。

    3.3 Feature preservation

    Sub-Sampling的一个整体目标是在保持输入的代表性特征的同时最小化整体分辨率。创建原始输入的无代表性的下采样可能对整个模型的性能有负面影响,因此输入的表示可能对任务也会有负面影响。

    目前广泛使用的池化技术在某些情况下可能是无效的。Avg Pooling降低了该区域内所有激活的效果,而Max Pooling仅选择该区域内单个激活最高的激活。

    SoftPool的作用介于这两种池化方法之间,因为该区域的所有激活都对最终输出有贡献,而较高的激活比较低的激活占主导地位。该方法可以平衡Avg Pooling和Max Pooling的影响,同时利用两者的有利属性。

    下图显示了SoftPool可以保留的详细级别的示例,即使在图像被大量抽样的情况下颜色与原始图像保持一致。

    图片

    3.4 Spatio-temporal kernels

    CNN也被扩展到使用3D输入来表示额外的维度,如深度和时间。为了适应这些输入,可以通过在内核中包含一个额外的维度对SoftPool进行扩展;对于一个具有维度的输入激活映射,以T为时间范围,将二维空间核区域R转换为三维时空区域,其中三维空间在时间维度上运行。

    产生的输出现在包含压缩的时空信息。通过增加维度,所需的池化属性(如有限的信息丢失、可微函数以及较低的计算和内存开销)变得更加重要。Pytorch实现soft_pool3d如下:

    def soft_pool3d(x, kernel_size=2, stride=None, force_inplace=False):
        if x.is_cuda and not force_inplace:
            return CUDA_SOFTPOOL3d.apply(x, kernel_size, stride)
        kernel_size = _triple(kernel_size)
        if stride is None:
            stride = kernel_size
        else:
            stride = _triple(stride)
        # Get input sizes
        _, c, d, h, w = x.size()
        # Create per-element exponential value sum : Tensor [b x 1 x d x h x w]
        e_x = torch.sum(torch.exp(x),dim=1,keepdim=True)
        # Apply mask to input and pool and calculate the exponential sum
        # Tensor: [b x c x d x h x w] -> [b x c x d' x h' x w']
        return F.avg_pool3d(x.mul(e_x), kernel_size, stride=stride).mul_(sum(kernel_size)).div_(F.avg_pool3d(e_x, kernel_size, stride=stride).mul_(sum(kernel_size)))
    

    4 实验结果

    4.1 ImageNet-1K分类

    图片

    通过上表可以看出,直接在Backbone的基础上把池化方法替换为SotfPool,效果有明显的提升。

    4.2 视频分类实验

    图片

    可以看出即使是3D CNN Model中SoftPool依然有效。

    5 参考

    [1].Refining activation downsampling with SoftPool.
    [2].https://github.com/alexandrosstergiou/SoftPool.

    本文地址:https://update.blog.csdn.net/article/details/112430549

    展开全文
  • TensorFlow tf.keras.layers.GlobalAveragePooling1D.pdf
  • 分数最大池 在Theano中实施“分数最大缓冲”( ) 怎么办 不相交的伪随机分数最大池,用于2D图像 待办事项 通用版本 输入: 形状分子 形状分母 如何?...池大小决定了池的大小如果没有,则与步幅相同 ...
  • pooling

    千次阅读 2014-04-29 16:58:59
    一般有convolution的地方也会有pooling  虽然按照convolution的方法可以减小不少需要训练的网络参数,比如说96*96,,100个隐含层的,采用8*8patch,也100个隐含层,则其需要训练的参数个数减小到了10^3,大大...
    一、概述

    一般有convolution的地方也会有pooling

       虽然按照convolution的方法可以减小不少需要训练的网络参数,比如说96*96,100Feature Map的,采用8*8patch,也100Feature Map,则其需要训练的参数个数减小到了8×8×100=6400,大大的减小特征提取过程的困难。但是此时同样出现了一个问题,即它的输出向量的维数变得很大,本来完全连接的网络输出只有100维的,现在的网络输出为89*89*100=792100维,大大的变大了,这对后面的分类器的设计同样带来了困难,所以pooling方法就出现了。

      为什么pooling的方法可以工作呢?首先在前面的使用convolution时是利用了图像的stationarity特征,即不同部位的图像的统计特征是相同的,那么在使用convolution对图片中的某个局部部位计算时,得到的一个向量应该是对这个图像局部的一个特征,既然图像有stationarity特征,那么对这个得到的特征向量进行统计计算的话,所有的图像局部块应该也都能得到相似的结果。对convolution得到的结果进行统计计算过程就叫做pooling,由此可见pooling也是有效的。常见的pooling方法有max poolingaverage pooling等。并且学习到的特征具有旋转不变性(这个原因暂时没能理解清楚)。

      从上面的介绍可以简单的知道,convolution是为了解决前面无监督特征提取学习计算复杂度的问题,而pooling方法是为了后面有监督特征分类器学习的,也是为了减小需要训练的系统参数(当然这是在普遍例子中的理解,也就是说我们采用无监督的方法提取目标的特征,而采用有监督的方法来训练分类器)。 


    卷积层是对图像的一个邻域进行卷积得到图像的邻域特征,亚采样层就是使用pooling技术将小邻域内的特征点整合得到新的特征。

    二、pooling分类

    pooling的结果是使得特征减少,参数减少,但pooling的目的并不仅在于此。pooling目的是为了保持某种不变性(旋转、平移、伸缩等),常用的有mean-pooling,max-pooling和Stochastic-pooling三种。

    mean-pooling,即对邻域内特征点只求平均;

    max-pooling,即对邻域内特征点取最大。

    根据相关理论,特征提取的误差主要来自两个方面:

    (1)邻域大小受限造成的估计值方差增大;

    (2)卷积层参数误差造成估计均值的偏移。

    一般来说,mean-pooling能减小第一种误差,更多的保留图像的背景信息,max-pooling能减小第二种误差,更多的保留纹理信息。

    maxpooling的matlab代码:featMap= blockproc(A,[2 2],@(x)max(max(x.data,[],1),[],2))


    Stochastic-pooling则介于两者之间,通过对像素点按照数值大小赋予概率,再按照概率进行亚采样,在平均意义上,与mean-pooling近似,在局部意义上,则服从max-pooling的准则。


    三、Stochastic-pooling

        stochastic pooling方法非常简单,只需对feature map中的元素按照其概率值大小随机选择,即元素值大的被选中的概率也大。而不像max-pooling那样,永远只取那个最大值元素。

      假设feature map中的pooling区域元素值如下:

       

      3*3大小的,元素值和sum=0+1.1+2.5+0.9+2.0+1.0+0+1.5+1.0=10

      方格中的元素同时除以sum后得到的矩阵元素为:

       

      每个元素值表示对应位置处值的概率,现在只需要按照该概率来随机选一个,方法是:将其看作是9个变量的多项式分布,然后对该多项式分布采样即可,theano中有直接的multinomial()来函数完成。当然也可以自己用01均匀分布来采样,将单位长度1按照那9个概率值分成9个区间(概率越大,覆盖的区域越长,每个区间对应一个位置),随机生成一个数后看它落在哪个区间。

      比如如果随机采样后的矩阵为:

       

      则这时候的poolng值为1.5

      使用stochastic pooling时(即test过程),其推理过程也很简单,对矩阵区域求加权平均即可。比如对上面的例子求值过程为为:

         0*0+1.1*0.11+2.5*0.25+0.9*0.09+2.0*0.2+1.0*0.1+0*0+1.5*0.15+1.0*0.1=1.625 说明此时对小矩形pooling后的结果为1.625.

      在反向传播求导时,只需保留前向传播已经记录被选中节点的位置的值,其它值都为0,这和max-pooling的反向传播非常类似。

      Stochastic pooling优点:

      方法简单;

      泛化能力更强;

      可用于卷积层(文章中是与Dropout和DropConnect对比的,说是Dropout和DropConnect不太适合于卷积层. 不过个人感觉这没什么可比性,因为它们在网络中所处理的结构不同);

      至于为什么stochastic pooling效果好,作者说该方法也是模型平均的一种,没怎么看懂。

      关于Stochastic Pooling的前向传播过程和推理过程的代码可参考(没包括bp过程,所以代码中pooling选择的位置没有保存下来)


    LeCun的“Learning Mid-Level Features For Recognition”对前两种pooling方法有比较详细的分析对比,如果有需要可以看下这篇论文。



     参考资料:

     http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial

     http://blog.csdn.net/maxiemei/article/details/17355047

    http://www.cnblogs.com/tornadomeet/archive/2013/05/01/3053238.html

    展开全文
  • 原文 Global Average Pooling(简称...在keras发布的经典模型中,可以看到不少模型甚至抛弃了全连接层,转而使用GAP,而在支持迁移学习方面,各个模型几乎都支持使用Global Average Pooling和Global Max Pooling(G...
  • Precise RoI Pooling(PrRoI Pooling)笔记

    千次阅读 2019-05-27 11:09:00
    Precise ROI Pooling(PrRoI Pooling)方法由旷视科技于ECCV 2018上提出,作为他们的论文Acquisition of Localization Condence for Accurate Object Detection中的一部分。其主要思想如下:
  • 而使用pooling也可以达到增大感受野的目的。 (2) 实现不变性 其中不变形性包括,平移不变性、旋转不变性和尺度不变性。由于pooling对特征图进行抽像,获取的是某个区域的特征,而不关心具体位置,这时当原来的特征图...
  • class PoolingLayer(Layer): """A parent class of MaxPooling2D and AveragePooling2D """ def __init__(self, pool_shape=(2, 2), stride=1, padding=0): self.pool_shape = pool_shape self.stride = stride...
  • Attribute Aware Pooling for Pedestrian Attribute Recognition
  • 文章标题给出了四种Pooling的方法,这feature pooling方法是我在看论文的时候看到的,从最开的PoI Pooling到目前最新的Precise RoI PoolingPooling操作带来的检测精度影响越来越小。这篇文章目的是想梳理一下它们...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,493
精华内容 34,597
关键字:

pooling