python实现卷积_【python实现卷积神经网络】池化层实现
激活函数的实现(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实现卷积神经网络】池化层实现相关推荐
- 卷积神经网络——池化层学习——最大池化
池化层(Pooling layers) 除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们来看一下. 先举一个池化层的例子,然后我们再讨论池化层的必要 ...
- 卷积神经网络 池化层上采样(upsampling、interpolating)、下采样(subsampled、downsampled)是什么?(上采样为放大图像或图像插值、下采样为缩小图像)
缩小图像:或称为下采样(subsampled)或降采样(downsampled) 主要目的有两个:1.使得图像符合显示区域的大小:2.生成对应图像的缩略图. 放大图像:或称为上采样(upsamplin ...
- python手写神经网络之用im2col实现卷积层、池化层
简介 im2col就是img to colomn主,要是把图像转成column,原因和用途也很清晰,CNN中数据是四维的,并且有滑动窗口的存在,如果用for循环,计算效率不敢看. 那么原理也很简单,展 ...
- 转:卷积神经网络_(1)卷积层和池化层学习
博主总结的很好,学习中.转载:http://www.cnblogs.com/zf-blog/p/6075286.htm 卷积神经网络_(1)卷积层和池化层学习 卷积神经网络(CNN)由输入层.卷积层. ...
- 【数据挖掘】卷积神经网络 ( 池化 | 丢弃 | 批量规范化 | 卷积神经网络完整流程示例 | 卷积 | 池化 | 全连接 | 输出 | 卷积神经网络总结 )
文章目录 I . 池化 II . 丢弃操作 III . 批量规范化 IV . 卷积神经网络 完整流程示例 ( 1 ) : 原始输入图 V . 卷积神经网络 完整流程示例 ( 2 ) : 卷积层 C1C ...
- 1.9 池化层-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 1.8 简单卷积网络示例 回到目录 1.10 卷积神经网络示例 池化层 (Pooling Layers) 除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度, ...
- 卷积神经网络(卷积层,激活函数Relu,池化层,计算公式及API解释)
1. 卷积神经网络 (卷积层,激活函数,池化层,全连接层) (1) 把神经网络的隐藏层分为卷积层和池化层(又叫下采样层) · 卷积层 : 通过在原始图像上平移来提取特征 · 池化层 : 通过特征 ...
- 深度学习之卷积神经网络(7)池化层
深度学习之卷积神经网络(7)池化层 在卷积层中,可以通过调节步长参数s实现特征图的高宽成倍缩小,从而降低了网络的参数量.实际上,处理通过设置步长,还有一种专门的网络层可以实现尺寸缩减功能,它就是这里要 ...
- 【TensorFlow】TensorFlow从浅入深系列之十二 -- 教你深入理解卷积神经网络中的池化层
本文是<TensorFlow从浅入深>系列之第12篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维 ...
最新文章
- 【Ubuntu】将Ubuntu的源改为国内源
- 英伟达Q2营收大涨50%,创下历史新高,游戏业务已不是最大收入来源
- 静态路由实验 +http+dns_华为静态路由配置实验
- oracle+olh+hive,hadoop+hive+hbase的简单安装 | YallonKing
- 报错,null [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException,Failed to con
- 1650显卡和1050T显卡差距大吗?
- Angular项目构建指南 - 不再为angular构建而犹豫不决
- linux下libnet编程 亲自测试可用
- 《程序猿的搬砖生活》九、那些伙伴和生活,既是人生也是回忆
- (TOJ1224)数据结构练习题——后序遍历二叉树
- Sublime 使用笔记(九):汉字乱码问题的解决方法
- 克罗内克函数Kronecker Delta【OI Pharos 6.2.1】
- Consul 注册中心介绍
- 高精度电流检测电路INA199可用于过流保护应用
- 没有测试实践就没有发言权
- 数学建模国赛美赛(MCM/ICM)赛前准备及比赛过程节奏分享
- 学生体育运动主题网页设计——兵乓球国乒网(纯HTML+CSS代码)
- Cesium双屏对比
- 1054 : 滑动解锁 hihocoder 蓝桥2017模拟
- 高端光刻机为什么那么难制造?
热门文章
- 学生管理系统php网站,学生信息管理系统 网站之modify.php
- mysql存储过程局部变量使用_MySQL存储过程使用输出变量
- C#笔记之又谈装箱与拆箱(boxing and unboxing)
- 微信小程序侧边栏滑动特效(左右滑动)
- java web 中 读取windows图标并显示
- 循序渐进之Maven(4) - 第一个SpringMVC项目
- 深浅拷贝的应用-copy、mutableCopy
- 使用Free Spire.Presentation生成PowerPoint文件
- 全面解析Java的垃圾回收机制(转)
- 单片机串口通信与同步异步通信