zoukankan      html  css  js  c++  java
  • 基于TensorFlow理解CNN中的padding参数

    1 TensorFlow中用到padding的地方

    在TensorFlow中用到padding的地方主要有tf.nn.conv2d(),tf.nn.max_pool(),tf.nn.avg_pool()等,用法如下:

    tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,name=None) #来进行(二维数据)卷积操作
    
    tf.nn.max_pool_with_argmax(input, ksize, strides, padding, Targmax=None, name=None) #实现最大池化
    
    tf.nn.max_pool(value, ksize, strides, padding, name=None) #实现平均池化
    

    当使用上边函数的时候需要传入所需的值,padding的值为字符串,可选值为'SAME' 和 'VALID' 。

    2 为什么要padding

    先介绍什么是padding。padding参数的作用是决定在进行卷积或池化操作时,是否对输入的图像矩阵边缘补0,'SAME' 为补零,'VALID' 则不补。其原因是因为在操作过程中过滤器可能不能将某个方向上的数据刚好处理完。

    再说为什么要进行padding。举个例子来说:当步长为5,卷积核尺寸为6×6时,当padding为VALID时,则可能造成数据丢失(如上边的图),当padding为SAME时,则对其进行补零(如下边的图)。

    最后从下图理解VALID与SAME两种模式的操作:“VALID”模式表示:当filter全部在image里面的时候,进行卷积运算。“SAME”模式表示:当filter的中心(K)与image的边角重合时,开始做卷积运算。

    VALID 模式
    SAME 模式

    3 关于padding的计算

    首先,定义变量:

    • 输入图片的宽和高:i_w 和 i_h
    • 输出特征图的宽和高:o_w 和 o_h
    • 过滤器的宽和高:f_w 和 f_h
    • 宽和高方向的步长:s_w 和 s_h
    • 宽和高方向总的补零个数:pad_w 和 pad_h
    • 顶部和底部的补零个数:pad_top 和 pad_bottom
    • 左部和右部的补零个数:pad_left 和 pad_right

    3.1 VALID模式

    输出的宽和高为:

    o_w = (i_w - f_w + 1)/ s_w #(结果向上取整)
    o_h = (i_h - f_h + 1)/ s_h  #(结果向上取整)
    

    3.2 SAME模式

    输出的宽和高为:

    o_w = i_w / s_w#(结果向上取整)
    o_h = i_h / s_h#(结果向上取整)
    

    各个方向的补零个数为:max()为取较大值,

    pad_h = max(( o_h -1 ) × s_h + f_h - i_h , 0)
    pad_top = pad_h / 2  # 注意此处向下取整
    pad_bottom = pad_h - pad_top
    
    pad_w = max(( o_w -1 ) × s_w + f_w - i_w , 0)
    pad_left = pad_w / 2 # 注意此处向下取整
    pad_right = pad_w - pad_left
  • 相关阅读:
    【ORA-02049】超时分布式事务处理等待锁 解决方法
    Git使用出错:Couldn‘t reserve space for cygwin‘s heap, Win32
    JS身份证号码校验
    linux 下查看cpu位数 内核等参数命令(转)
    linux ps命令,查看进程cpu和内存占用率排序(转)
    JAVA图片验证码
    JAVA BigDecimal 小数点处理
    Linux命令大全
    Eclipse Java注释模板设置详解
    JSONArray的应用
  • 原文地址:https://www.cnblogs.com/Terrypython/p/10809584.html
Copyright © 2011-2022 走看看