TensorFlow 中卷积操作和池化操作中都有一个参数 padding,其可选值有 ['VALID', 'SAME']。

在 TensorFlow 文档中只是给出了输出张量的维度计算方式,但是并没有说明当 padding='SAME' 时,如何进行补零操作。

其给出的输出张量的维度计算公式:

VALID 方式:

output_shape[i] = ceil((input_shape[i] - (filter_shape[i] - 1) * dilation_rate[i]) / strides[i])
# 但实际上几乎不会去管 dilation_rate 参数,都是 1,于是
output_shape[i] = ceil((input_shape[i] - filter_shape[i] + 1) / strides[i])
# 上式也是常见的
output_shape[i] = floor((input_shape[i] - filter_shape[i]) / strides[i]) + 1
# 一般我们只对图像平面上做卷积和池化,也就是一般 i 指的是图像平面上的 height 和 width

SAME 方式:

output_shape[i] = ceil(input_shape[i] / strides[i])

VALID 方式其实是很好理解的,主要是 SAME 的 padding 方式,应该怎么样补零?

假设输入的张量平面上是 W×W 的矩阵,不考虑 batch 和 channel 这两个维度;filter 是 w×w 的矩阵;strides=[s, s]。暂时考虑在第 0 轴上,设需要补零的列数为 x,易知我们进行补零操作后,执行的就是以 VALID 方式进行的卷积,而且卷积后该矩阵的 shape=[new_W, new_W],所以:

floor((W + x - w) / s) + 1 = new_W

因为 floor 是向下取整,所以:

0 ≤ (W + x - w) / s - (new_W - 1) < 1

由简单的不等式可以求出:

(s * (new_W - 1) + w - W) ≤ x < (s * new_W + w - W)

但实际上只要是按照 VALID 方式进行卷积,那多余的行或者列必然是被丢弃的,所以 x 取最小值就行。如果得到 min(x) = 3,那应该怎么补零呢?当需要补零的列(还是只在第 0 轴考虑,因为第 1 轴上情况完全相同)数为 x 时,需要补零的列数为:

padding_for_left = |x / 2| (向下取整操作),padding_for_right = x - padding_for_left。涉及到上下时(也就是考虑高度方向时),把 left 换成 top,right 换成 bottom 即可。

下面使用一点代码片段来验证一下:

import numpy as np
import tensorflow as tf input_7 = tf.constant([[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7],
[2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7],
[3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7],
[4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7],
[5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7],
[6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7],
[7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7]]) input_7 = tf.reshape(input_7, [1, 7, 7, 1])
filter = tf.constant(np.ones([4, 4, 1, 1]), dtype=tf.float32)
stride = [1, 3, 3, 1]
conv_output = tf.nn.conv2d(input_7, filter=filter, strides=stride, padding='SAME') with tf.Session() as sess:
output = sess.run(conv_output)
shape = output.shape[1], output.shape[2]
print(output.reshape(shape))
# 本测试中,W=7, s=3, w=4

上述代码输出结果为:

[[19.8      29.4      15.9     ]
[56.4 79.200005 41.199997]
[40.2 55.600002 28.599998]]

这里计算出来的需要补零的列数为 3,如果简单的计算一下就可以知道在上边界和左边界分别补零一次,右边界和下边界补零两次(一次表示一行或者一列)。

而且通过计算可以看出,TensorFlow 是真的在进行补零,而不是边界复制或者镜像,更不是块复制,不是很明白为什么不进行边界复制,边界复制不是更好吗?

另外,池化过程和卷积操作有点区别,那就是卷积的 padding 是进行补零操作,但是池化并不是补零,而是补 -inf,-inf 表示负无穷大。为什么这样补值呢?因为我们的输出靠近边界的那些行或者列并不可能全是正数,也可能存在负数,但是负数是有意义的,是我们的网络提取出来的有意义的值,如果补零,那么就会丢失这些细节信息,所以补 -inf 保证这些信息能保留下来。

记录:TensorFlow 中的 padding 方式的更多相关文章

  1. Tensorflow中的padding操作

    转载请注明出处:http://www.cnblogs.com/willnote/p/6746668.html 图示说明 用一个3x3的网格在一个28x28的图像上做切片并移动 移动到边缘上的时候,如果 ...

  2. Tensorflow中使用tfrecord方式读取数据-深度学习-周振洋

    本博客默认读者对神经网络与Tensorflow有一定了解,对其中的一些术语不再做具体解释.并且本博客主要以图片数据为例进行介绍,如有错误,敬请斧正. 使用Tensorflow训练神经网络时,我们可以用 ...

  3. 卷积运算的本质,以tensorflow中VALID卷积方式为例。

    卷积运算在数学上是做矩阵点积,这样可以调整每个像素上的BGR值或HSV值来形成不同的特征.从代码上看,每次卷积核扫描完一个通道是做了一次四重循环.下面以VALID卷积方式为例进行解释. 下面是pyth ...

  4. tensorflow中卷积、转置卷积具体实现方式

    卷积和转置卷积,都涉及到padding, 那么添加padding 的具体方式,就会影响到计算结果,所以搞清除tensorflow中卷积和转置卷积的具体实现有助于模型的灵活部署应用. 一.卷积 举例说明 ...

  5. Tensorflow中卷积的padding方式

    根据tensorflow中的Conv2D函数,先定义几个基本符号: 输入矩阵W*W,这里只考虑输入宽高相等的情况,如果不相等,推导方法一样 filter矩阵F*F,卷积核 stride值S,步长 输出 ...

  6. 【TensorFlow】一文弄懂CNN中的padding参数

    在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和 ...

  7. TensorFlow中设置学习率的方式

    目录 1. 指数衰减 2. 分段常数衰减 3. 自然指数衰减 4. 多项式衰减 5. 倒数衰减 6. 余弦衰减 6.1 标准余弦衰减 6.2 重启余弦衰减 6.3 线性余弦噪声 6.4 噪声余弦衰减 ...

  8. 【转载】 Tensorflow中padding的两种类型SAME和VALID

    原文地址: https://blog.csdn.net/jasonzzj/article/details/53930074 -------------------------------------- ...

  9. 记录Linq中lambda动态表达式的使用方式

    项目中有的时候我们会用到动态表达式的方式去查询数据,这里简单记录下个人的使用方式,方便使用↓ //构建参数表达式 ParameterExpression parameter = Expression. ...

随机推荐

  1. oracle中insert 多条数据方法

    oracle中的insert 和 mysql添加多条数据的 方式不太一样 用到的语法: insert all into 表名(需要添加的表字段)values(添加的字段数据一定要对应字段顺序) int ...

  2. 像azure一样桌面显示Windows系统信息

    介绍 我们在使用azure的公有云时,可以看到打开虚拟机时右上角可以显示系统配置信息和公网私有地址,很好奇如何做到的,终于经过询问一位微软的朋友,他帮我找到了这个工具 工具地址:https://tec ...

  3. 解决myeclipse项目中,多出的WebContent文件夹

    由于通过svn导入项目,导致项目中多出WebContent文件夹,而在此之前正常的是WebRoot文件夹.这个WebContent删了之后还会自己冒出来. 直到我发现篇博客:http://blog.s ...

  4. 嵌入式开发板LInux更新系统、安装软件、下载资源碰到的问题

    CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none 先同步系统时间 shell 输入命令 date 如果显示的时间跟你本地时间不一样,先设 ...

  5. 乘风破浪:LeetCode真题_029_Divide Two Integers

    乘风破浪:LeetCode真题_029_Divide Two Integers 一.前言     两个整数相除,不能使用乘法除法和取余运算.那么就只能想想移位运算和加减法运算了. 二.Divide T ...

  6. 远程登录Linux(window下操作Linux)

    参考文章:http://www.runoob.com/linux/linux-remote-login.html 1.Window系统上 Linux 远程登录客户端有SecureCRT, Putty, ...

  7. intellij IDEA软件java项目No SDK配置jdk开发,安装IDEA软件步骤

    我们在使用intellij idea开发java项目的时候,我们在创建的时候会发现提示No SDK,影响创建和使用项目,我们需要下载和配置需要的JDK 电脑 1我们使用intellij idea创建j ...

  8. WCF简单实例--用Winform启动和引用

    以订票为例简单应用wcf程序,需要的朋友可以参考下 本篇转自百度文档,自己试过,确实可以用. 以订票为例简单应用wcf 新建一个wcf服务应用程序 在IService1.cs定义服务契约 namesp ...

  9. Docker Java应用日志时间和容器时间不一致

    1.在docker容器和系统时间不一致是因为docker容器的原生时区为0时区,而国内系统为东八区. 2.还有容器中运行的java应用打出的日志时间和通过date -R方式获取的容器标准时间有八个小时 ...

  10. 写出js内存泄漏的问题?

    回答一: (1)IE7/8 DOM对象或者Active对象循环引用导致内存泄漏 a.多个对象循环引用 b.循环的DOM泄漏 (2)基础的DOM泄漏 当原有的DOM被移除时,子节点引用没有被移除则无法回 ...