pooling的原理与Python实现

本文首先阐述pooling所对应的操作,然后分析pooling背后蕴含的一些道理,最后给出pooling的Python实现。

一、pooling所对应的操作

首先从整体上对pooling有一个直观的概念(也就是对pooling的输入、输出以及具体功能进行描述,但是忽略具体的实现细节):pooling的输入是一个矩阵,输出是一个矩阵;完成的功能是,对输入矩阵的一个局部区域进行运作,使得该区域对应的输出能够最佳的代表该区域的特性。如图1所示,左图黄色矩阵代表输入矩阵,右图蓝色矩阵代表输出矩阵;动态的橙色矩阵代表选定输入矩阵的一个局部区域,然后寻找出该区域的一个最佳代表出来,最后将所有选出的代表按照与原始输入矩阵对应的空间位置关系在输出矩阵中进行排序。

这一过程可以用选举过程来类比。假如要选北京市长,一种可行的做法是,北京的每一个区各选一个最符合该区权益的代表,然后由选出的代表们决定如何选取北京市长。当然了,我们希望每一个区选出的代表最能符合该区的权益。与pooling做一个简单类比,北京〈-〉输入矩阵;朝阳区、海淀区等〈-〉局部区域;各区代表〈-〉输出矩阵(如果他们开会的时候按照地理位置就坐,这就和pooling的特性很像了)。

图1 pooling对特征的操作示意图

二、pooling背后蕴含的道理

在局部区域选取代表的过程中,我们一般的做法是:选取该区域最有声望的人作为代表(对应max pooling)或者选取最能代表该区域所有人一般特性的人作为代表(对应mean pooling),于此对应的是,pooling中也存在两种常用的做法:局部区域值最大的胜出作为该区域的代表或者将该区域所有的值取平均作为该区域的代表。

选取该区域最有声望的人作为代表 vs 选取最能代表该区域所有人一般特性的人作为代表 好处是:

1) 局部区域最有声望的人在选市长时不宜出现偏差,但他有可能倚老卖老,不能代表该区域一般民众的看法(局部的最大值,容易忽略该区域的一般特性)

2) 最能代表该区域所有人一般特性的人虽然能够代表该区域所有居民的最大权益,但是由于他的认知能力有限(局部均值较小,所以说他认知能力有限),在选市长时容易出现偏差。

3) 如果该区域内的人存在一定程度的自由活动的话(对应的是平移、旋转不变性),对上述两种选代表的方式基本是没有影响的。

pooling的正规解释

根据相关理论:(1)邻域大小受限造成的估计值方差增大;(2)误差造成估计均值的偏移。一般来说,mean-pooling能减小第一种误差,更多的保留图像的背景信息,max-pooling能减小第二种误差,更多的保留纹理信息。

一般情况下pooling的输入维度高、输出维度低,这在一定程度上可以理解为降维,根据上述对pooling原理的阐述,我们可以推断,这种降维过程极大的保留了输入的一些最重要的信息。在实际应用pooling的过程中,我们需要根据实际问题的特点,具体分析了。其实,知道了pooling的操作及其原理,如果她与具体问题结合的较好,则不失为一个很好的创新点哦,哈哈。

三、pooing的Python实现

笔者在写代码时的一些思考如下,核心就是将一个复杂问题拆分为一个可以直接用代码实现的问题:

1) 输入矩阵可以为mxn,也可以为mxnxp,如果直接考虑这两种形式写代码的时候无从下手(要考虑的情况有点多,并且多维的矩阵我自己容易搞晕)。仔细分析发现如果我将        mxn矩阵的pooling实现,那么mxnxp矩阵就可以运用mxn矩阵的实现轻而易举实现了。

2) 针对mxn矩阵输入,有可能图1橙色方框不能恰好覆盖输入矩阵,因此需要对输入矩阵进行扩展。扩展也很简单,只要最后一个poolStride对应的poolSize能够覆盖输入矩阵,      其他的肯定可以覆盖了。

3) 最后就是for循环进行类似操作过程处理了。

def pooling(inputMap,poolSize=3,poolStride=2,mode=‘max‘):
    """INPUTS:
              inputMap - input array of the pooling layer
              poolSize - X-size(equivalent to Y-size) of receptive field
              poolStride - the stride size between successive pooling squares

       OUTPUTS:
               outputMap - output array of the pooling layer

       Padding mode - ‘edge‘
    """
    # inputMap sizes
    in_row,in_col = np.shape(inputMap)

    # outputMap sizes
    out_row,out_col = int(np.floor(in_row/poolStride)),int(np.floor(in_col/poolStride))
    row_remainder,col_remainder = np.mod(in_row,poolStride),np.mod(in_col,poolStride)
    if row_remainder != 0:
        out_row +=1
    if col_remainder != 0:
        out_col +=1
    outputMap = np.zeros((out_row,out_col))

    # padding
    temp_map = np.lib.pad(inputMap, ((0,poolSize-row_remainder),(0,poolSize-col_remainder)), ‘edge‘)

    # max pooling
    for r_idx in range(0,out_row):
        for c_idx in range(0,out_col):
            startX = c_idx * poolStride
            startY = r_idx * poolStride
            poolField = temp_map[startY:startY + poolSize, startX:startX + poolSize]
            poolOut = np.max(poolField)
            outputMap[r_idx,c_idx] = poolOut

    # retrun outputMap
    return  outputMap

# 测试实例

test = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
test_result = pooling(test, 2, 2, ‘max‘)
print(test_result)

测试结果:

总结: 先理解一项技术的输入、输出以及其完成的功能;然后在生活中寻找类似的例子;最后,将该项技术分解为可以实现的步骤。

时间: 2024-08-01 17:41:27

pooling的原理与Python实现的相关文章

主成分分析法原理及其python实现

主成分分析法原理及其python实现 前言: 这片文章主要参考了Andrew Ng的Machine Learning课程讲义,我进行了翻译,并配上了一个python演示demo加深理解. 本文主要介绍一种降维算法,主成分分析法,Principal Components Analysis,简称PCA,这种方法的目标是找到一个数据近似集中的子空间,至于如何找到这个子空间,下文会给出详细的介绍,PCA比其他降维算法更加直接,只需要进行一次特征向量的计算即可.(在Matlab,python,R中这个可以

机器学习-朴素贝叶斯原理及Python实现

机器学习-朴素贝叶斯原理及Python实现 贝叶斯公式 P(A|B) = (P(B|A)P(A))/P(B) 举例:苹果10个,有2个黄色:梨10个,有6个黄色,求拿出一个黄色水果,是苹果的概率. 代入公式: P(苹果|黄色) = (P(黄色|苹果)P(苹果))/P(黄色) P(黄色) = (2+6)/20 = 2/5 P(苹果) = 10/20 = 1/2 = 0.5 P(黄色|苹果)=1/5 P(黄色|苹果)P(苹果) = P(黄色,苹果) = 1/5*1/2 = 1/10 = 0.1 P(

空间金字塔池化(Spatial Pyramid Pooling, SPP)原理和代码实现(Pytorch)

想直接看公式的可跳至第三节 3.公式修正 一.为什么需要SPP 首先需要知道为什么会需要SPP. 我们都知道卷积神经网络(CNN)由卷积层和全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对数据大小有要求的则是第一个全连接层,因此基本上所有的CNN都要求输入数据固定大小,例如著名的VGG模型则要求输入数据大小是 (224*224) . 固定输入数据大小有两个问题: 1.很多场景所得到数据并不是固定大小的,例如街景文字基本上其高宽比是不固定的,如下图示红色框出的文字. 2.可能你会说可以

颜色矩原理及Python实现

原理 颜色矩(color moments)是由Stricker 和Orengo所提出的一种非常简单而有效的颜色特征.这种方法的数学基础在于图像中任何的颜色分布均可以用它的矩来表示.此外,由于颜色分布信息主要集中在低阶矩中,因此仅采用颜色的一阶矩(mean).二阶矩(variance)和三阶矩(skewness)就足以表达图像的颜色分布.与颜色直方图相比,该方法的另一个好处在于无需对特征进行向量化.因此,图像的颜色矩一共只需要9个分量(3个颜色分量,每个分量上3个低阶矩),与其他的颜色特征相比是非

BP算法从原理到python实现

BP算法从原理到实践 反向传播算法Backpropagation的python实现 觉得有用的话,欢迎一起讨论相互学习~Follow Me 博主接触深度学习已经一段时间,近期在与别人进行讨论时,发现自己对于反向传播算法理解的并不是十分的透彻,现在想通过这篇博文缕清一下思路.自身才疏学浅欢迎各位批评指正. 参考文献 李宏毅深度学习视频 The original location of the code 关于反向传播算法的用途在此不再赘述,这篇博文主要是理解形象化理解反向传播算法与python进行实

短时傅里叶变换(Short Time Fourier Transform)原理及 Python 实现

原理 短时傅里叶变换(Short Time Fourier Transform, STFT) 是一个用于语音信号处理的通用工具.它定义了一个非常有用的时间和频率分布类, 其指定了任意信号随时间和频率变化的复数幅度. 实际上,计算短时傅里叶变换的过程是把一个较长的时间信号分成相同长度的更短的段, 在每个更短的段上计算傅里叶变换, 即傅里叶频谱. 短时傅里叶变换通常的数学定义如下: 其中, DTFT (Decrete Time Fourier Transform) 为离散时间傅里叶变换.  其数学公

线程池原理及python实现

https://www.cnblogs.com/goodhacker/p/3359985.html 为什么需要线程池 目前的大多数网络服务器,包括Web服务器.Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短. 传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务.任务执行完毕后,线程退出,这就是是"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短

catboost原理以及Python代码

原论文:    http://learningsys.org/nips17/assets/papers/paper_11.pdf catboost原理: One-hot编码可以在预处理阶段或在训练期间完成.后者对于训练时间而言能更有效地执行,并在Catboost中执行. 类别特征: 为了减少过拟合以及使用整个数据集进行训练,Catboost使用更有效的策略. 1.对输入的观察值的集合进行随机排列,生成多个随机排列: 2.给定一个序列,对于每个例子,对于相同类别的例子我们计算平均样本值: 3.使用

深入学习主成分分析(PCA)算法原理及其Python实现

一:引入问题 首先看一个表格,下表是某些学生的语文,数学,物理,化学成绩统计: 首先,假设这些科目成绩不相关,也就是说某一科目考多少分与其他科目没有关系,那么如何判断三个学生的优秀程度呢?首先我们一眼就能看出来,数学,物理,化学这三门课的成绩构成了这组数据的主成分(很显然,数学作为第一主成分,因为数据成绩拉的最开). 那么为什么我们能一眼看出来呢? 当然是我们的坐标轴选对了!! 下面,我们继续看一个表格,下标是一组学生的数学,物理,化学,语文,历史,英语成绩统计: 那么这个表我们能一眼看出来吗?