in mmdnn/conversion/mxnet/mxnet_emitter.py [0:0]
def _emit_convolution(self, IR_node, pattern):
if self.weight_loaded:
weight_dict = self.weights[IR_node.name]
weights = weight_dict['weights']
dim = len(IR_node.IR_layer.attr["kernel_shape"].list.i) - 2
kernel = list()
for idx in range(0, dim):
kernel.append(IR_node.IR_layer.attr["kernel_shape"].list.i[idx])
stride = list()
for e in IR_node.IR_layer.attr["strides"].list.i[1:-1]:
stride.append(e)
dilate = list()
for e in IR_node.IR_layer.attr["dilations"].list.i[1:-1]:
dilate.append(e)
if dilate == []: dilate = [1, 1]
dilate = ', '.join('%s' % i for i in dilate)
defuse_pad = False
pad = list()
if "pads" in IR_node.IR_layer.attr:
output_shape = list()
for e in IR_node.IR_layer.attr["_output_shapes"].list.shape[0].dim:
output_shape.append(e.size)
# print("Warning: MXNet Convolution Layer pad does not match IR Convolution Layer pad")
defuse_pad, pad = MXNetEmitter.transfer_pad(IR_node.IR_layer.attr["pads"].list.i)
num_filter = 0
if pattern == "Deconvolution":
num_filter = IR_node.IR_layer.attr["kernel_shape"].list.i[-2]
else:
num_filter = IR_node.IR_layer.attr["kernel_shape"].list.i[-1]
use_bias = IR_node.get_attr('use_bias', False)
if use_bias and self.weight_loaded:
self.output_weights[IR_node.name + "_bias"] = weight_dict['bias']
if pattern == "DepthwiseConv":
num_group = IR_node.IR_layer.attr["kernel_shape"].list.i[-2]
num_filter = num_filter * num_group
pattern = "Convolution"
if self.weight_loaded:
weights = np.swapaxes(weights, -1, -2)
else:
num_group = IR_node.get_attr('group', 1)
# layout = IR_node.IR_layer.attr["data_format"].s
if dim == 1:
layout = 'NCW'
elif dim == 2:
layout = 'NCHW'
elif dim == 3:
layout = 'NCDHW'
if self.weight_loaded:
# if layout not in MXNetEmitter.channels_last:
weights = MXNetEmitter.transpose(weights, dim)
self.output_weights[IR_node.name + "_weight"] = weights
code = ""
if not defuse_pad:
code += "{:<15} = mx.sym.{}(data={}, kernel={}, stride={}, dilate = ({}), pad={}, num_filter = {}, num_group = {}, no_bias = {}, layout = '{}', name = '{}')".format(
IR_node.variable_name,
pattern,
self.parent_variable_name(IR_node),
tuple(kernel),
tuple(stride),
dilate,
tuple(pad),
num_filter,
num_group,
not use_bias,
layout,
IR_node.name)
else:
code += self.set_pad(IR_node, code, pad, False)
code += "\n {:<15} = mx.sym.{}(data={}, kernel={}, stride={}, dilate = ({}), num_filter = {}, num_group = {}, no_bias = {}, layout = '{}', name = '{}')".format(
IR_node.variable_name,
pattern,
IR_node.variable_name + "_pad",
tuple(kernel),
tuple(stride),
dilate,
num_filter,
num_group,
not use_bias,
layout,
IR_node.name)
return code