原文地址:

http://blog.csdn.net/wuzqchom/article/details/74785643

---------------------------------------------------------------------------------------

在用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的填充方式多了一列。

让我们来看看变量xx是一个2×32×3的矩阵,max pooling窗口为2×22×2,         两个维度的步长strides=2strides=2。

第一次由于窗口可以覆盖,橙色区域做max pooling,没什么问题,如下:

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

如上图所示,SAME会增加第四列以保证可以达到2×22×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]).

dilation_rate为一个可选的参数,默认为1,这里我们先不管。

整理一下,对于VALID,输出的形状计算如下:

对于SAME,输出的形状计算如下:

其中,

W为输入的size,

F为filter的size,

S为步长,

为向上取整符号。FF为filter的size,SS为步长,⌈⌉为向上取整符号。

FF为filter的size,SS为步长,⌈⌉为向上取整符号。

FF为filter的size, FF为filter的size

--------------------------------------------------------------------------

【转载】 TensorFlow中CNN的两种padding方式“SAME”和“VALID”的更多相关文章

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

    来源 dilation_rate为一个可选的参数,默认为1,这里我们可以先不管它. 整理一下,对于"VALID",输出的形状计算如下: new_height=new_width=⌈ ...

  2. Springboot中IDE支持两种打包方式,即jar包和war包

    Springboot中IDE支持两种打包方式,即jar包和war包 打包之前修改pom.xml中的packaging节点,改为jar或者war    在项目的根目录执行maven 命令clean pa ...

  3. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  4. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  5. Java中String对象两种赋值方式的区别

    本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...

  6. 细说java中Map的两种迭代方式

    曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...

  7. Android中Fragment的两种创建方式

    fragment是Activity中用户界面的一个行为或者是一部分.你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activity中再使用.你可以认 ...

  8. Java中容器的两种初始化方式比较

    List,Set,Map的两种初始化赋值方式  List List<Integer> list2 = new ArrayList<Integer>(); for (int i= ...

  9. android中的OnClickListener两种实现方式

    android的activity点击事件中,通过OnClickListener来实现,要实现点击事件有两种方式 1.通过定义一个OnClickListener的内部类来实现 The example b ...

  10. eclipse中testNG的两种安装方式

    今天给大家带来两种关于testNG中的安装方式:1.在线安装(本人亲测有效!!!)2.离线安装 一.在线安装testNG插件的步骤: 1.给大家提供一个testNG在线的安装的地址:http://dl ...

随机推荐

  1. You are currently using minified code outside of NODE_ENV === 'production'. This means that you are running a slower development build of Redux.

    You are currently using minified code outside of NODE_ENV === 'production'. This means that you are ...

  2. Win32 拆分窗口

    前两天学习了MFC的拆分窗口,今天来学习Win32 SDK下如何拆分窗口. win32是没有像MFC那样直接有函数方法拆分窗口,只能自己处理了. 1.在WM_CREATE消息中创建两个控件,TreeV ...

  3. portainer控制多个docker

    打开docker的远程访问(参考下方博客) 觉得不安全可以配置 使用 TLS 加密 https://www.cnblogs.com/hongdada/p/11512901.html 使用新版本port ...

  4. 一种PyInstaller中优雅的控制包大小的方法

    PyInstaller会在打包时自动为我们收集一些依赖项,特别是我们在打包PyQt/PySide相关的应用时,PyInstaller会自动包含我们程序通常不需要的文件,如'tanslations'文件 ...

  5. [kubernetes]使用kubeadm和containerd部署kubernetes

    前言 因宿主机内核版本限制和垂直伸缩特性的需要,安装的k8s版本为1.25,runtime为containerd,cni为calico. containerd.kubeadm.kubelet也可以用包 ...

  6. Java 集合工具包

    Java 集合工具包 Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等. Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分 ...

  7. 一文了解svg之stroke属性

    属性 stroke-width SVG具有stroke-width定义笔触宽度的CSS属性. <svg width="500" height="120"& ...

  8. 小tips:npm与npx的区别

    npm npm是Node.js的软件包管理器,其目标是自动化的依赖性和软件包管理. 这意味着,可以在package.json文件中为项目指定所有依赖项(软件包),当需要为其安装依赖项时,只要运行npm ...

  9. DECL: 针对噪声时间序列的去噪感知对比学习《Denoising-Aware Contrastive Learning for Noisy Time Series》(时间序列、对比学习、去噪)

    今天是2024年9月12日,组会摸鱼,很久没看论文了,在摸鱼看代码,最近IJCAI 2024出来了,找了几篇论文看,首先这是第一篇. 论文:Denoising-Aware Contrastive Le ...

  10. Angular 18+ 高级教程 – Component 组件 の Control Flow

    前言 Control Flow 是 Angular v17 版本后推出的新模板语法,用来取代 NgIf.NgForOf.NgSwitch 这 3 个 Structure Directive. Stru ...