Tensorflow在github中正式实现了resnet.它使用固定填充而不是普通的tf.layers.conv2d.
像这样的东西:
def conv2d_fixed_padding(inputs,filters,kernel_size,strides,data_format):
"""Strided 2-D convolution with explicit padding."""
# The padding is consistent and is based only on `kernel_size`,not on the
# dimensions of `inputs` (as opposed to using `tf.layers.conv2d` alone).
if strides > 1:
inputs = fixed_padding(inputs,data_format)
return tf.layers.conv2d(
inputs=inputs,filters=filters,kernel_size=kernel_size,strides=strides,padding=('SAME' if strides == 1 else 'VALID'),use_bias=False,kernel_initializer=tf.variance_scaling_initializer(),data_format=data_format)
这样做的目的是什么?如果我们输入一个大小为32×32的图像并使用tf.layer.conv2d设置填充方法到SAME,我们可以得到一个16×16的特征映射,步长为2.但在上面的代码中,它将在图像的两侧填充零,然后使用填充方法VALID.
最佳答案
假设我们的步幅为2,内核大小为3.
使用带填充的tf.layers.conv2d相同:
情况1:
pad| |pad
inputs: 0 |1 2 3 4 5 |0
|_______|
|_______|
|_______|
案例2:
|pad
inputs: 1 2 3 4 5 6 |0
|_______|
|_______|
|_______|
您可以看到填充将取决于输入大小.确定具有相同的填充,使得输出大小为Math.ceil(input_size / stride).您可以阅读有关该here的更多信息.
使用resnet的固定填充实现:
情况1:
pad| |pad
inputs: 0 |1 2 3 4 5 |0
|_______|
|_______|
|_______|
案例2:
pad| |pad
inputs: 0 |1 2 3 4 5 6 |0
|_______|
|_______|
|_______|
填充由内核大小唯一定义,并且与输入大小无关.