激活函数的实现(sigmoid、softmax、tanh、relu、leakyrelu、elu、selu、softplus):https://www.cnblogs.com/xiximayou/p/12713081.html

优化器的实现(SGD、Nesterov、Adagrad、Adadelta、RMSprop、Adam):https://www.cnblogs.com/xiximayou/p/12713594.html

包括D的平均池化和最大池化:

classPoolingLayer(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

self.padding=padding

self.trainable=Truedef forward_pass(self, X, training=True):

self.layer_input=X

batch_size, channels, height, width=X.shape

_, out_height, out_width=self.output_shape()

X= X.reshape(batch_size*channels, 1, height, width)

X_col=image_to_column(X, self.pool_shape, self.stride, self.padding)#MaxPool or AveragePool specific method

output =self._pool_forward(X_col)

output=output.reshape(out_height, out_width, batch_size, channels)

output= output.transpose(2, 3, 0, 1)returnoutputdefbackward_pass(self, accum_grad):

batch_size, _, _, _=accum_grad.shape

channels, height, width=self.input_shape

accum_grad= accum_grad.transpose(2, 3, 0, 1).ravel()#MaxPool or AveragePool specific method

accum_grad_col =self._pool_backward(accum_grad)

accum_grad= column_to_image(accum_grad_col, (batch_size * channels, 1, height, width), self.pool_shape, self.stride, 0)

accum_grad= accum_grad.reshape((batch_size,) +self.input_shape)returnaccum_graddefoutput_shape(self):

channels, height, width=self.input_shape

out_height= (height - self.pool_shape[0]) / self.stride + 1out_width= (width - self.pool_shape[1]) / self.stride + 1

assert out_height % 1 ==0assert out_width % 1 ==0returnchannels, int(out_height), int(out_width)classMaxPooling2D(PoolingLayer):def_pool_forward(self, X_col):

arg_max= np.argmax(X_col, axis=0).flatten()

output=X_col[arg_max, range(arg_max.size)]

self.cache=arg_maxreturnoutputdef_pool_backward(self, accum_grad):

accum_grad_col=np.zeros((np.prod(self.pool_shape), accum_grad.size))

arg_max=self.cache

accum_grad_col[arg_max, range(accum_grad.size)]=accum_gradreturnaccum_grad_colclassAveragePooling2D(PoolingLayer):def_pool_forward(self, X_col):

output= np.mean(X_col, axis=0)returnoutputdef_pool_backward(self, accum_grad):

accum_grad_col=np.zeros((np.prod(self.pool_shape), accum_grad.size))

accum_grad_col[:, range(accum_grad.size)]= 1. / accum_grad_col.shape[0] *accum_gradreturn accum_grad_col

需要注意的是池化层是没有可学习的参数的(如果不利用带步长的卷积来代替池化的作用),还有就是池化层反向传播的过程,这里参考:

为了结合代码看直观些,就将其内容摘了下来:

Pooling池化操作的反向梯度传播

CNN网络中另外一个不可导的环节就是Pooling池化操作,因为Pooling操作使得feature map的尺寸变化,假如做2×2的池化,假设那么第l+1层的feature map有16个梯度,那么第l层就会有64个梯度,这使得梯度无法对位的进行传播下去。其实解决这个问题的思想也很简单,就是把1个像素的梯度传递给4个像素,但是需要保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的。

1、mean pooling

mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的,图示如下 :

mean pooling比较容易让人理解错的地方就是会简单的认为直接把梯度复制N遍之后直接反向传播回去,但是这样会造成loss之和变为原来的N倍,网络是会产生梯度爆炸的。

2、max pooling

max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id,这个变量就是记录最大值所在位置的,因为在反向传播中要用到,那么假设前向传播和反向传播的过程就如下图所示 :

python实现卷积_【python实现卷积神经网络】池化层实现相关推荐

  1. 卷积神经网络——池化层学习——最大池化

    池化层(Pooling layers) 除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们来看一下. 先举一个池化层的例子,然后我们再讨论池化层的必要 ...

  2. 卷积神经网络 池化层上采样(upsampling、interpolating)、下采样(subsampled、downsampled)是什么?(上采样为放大图像或图像插值、下采样为缩小图像)

    缩小图像:或称为下采样(subsampled)或降采样(downsampled) 主要目的有两个:1.使得图像符合显示区域的大小:2.生成对应图像的缩略图. 放大图像:或称为上采样(upsamplin ...

  3. python手写神经网络之用im2col实现卷积层、池化层

    简介 im2col就是img to colomn主,要是把图像转成column,原因和用途也很清晰,CNN中数据是四维的,并且有滑动窗口的存在,如果用for循环,计算效率不敢看. 那么原理也很简单,展 ...

  4. 转:卷积神经网络_(1)卷积层和池化层学习

    博主总结的很好,学习中.转载:http://www.cnblogs.com/zf-blog/p/6075286.htm 卷积神经网络_(1)卷积层和池化层学习 卷积神经网络(CNN)由输入层.卷积层. ...

  5. 【数据挖掘】卷积神经网络 ( 池化 | 丢弃 | 批量规范化 | 卷积神经网络完整流程示例 | 卷积 | 池化 | 全连接 | 输出 | 卷积神经网络总结 )

    文章目录 I . 池化 II . 丢弃操作 III . 批量规范化 IV . 卷积神经网络 完整流程示例 ( 1 ) : 原始输入图 V . 卷积神经网络 完整流程示例 ( 2 ) : 卷积层 C1C ...

  6. 1.9 池化层-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.8 简单卷积网络示例 回到目录 1.10 卷积神经网络示例 池化层 (Pooling Layers) 除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度, ...

  7. 卷积神经网络(卷积层,激活函数Relu,池化层,计算公式及API解释)

    1. 卷积神经网络 (卷积层,激活函数,池化层,全连接层) (1)  把神经网络的隐藏层分为卷积层和池化层(又叫下采样层) · 卷积层 :  通过在原始图像上平移来提取特征 ·  池化层 : 通过特征 ...

  8. 深度学习之卷积神经网络(7)池化层

    深度学习之卷积神经网络(7)池化层 在卷积层中,可以通过调节步长参数s实现特征图的高宽成倍缩小,从而降低了网络的参数量.实际上,处理通过设置步长,还有一种专门的网络层可以实现尺寸缩减功能,它就是这里要 ...

  9. 【TensorFlow】TensorFlow从浅入深系列之十二 -- 教你深入理解卷积神经网络中的池化层

    本文是<TensorFlow从浅入深>系列之第12篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维 ...

最新文章

  1. 【Ubuntu】将Ubuntu的源改为国内源
  2. 英伟达Q2营收大涨50%,创下历史新高,游戏业务已不是最大收入来源
  3. 静态路由实验 +http+dns_华为静态路由配置实验
  4. oracle+olh+hive,hadoop+hive+hbase的简单安装 | YallonKing
  5. 报错,null [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException,Failed to con
  6. 1650显卡和1050T显卡差距大吗?
  7. Angular项目构建指南 - 不再为angular构建而犹豫不决
  8. linux下libnet编程 亲自测试可用
  9. 《程序猿的搬砖生活》九、那些伙伴和生活,既是人生也是回忆
  10. (TOJ1224)数据结构练习题——后序遍历二叉树
  11. Sublime 使用笔记(九):汉字乱码问题的解决方法
  12. 克罗内克函数Kronecker Delta【OI Pharos 6.2.1】
  13. Consul 注册中心介绍
  14. 高精度电流检测电路INA199可用于过流保护应用
  15. 没有测试实践就没有发言权
  16. 数学建模国赛美赛(MCM/ICM)赛前准备及比赛过程节奏分享
  17. 学生体育运动主题网页设计——兵乓球国乒网(纯HTML+CSS代码)
  18. Cesium双屏对比
  19. 1054 : 滑动解锁 hihocoder 蓝桥2017模拟
  20. 高端光刻机为什么那么难制造?

热门文章

  1. 学生管理系统php网站,学生信息管理系统 网站之modify.php
  2. mysql存储过程局部变量使用_MySQL存储过程使用输出变量
  3. C#笔记之又谈装箱与拆箱(boxing and unboxing)
  4. 微信小程序侧边栏滑动特效(左右滑动)
  5. java web 中 读取windows图标并显示
  6. 循序渐进之Maven(4) - 第一个SpringMVC项目
  7. 深浅拷贝的应用-copy、mutableCopy
  8. 使用Free Spire.Presentation生成PowerPoint文件
  9. 全面解析Java的垃圾回收机制(转)
  10. 单片机串口通信与同步异步通信