Padding的值

Padding是指在向量的每一维前后填充一定大小的边界,其常用于在卷积和池化这种具有“滤波”窗口的运算中,以调整输出大小、防止个别数据的丢弃

需要注意的是,Padding并不是真的在向量的前后填充了值,而只是标记了padding的位置

卷积和池化在计算时,会先确定滤波窗口的位置,窗口中如果包含了padding,则padding部分并不参与计算

举一个例子来说明这样处理的合理性

假设在做最大池化,向量的形状如上图,末尾有一padding

如果padding有具体的值,比如说0,则这个窗口的输出就为0,padding的值影响了输出的结果,而舍弃了源数据,这与paddding运算的目的相悖

如果padding的值是一个非常小的值,假设是负无穷,在上面的情形下看似不影响结果,但是无法适用于更多的情况,比如卷积,比如平均池化。所以padding不参与计算也有利于实现上的解耦,显然也更节省内存

Padding模式

Padding运算作用于输入向量的每一维,每一维的操作都是一致的,所以理解Padding的操作,只需要理解一维向量的padding过程

假设一个一维向量,输入形状为input_size,经过滤波操作后的输出形状为output_size,滤波窗口为filter_size,需要padding的个数为padding_needed,滤波窗口滑动步长为stride,则之间满足关系:

由公式可知,指定padding_needed可以确定output_size的值,反过来,如果已知输出的形状,则进而可以确定padding的数量。

这是两种处理padding的方案,pytorch采用的是第一种,即在卷积或池化时先确定padding数量,自动推导输出形状;tensorflow和caffe采用的是更为人熟知的第二种,即先根据Valid还是Same确定输出大小,再自动确定padding的数量

Valid和Same是预设的两种padding模式,Valid指不padding,same指输出大小尽可能和输入大小成比例

下面是tensorflow计算padding的代码:

void 

其中考虑了空洞卷积的情况(dilation),所以稍微复杂一些

另外需要格外注意的,代码中计算了padding_after和padding_before两个值,是指要将padding_needed平均分配到向量的两侧。这就引出一个问题,当padding_needed是奇数时,是在前pad多一些,还是在后面pad多一些?

Padding前后

tensorflow特别指出,当padding个数为奇数时,需要在后面多padding一些

caffe则跟tensorflow相反,caffe采用对称padding,相当于会将多余的padding分配给前面

为了兼容两种框架,需要根据配置对padding的策略进行调整

下面解释CUDNN如何调整padding分配的策略

以池化举例,CUDNN池化kernel的参数有:

handleInput. Handle to a previously created cuDNN context.
poolingDescInput. Handle to a previously initialized pooling descriptor.
alpha, betaInput. Pointers to scaling factors (in host memory) used to blend the computation result with prior value in the output layer as follows: dstValue = alpha[0]*result + beta[0]*priorDstValue. Please refer to this section for additional details.
xDescInput. Handle to the previously initialized input tensor descriptor.
xInput. Data pointer to GPU memory associated with the tensor descriptor xDesc.
yDescInput. Handle to the previously initialized output tensor descriptor.
y
Output. Data pointer to GPU memory associated with the output tensor descriptor yDesc.

CUDNN首先需要先制定输入形状和输出形状,xDesc指定了输入向量的形状,ydesc指定了输出向量的形状

然后CUDNN又通过poolingdesc指定了每一维padding_before的值

所以根据公式可以自然推导padding_after的值

stride padding_关于Padding实现的一些细节相关推荐

  1. 关于使用position:fixed之后附加margin/padding的一些影响细节

    ① 未设置(left/right/top/bottom属性)方位   ->    该元素表现为包裹性(与内联元素的效果相似,目前来说margin和padding与内联元素中的margin/pad ...

  2. cnn stride and padding_经典CNN网络解析

    NIN网络-Network In Network​blog.csdn.net 梦里寻梦:(四十二)通俗易懂理解--CNN网络框架演进:LeNet至DenseNet​zhuanlan.zhihu.com ...

  3. CNN中stride(步幅)和padding(填充)的详细理解

    步幅:卷积核经过输入特征图的采样间隔 填充:在输入特征图的每一边添加一定数目的行列,使得输出的特征图的长.宽 = 输入的特征图的长.宽 两个参数的核心: 设置步幅的目的:希望减小输入参数的数目,减少计 ...

  4. PyTorch学习笔记(9)——nn.Conv2d和其中的padding策略

    一. Caffe.Tensorflow的padding策略 在之前的转载过的一篇文章--<tensorflow ckpt文件转caffemodel时遇到的坑>提到过,caffe的paddi ...

  5. PyTorch中池化层的padding和ceil_mode参数设置

    在池化操作的接口中,padding和ceil_mode这两个参数会影响到输出特征图的大小.padding即对特征图大小进行扩充的像素数量:ceil_mode指明,当剩余的像素不足滤波器大小,是否仍对这 ...

  6. Tensorflow 1.x 和 Pytorch 中 Conv2d Padding的区别

    Tensorflow 和 Pytorch 中 Conv2d Padding的区别 Pytorch中Conv2d的Padding 可以是整数,二元组,字符串三种形式. 整数(int).如果输入的padd ...

  7. Pytorch和CNN图像分类

    Pytorch和CNN图像分类 PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序.它主要由Facebookd的人工智能小组开发,不仅能够实现强大的GPU加速, ...

  8. 图像风格迁移也有框架了

    选自Medium 作者:Philip Meier 机器之心编译 编辑:陈萍 易于使用的神经风格迁移框架 pystiche. 将内容图片与艺术风格图片进行融合,生成一张具有特定风格的新图,这种想法并不新 ...

  9. 轻松学Pytorch-使用卷积神经网络实现图像分类

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|人工智能与算法学习 大家好,本篇教程的贡献者来自社区投稿作 ...

最新文章

  1. hdfs web_ui深入讲解、服务启动日志分析、NN SNN关系
  2. android 帧动画旋转,安卓动画实现
  3. iOS之深入解析Objective-C和Swift初始化
  4. Apache Camel 2.14中的更多指标
  5. python局部静态变量_全局变量、局部变量和静态变量
  6. XWiki 6.3 M1 发布,Java 的 Wiki 系统
  7. 史上最全的phpstorm常用配置
  8. php list each搭配循环
  9. PayPal支付配置
  10. ERP原理:第二节 物料清单(BOM)
  11. hive 漫威the_2021年即将上映的漫威电影
  12. 计算机网络面试题汇总
  13. 【那些年我们用过的Redis】还记得大明湖畔那些Redis数据吗?
  14. 2013MDCC 参观有感
  15. Spark数据倾斜解决
  16. Uninstall Tool 破解手记
  17. 数据结构 栈 括弧匹配检验
  18. 讯飞智能录音笔SR502内存升级,实力更强大
  19. 解决硬盘分区错误, 纯Dos磁盘工具Diskpart的用法.
  20. android/IOS NTP 获取在线的GMT 网络时间

热门文章

  1. 03-redis数据持久化
  2. 对Python的认识以及以及Python变量简单的数据类型总结
  3. 状态空间搜索好题UVA10603
  4. Impala使用RPM安装过程
  5. Oracle分析函数之FIRST_VALUE和LAST_VALUE
  6. 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“信号量”
  7. 使用 ADO.NET 访问 Oracle 9i 存储过程
  8. Android对话框的高级设置《二》设置对话框按钮的透明度和对话框的在屏幕上的显示位置
  9. sql 24小时格式_初学SQL,80%都会踩的5个坑
  10. gdb学习汇编(三)