TensorFlow中CNN的两种padding方式“SAME”和“VALID”

TensorFlow中CNN的两种padding方式“SAME”和“VALID”在用 tensorflow 写 CNN 的时候 调用卷积核 api 的时候 会有填 padding 方式的参数 找到源码中的函数定义如下 maxpooling 函数也是一样 defconv2d input filter strides padding use cudnn on gpu None data format None name None 源码中对于 pad


转载请标明出处:http://blog.csdn.net/wuzqchom/article/details/


在用tensorflow调用卷积核api的时候,会有填padding方式的参数,找到源码中的函数定义如下(max pooling也是一样):

def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None) 

源码中对于padding参数的说明如下:

padding: A `string` from: `"SAME", "VALID"`. The type of padding algorithm to use. 

源码中说明padding可以用SAMEVALID两种方式,但是对于这两种方式具体是什么并没有多加说明。
这里用Stack Overflow中的一份代码来简单解释一下,代码如下:

import tensorflow as tf x = tf.constant([[1., 2., 3.], [4., 5., 6.]]) x = tf.reshape(x, [1, 2, 3, 1]) # give a shape accepted by tf.nn.max_pool valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID') same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME') print(valid_pad.get_shape()) print(same_pad.get_shape()) 

最后输出的结果为:

(1, 1, 1, 1) (1, 1, 2, 1) 

可以看出SAME的填充方式是比VALID的填充方式多了一列。
让我们来看看变量 x x x是一个 2 × 3 2\times3 2×3的矩阵,max pooling窗口为 2 × 2 2\times2 2×2,两个维度的步长 s t r i d e s = 2 strides=2 strides=2
第一次由于窗口可以覆盖,橙色区域做max pooling,没什么问题,如下:





TensorFlow中CNN的两种padding方式“SAME”和“VALID”

接下来就是SAMEVALID的区别所在:由于步长为2,当向右滑动两步之后,VALID方式发现余下的窗口不到 2 × 2 2\times2 2×2所以直接将第三列舍弃,而SAME方式并不会把多出的一列丢弃,但是只有一列了不够 2 × 2 2\times2 2×2怎么办?填充!


TensorFlow中CNN的两种padding方式“SAME”和“VALID”

如上图所示,SAME会增加第四列以保证可以达到 2 × 2 2\times2 2×2,但为了不影响原始信息,一般以0来填充。这就不难理解不同的padding方式输出的形状会有所不同了。


当CNN用于文本中时,一般卷积层设置卷积核的大小为n×k,其中k为输入向量的维度(即[n,k,input_channel_num,output_channel_num]),这时候我们就需要选择“VALID”填充方式,这时候窗口仅仅是沿着一个维度扫描而不是两个维度。可以理解为统计语言模型当中的N-gram。

我们设计网络结构时需要设置输入输出的shape,源码nn_ops.py中的convolution函数和pool函数给出的计算公式如下:

 If padding == "SAME": output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i]) If padding == "VALID": output_spatial_shape[i] = ceil((input_spatial_shape[i] - (spatial_filter_shape[i]-1) * dilation_rate[i]) / strides[i]). 

d i l a t i o n _ r a t e dilation\_rate dilation_rate为一个可选的参数,默认为1,这里我们不管。
整理一下,对于VALID,输出的形状计算如下:
n e w _ h e i g h t = n e w _ w i d t h = ⌈ ( W – F + 1 ) S ⌉ new\_height = new\_width =\lceil \frac{ (W – F + 1)} { S} \rceil new_height=new_width=S(WF+1)
对于SAME,输出的形状计算如下:
n e w _ h e i g h t = n e w _ w i d t h = ⌈ W S ⌉ new\_height = new\_width =\lceil \frac{ W } { S}\rceil new_height=new_width=SW
其中, W W W为输入的size, F F F为filter的size, S S S为步长, ⌈ ⌉ \lceil \rceil 为向上取整符号。










版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201461.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午9:20
下一篇 2026年3月20日 上午9:21


相关推荐

  • 聚焦变革:哪些中国AI企业在智能体技术上有突破、落地能力强、有前景?

    聚焦变革:哪些中国AI企业在智能体技术上有突破、落地能力强、有前景?

    2026年3月16日
    1
  • flex布局 水平垂直居中 亲测有效

    flex布局 水平垂直居中 亲测有效flex 布局任何一个容器都可以指定为 Flex 布局 box display flex 行内元素也可以使用 Flex 布局 box display inline flex Webkit 内核的浏览器 必须加上 webkit 前缀 box display webkit flex Safari display flex 注意 设为 Flex 布局以后 子元素的 float clear 和 vertical align 属性将失效 详细请参考 https www run

    2026年3月19日
    2
  • Byte数组转byte数组_java object对象转数组

    Byte数组转byte数组_java object对象转数组这里用到了java对象的序列化,即要求要转换成Byte数组的对象必须是可序列化的。java代码如下:/***对象转Byte数组**@paramobj*@return*@throwsException*/publicstaticbyte[]objectToBytes(Objectobj)throwsException{logger.debug(“object

    2025年10月20日
    5
  • spring整合log4j_log4j和logback同时使用

    spring整合log4j_log4j和logback同时使用常用日志框架log4j、log4j2(log4j的升级版,最常用的)、logback(spring boot默认)、Jboss-logging…等slf4 是日志接口规范,代码对接slf4,实现和具体日志框架解耦,无需修改编码即可切换日志框架。修改pom依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st

    2022年8月8日
    9
  • JavaScript 数组排序函数sort()的使用

    JavaScript 数组排序函数sort()的使用简介  sort()方法是js中对于数组进行排序的函数。其可以方便快捷的实现对于数组的排序而不用我们自己编写排序方法。注:sort()函数会直接改变原数组。1.纯字符串数组排序letmyArray=[“people”,”person”,”apple”,”ziv”]console.log(myArray.sort())//打印结果[‘apple’,’people’,’person’,’ziv’]  其对于字符串数组直接按照字典顺序进行排序。注意:大小写字母也会影响排序结果,大

    2022年5月20日
    44
  • biee java_BIEE入门篇之一 BIEE的安装

    biee java_BIEE入门篇之一 BIEE的安装最早拿到的安装文件的时候 其实是 Siebel7 8 安装界面如下 安装也比较麻烦 安装了 Siebel 之后 还需要安装 tomcat 当然没装 jdk 那还得首先装 jdk 才行 由于不是免费产品 所以在安装前需要获得一个授权文件 这个文件一般不掏钱是拿不到的 登录界面如下 当时觉得 Siebel 不愧是 CRM 领域的专家 其产品在可用性上做的还是不错 起码效果很足 可以在 Web 界面上随意的托拽 图形 曲线 图表

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号