def separable_conv2d_same(inputs, kernel_size, stride, rate=1, scope=None):
"""Strided 2-D separable convolution with 'SAME' padding.
Args:
inputs: A 4-D tensor of size [batch, height_in, width_in, channels].
kernel_size: An int with the kernel_size of the filters.
stride: An integer, the output stride.
rate: An integer, rate for atrous convolution.
scope: Scope.
Returns:
output: A 4-D tensor of size [batch, height_out, width_out, channels] with
the convolution output.
"""
# By passing filters=None
# separable_conv2d produces only a depth-wise convolution layer
if stride == 1:
return slim.separable_conv2d(inputs, None, kernel_size,
depth_multiplier=1, stride=1, rate=rate,
padding='SAME', scope=scope)
else:
kernel_size_effective = kernel_size + (kernel_size - 1) * (rate - 1)
pad_total = kernel_size_effective - 1
pad_beg = pad_total // 2
pad_end = pad_total - pad_beg
inputs = tf.pad(inputs,
[[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]])
return slim.separable_conv2d(inputs, None, kernel_size,
depth_multiplier=1, stride=stride, rate=rate,
padding='VALID', scope=scope)
# The following is adapted from:
# https://github.com/tensorflow/models/blob/master/slim/nets/mobilenet_v1.py
# Conv and DepthSepConv named tuple define layers of the MobileNet architecture
# Conv defines 3x3 convolution layers
# DepthSepConv defines 3x3 depthwise convolution followed by 1x1 convolution.
# stride is the stride of the convolution
# depth is the number of channels or filters in a layer
评论列表
文章目录