TensorFlow中padding的计算填充详解

一、TensorFlow中padding参数

TensorFlow中convolution()的源码是这样介绍padding参数的

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]).

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] - (window_shape[i] - 1) * dilation_rate[i])
         / strides[i]).

我们这里假设输入in_width=in_height,卷积核filter_width=filter_height, strides为步长,下面的内容都是在该假设基础之上进行的,所以dilation_rate为1。更多卷积尺寸可参考https://github.com/vdumoulin/conv_arithmetic。因此,convolution()和pool()输出尺寸可由以下公式计算:

1. 当 padding=‘SAME’ 时,输出宽out_width和高out_height为:

TensorFlow中padding的计算填充详解_第1张图片

2. 当 padding=‘VALID’ 时,输出宽out_width和高out_height为:

二、填充方式

1.在TensorFlow的convolution()和pool()中,数据的填充方式有以下两种,图1和图3对应padding为小数的情况,图2对应padding为整数的情况。

TensorFlow中padding的计算填充详解_第2张图片 TensorFlow中padding的计算填充详解_第3张图片 TensorFlow中padding的计算填充详解_第4张图片

2.具体的计算方法如下:

由(一)中的两个公式我们得到卷积输出的尺寸大小,然后由

计算得到padding的值,如果padding的值为整数,则填充padding圈;如果padding为小数,则填充padding的整数圈以后,再填充半圈,即右侧再填充一列和底侧再填充一行。

例如:padding=0.5对应图1,padding=1对应图2,padding=1.5对应图3,以此类推。

三、试验验证

试验中我们采用50x50的全为1的矩阵作为卷积输入,采用5x5的卷积核,步长为2,通过多次卷积观察输出结果。试验代码https://github.com/xuesci/tf_learning/blob/master/val_padding.py

1. padding='SAME’的试验结果:

TensorFlow中padding的计算填充详解_第5张图片

2. padding='VALID’的试验结果:

TensorFlow中padding的计算填充详解_第6张图片

你可能感兴趣的:(padding)