in utils/symbol/symbol_octconv.py [0:0]
def Convolution(data, num_filter, kernel, stride=(1, 1), pad=(0, 0), num_group=1, no_bias=True, name=None):
data_h, data_l = data if type(data) is tuple else (data, None)
num_high, num_low = num_filter if type(num_filter) is tuple else (num_filter, 0)
assert num_high >= 0 and num_low >= 0
assert stride == (1, 1) or stride == (2, 2), "stride = {} is not supported yet".format(stride)
data_h2l, data_h2h, data_l2l, data_l2h = None, None, None, None
depthwise = True if num_filter == num_group else False
'''processing high frequency group'''
if data_h is not None:
# High -> High
data_h = mx.sym.Pooling(data=data_h, pool_type="avg", kernel=(2, 2), pad=(0, 0), stride=(2, 2)) if stride == (2, 2) else data_h
data_h2h = mx.sym.Convolution(data=data_h, num_filter=num_high, kernel=kernel, stride=(1, 1), pad=pad, num_group=min(num_high, num_group), no_bias=no_bias, name=('%s-h2h' % name)) if num_high > 0 else None
# High -> Low
if not depthwise:
data_h2l = mx.sym.Pooling(data=data_h, pool_type="avg", kernel=(2, 2), pad=(0, 0), stride=(2, 2)) if (num_low > 0) else data_h
data_h2l = mx.sym.Convolution(data=data_h2l, num_filter=num_low, kernel=kernel, stride=(1, 1), pad=pad, num_group=min(num_low, num_group), no_bias=no_bias, name=('%s-h2l' % name)) if num_low > 0 else None
'''processing low frequency group'''
if data_l is not None:
# Low -> Low
data_l2l = mx.sym.Pooling(data=data_l, pool_type="avg", kernel=(2, 2), pad=(0, 0), stride=(2, 2)) if (num_low > 0 and stride == (2, 2)) else data_l
data_l2l = mx.sym.Convolution(data=data_l2l, num_filter=num_low, kernel=kernel, stride=(1, 1), pad=pad, num_group=min(num_low, num_group), no_bias=True, name=('%s-l2l' % name)) if num_low > 0 else None
# Low -> High
if not depthwise:
data_l2h = mx.sym.Convolution(data=data_l, num_filter=num_high, kernel=kernel, stride=(1, 1), pad=pad, num_group=min(num_high, num_group), no_bias=True, name=('%s-l2h' % name)) if num_high > 0 else None
data_l2h = mx.sym.UpSampling(data_l2h, scale=2, sample_type="nearest", num_args=1) if (num_high > 0 and stride == (1, 1)) else data_l2h
'''you can force to disable the interaction paths'''
# data_h2l = None if (data_h2h is not None) and (data_l2l is not None) else data_h2l
# data_l2h = None if (data_h2h is not None) and (data_l2l is not None) else data_l2h
output = ElementWiseSum(*[(data_h2h, data_h2l), (data_l2h, data_l2l)], name=name)
# squeeze output (to be backward compatible)
return output[0] if output[1] is None else output