本文首先阐述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)

测试结果:

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

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

  1. paip.编程语言方法重载实现的原理及python,php,js中实现方法重载

    paip.编程语言方法重载实现的原理及python,php,js中实现方法重载 有些语言,在方法的重载上,形式上不支持函数重载,但可以通过模拟实现.. 主要原理:根据参数个数进行重载,或者使用默认值 ...

  2. MapReduce 原理与 Python 实践

    MapReduce 原理与 Python 实践 1. MapReduce 原理 以下是个人在MongoDB和Redis实际应用中总结的Map-Reduce的理解 Hadoop 的 MapReduce ...

  3. GBDT回归的原理及Python实现

    一.原理篇 1.1 温故知新回归树是GBDT的基础,之前的一篇文章曾经讲过回归树的原理和实现.链接如下: 回归树的原理及Python实现 1.2 预测年龄仍然以预测同事年龄来举例,从<回归树&g ...

  4. 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  5. 编解码原理,Python默认解码是ascii

    编解码原理,Python默认解码是ascii 首先我们知道,python里的字符默认是ascii码,英文当然没问题啦,碰到中文的时候立马给跪. 不知道你还记不记得,python里打印中文汉字的时候需要 ...

  6. 主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)

    目录 主成分分析(PCA)——以葡萄酒数据集分类为例 1.认识PCA (1)简介 (2)方法步骤 2.提取主成分 3.主成分方差可视化 4.特征变换 5.数据分类结果 6.完整代码 总结: 1.认识P ...

  7. LDA线性判别分析原理及python应用(葡萄酒案例分析)

    目录 线性判别分析(LDA)数据降维及案例实战 一.LDA是什么 二.计算散布矩阵 三.线性判别式及特征选择 四.样本数据降维投影 五.完整代码 结语 一.LDA是什么 LDA概念及与PCA区别 LD ...

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

    想直接看公式的可跳至第三节 3.公式修正 一.为什么需要SPP 首先需要知道为什么会需要SPP. 我们都知道卷积神经网络(CNN)由卷积层和全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对 ...

  9. BP神经网络原理及python实现

    [废话外传]:终于要讲神经网络了,这个让我踏进机器学习大门,让我读研,改变我人生命运的四个字!话说那么一天,我在乱点百度,看到了这样的内容: 看到这么高大上,这么牛逼的定义,怎么能不让我这个技术宅男心 ...

随机推荐

  1. Linux文件分类

    文件/文件夹分类   分为 普通文件 目录 连接文件link 配置文件(device) 数据接口文件(sockets) 数据传输文件(FIFIO ,pipe)   普通文件   里边有 文本文件 二进 ...

  2. windows下CMake使用图文手册 Part 4

    例子4:链接静态库(.lib) 例子3里面我们构建了date.lib, 这个例子里我们调用这个库. 前提: date.h的头文件在 E:\Playground\CMakeExamples\DateLi ...

  3. [转载]反无人机企业DroneShield利用声音识别侦测无人机

    原文:http://www.cnbeta.com/articles/495071.htm 无人机产业正在蓬勃发展,受益的不仅仅是那些生产小型飞行设备的企业.专家估计仅在澳大利亚就有5万架商用无人机以及 ...

  4. Latex感想

    看人家,一个小女生,被导师逼着,首先对电脑方面理解不多,3天时间,latex已经把Paper框架建立起来,我可以说我自愧不如吗?德鲁克<卓有成效的管理者>说的一次干一件事情,<冬吴相 ...

  5. log level

    ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF

  6. 庆祝下:iOS 开发者企业级计划(299美元/年帐户+邓白氏码免费) 和 Windows Phone公司应用(公司帐户99美元+Symantec企业证书299美元/年))顺利发布成功

    时间:2013-11-15,地址:http://192.168.0.8  网站可下载三个终端应用直接安装IOS,Windows Phone,Android iOS: 企业版IDP通过 iTunes.使 ...

  7. MSSQL 跨数据库连接

    SELECT * FROM opendatasource('sqloledb','data source=192.168.1.197;user id=sa;password=sa').SafetyMo ...

  8. try-catch-finally 引发的奇怪问题

    今天,发现我们的一个Windows Service无法正常停止,无奈之下只能杀了进程. 为了找到原因,我在本地进行调试,发现程序里用到了多线程,而代码正是卡在了workThread.Abort()语句 ...

  9. 艺术品照片融合到背景墙上效果及DEMO

    演示地址: 功能:图片按照角度增加阴影,比较复杂的功能就是当墙面是不规则的时候,贴的艺术品必须按照墙面的角度进行变形处理.

  10. 拒绝访问 temp 目录。用来运行 XmlSerializer 的标识“IIS APPPOOL\UGAS”没有访问 temp 目录的足够权限

    在部署IIS时候会出现下图错误,拒绝访问 temp 目录.用来运行 XmlSerializer 的标识“IIS APPPOOL\UGAS”没有访问 temp 目录的足够权限 解决方法: 在IIS信息管 ...