在tf.nn中“SAME”和“VALID”填充之间的区别是什么?tensorflow的Max_pool ?
在我看来,'VALID'意味着当我们做max pool时,边缘外不会有零填充。
根据深度学习卷积算法指南,它说池操作符中不会有填充,即只使用tensorflow的“VALID”。 但什么是'SAME'填充的最大池张量流量?
在tf.nn中“SAME”和“VALID”填充之间的区别是什么?tensorflow的Max_pool ?
在我看来,'VALID'意味着当我们做max pool时,边缘外不会有零填充。
根据深度学习卷积算法指南,它说池操作符中不会有填充,即只使用tensorflow的“VALID”。 但什么是'SAME'填充的最大池张量流量?
当前回答
我引用了官方tensorflow文档https://www.tensorflow.org/api_guides/python/nn#Convolution中的答案 对于'SAME'填充,输出高度和宽度的计算如下:
out_height = ceil(float(in_height) / float(strides[1]))
out_width = ceil(float(in_width) / float(strides[2]))
顶部和左侧的填充被计算为:
pad_along_height = max((out_height - 1) * strides[1] +
filter_height - in_height, 0)
pad_along_width = max((out_width - 1) * strides[2] +
filter_width - in_width, 0)
pad_top = pad_along_height // 2
pad_bottom = pad_along_height - pad_top
pad_left = pad_along_width // 2
pad_right = pad_along_width - pad_left
对于'VALID'填充,输出高度和宽度的计算如下:
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))
填充值总是0。
其他回答
有三种填充选择:有效(无填充),相同(或一半),满。你可以在这里(Theano)找到解释: http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html
有效或无填充:
有效填充不涉及零填充,因此它只覆盖有效输入,不包括人工生成的零。对于内核大小为k的步幅s=1,则输出长度为((输入长度)- (k-1))。
相同或半填充:
当s=1时,相同的填充使输出的大小与输入的大小相同。如果s=1,补零的个数为(k-1)。
完全填充:
完全填充意味着内核运行整个输入,因此在结束时,内核可能只满足一个输入,其他为零。如果s=1,填充的零的数量是2(k-1)。如果s=1,则输出长度为((输入长度)+ (k-1))。
因此,填充的数量:(有效)<=(相同)<=(满)
当stride为1时(卷积比池化更典型),我们可以想到以下区别:
“SAME”:输出大小与输入大小相同。这就要求滤镜窗口要在输入贴图外滑动,因此需要垫片。 "VALID":过滤器窗口保持在输入映射中的有效位置,因此输出大小缩小为filter_size - 1。没有填充。
这里W和H是输入的宽和高, F为滤波器维数, P是填充大小(即要填充的行数或列数)
对于相同的填充:
对于有效填充:
根据这里的解释和Tristan的回答,我通常使用这些快速函数进行完整性检查。
# a function to help us stay clean
def getPaddings(pad_along_height,pad_along_width):
# if even.. easy..
if pad_along_height%2 == 0:
pad_top = pad_along_height / 2
pad_bottom = pad_top
# if odd
else:
pad_top = np.floor( pad_along_height / 2 )
pad_bottom = np.floor( pad_along_height / 2 ) +1
# check if width padding is odd or even
# if even.. easy..
if pad_along_width%2 == 0:
pad_left = pad_along_width / 2
pad_right= pad_left
# if odd
else:
pad_left = np.floor( pad_along_width / 2 )
pad_right = np.floor( pad_along_width / 2 ) +1
#
return pad_top,pad_bottom,pad_left,pad_right
# strides [image index, y, x, depth]
# padding 'SAME' or 'VALID'
# bottom and right sides always get the one additional padded pixel (if padding is odd)
def getOutputDim (inputWidth,inputHeight,filterWidth,filterHeight,strides,padding):
if padding == 'SAME':
out_height = np.ceil(float(inputHeight) / float(strides[1]))
out_width = np.ceil(float(inputWidth) / float(strides[2]))
#
pad_along_height = ((out_height - 1) * strides[1] + filterHeight - inputHeight)
pad_along_width = ((out_width - 1) * strides[2] + filterWidth - inputWidth)
#
# now get padding
pad_top,pad_bottom,pad_left,pad_right = getPaddings(pad_along_height,pad_along_width)
#
print 'output height', out_height
print 'output width' , out_width
print 'total pad along height' , pad_along_height
print 'total pad along width' , pad_along_width
print 'pad at top' , pad_top
print 'pad at bottom' ,pad_bottom
print 'pad at left' , pad_left
print 'pad at right' ,pad_right
elif padding == 'VALID':
out_height = np.ceil(float(inputHeight - filterHeight + 1) / float(strides[1]))
out_width = np.ceil(float(inputWidth - filterWidth + 1) / float(strides[2]))
#
print 'output height', out_height
print 'output width' , out_width
print 'no padding'
# use like so
getOutputDim (80,80,4,4,[1,1,1,1],'SAME')
Tensorflow 2.0兼容答案:上面已经提供了关于“有效”和“相同”填充的详细解释。
但是,我将在Tensorflow 2中指定不同的池化函数和它们各自的命令。X(>= 2.0),为社区的利益。
1.x中的函数:
tf.nn.max_pool
tf.keras.layers.MaxPool2D
tf中平均池值=>无。神经网络,tf.keras.layers.AveragePooling2D
2.x中的函数:
tf.nn。Max_pool如果在2中使用。如果从1迁移,则tf. compat_v1 .nn.max_pool_v2或tf. compat_v2 .nn.max_pool。X到2。X。
tf.keras.layers。MaxPool2D如果在2中使用。x和
tf. compat_v1 .keras.layers. maxpooling2d或tf. compat_v1 .keras.layers. maxpooling2d或tf. compat_v2 .keras.layers. maxpooling2d或tf. compat_v2 .keras.layers. maxpooling2d,如果从1迁移。X到2。X。
平均池=> tf.nn。Avg_pool2d或tf.keras.layers。如果在TF 2中使用AveragePooling2D。x和
tf. compat_v1 . dn .avg_pool_v2或tf. compat_v2 .v2. dn .avg_pool或tf. compat_v1 .keras.layers. averagepooling2d或tf. compat_v1 .keras.layers. avgpool2d或tf. compat_v2 .keras.layers. averagepooling2d或tf. compat_v2 .keras.layers. avgpool2d,如果从1迁移。X到2。X。
有关Tensorflow迁移的更多信息。X到2。请参考本迁移指南。