in tfops.py [0:0]
def separable_conv2d(name, x, width, filter_size=[3, 3], stride=[1, 1], padding="SAME", do_actnorm=True, std=0.05):
n_in = int(x.get_shape()[3])
with tf.variable_scope(name):
assert filter_size[0] % 2 == 1 and filter_size[1] % 2 == 1
strides = [1] + stride + [1]
w1_shape = filter_size + [n_in, 1]
w1_init = np.zeros(w1_shape, dtype='float32')
w1_init[(filter_size[0]-1)//2, (filter_size[1]-1)//2, :,
:] = 1. # initialize depthwise conv as identity
w1 = tf.get_variable("W1", dtype=tf.float32, initializer=w1_init)
w2_shape = [1, 1, n_in, width]
w2 = tf.get_variable("W2", w2_shape, tf.float32,
initializer=default_initializer(std))
x = tf.nn.separable_conv2d(
x, w1, w2, strides, padding, data_format='NHWC')
if do_actnorm:
x = actnorm("actnorm", x)
else:
x += tf.get_variable("b", [1, 1, 1, width],
initializer=tf.zeros_initializer(std))
return x