我有以下参数:
in_height = 28
in_width = 28
stride (s) = 2
padding (p) = 'SAME'
'SAME'填充的想法是当s = 1时输入地图和输出地图尺寸(高度,宽度)应该保持相同
因此,如果我能够使用以下内容获得填充大小:
(28 + 2*p - 5) + 1 = 28
Solving gives p = 2
这意味着2的每一边都应该有一个填充
使用p=2
输出地图大小为:
(28 + 4 -5)/2 + 1 = 14
来自Tensorflow文档,Same Padding
:
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
要遵循以上原则:
out_height = ceil(28.0/2.0) = 14.0
out_width = ceil(28.0/2.0) = 14.0
因此
pad_along_height = max((14.0 -1)*2 + 5 - 28,0) = 3
pad_along_width = max((14.0 -1)*2 + 5 - 28,0) = 3
pad_top = 3 // 2 = 1
pad_bottom = 3//2 - pad_top = 2
pad_left = pad_along_width // 2 = 1
pad_right = pad_along_width - pad_left = 2
这是否意味着图像应该在左上方和右上方填充1在顶部,2在底部填充?
答案 0 :(得分:0)
我正在查看他们实际验证过的Tensorflow文档:
请注意,除以2表示可能存在时的情况 两侧的填充(顶部与底部,右侧与左侧)相互关闭。 在这种情况下,底部和右侧总是得到一个额外的 填充像素。例如,当pad_along_height为5时,我们填充2个像素 顶部和底部3个像素。请注意,这是不同的 来自现有的库,如cuDNN和Caffe,它们是明确的 指定填充像素的数量并始终填充相同的数量 两侧的像素。