in mmdnn/conversion/mxnet/mxnet_parser.py [0:0]
def rename_Convolution(self, source_node):
IR_node = self.IR_graph.node.add()
# input edge
self.convert_inedge(source_node, IR_node)
# output shape
self.set_output_shape(source_node, IR_node)
dim = 0
layout = 'None'
# kernel_shape
kernel = MXNetParser.str2intList(source_node.get_attr("kernel"))
dim = len(kernel)
IR_node.attr["kernel_shape"].list.i.extend(kernel)
layout = source_node.get_attr("layout")
if layout == None or layout == 'None':
if dim == 1:
layout = "NCW"
elif dim == 2:
layout = "NCHW"
elif dim == 3:
layout = "NCDHW"
if not self.data_format == layout:
# print("Warning: Layer [{}] has changed model data format from [{}] to [{}]".format(source_node.name, self.data_format, layout))
self.data_format = layout
# groups
group = int(source_node.get_attr("num_group", "1"))
IR_node.attr["group"].i = group
in_channel = self.IR_layer_map[IR_node.input[0]].attr["_output_shapes"].list.shape[0].dim[-1].size
if group == in_channel:
self._copy_and_reop(source_node, IR_node, "DepthwiseConv")
else:
self._copy_and_reop(source_node, IR_node, "Conv")
# in_channel = in_channel // group
out_channel = int(source_node.get_attr("num_filter"))
IR_node.attr["kernel_shape"].list.i.extend([in_channel, out_channel])
# use_bias (no_bias default = False)
IR_node.attr["use_bias"].b = not MXNetParser.str2bool(source_node.get_attr("no_bias", "False"))
# strides
strides = source_node.get_attr("stride")
IR_node.attr["strides"].list.i.append(1)
if not strides == None:
IR_node.attr["strides"].list.i.extend(MXNetParser.str2intList(strides))
else:
IR_node.attr["strides"].list.i.extend([1] * dim)
IR_node.attr["strides"].list.i.append(1)
# dilations
dilate = source_node.get_attr("dilate")
IR_node.attr["dilations"].list.i.append(1)
if not dilate == None:
IR_node.attr["dilations"].list.i.extend(MXNetParser.str2intList(dilate))
else:
IR_node.attr["dilations"].list.i.extend([1] * dim)
IR_node.attr["dilations"].list.i.append(1)
# data_format
assign_IRnode_values(IR_node, {'data_format' : layout})
# padding
if "pad" in source_node.attr:
pad = MXNetParser.str2intList(source_node.get_attr("pad"))
IR_node.attr["pads"].list.i.extend(([0]+pad+[0])*2)
else:
IR_node.attr["pads"].list.i.extend([0, 0] * (dim + 2))
# weights
if self.weight_loaded:
weight = self.weight_data.get(source_node.name + "_weight").asnumpy()
if not layout in MXNetParser.channels_last:
weight = MXNetParser.transpose(weight, dim)
if IR_node.op == "DepthwiseConv":
weight = weight.transpose(0, 1, 3, 2)
self.set_weight(source_node.name, "weights", weight)
if IR_node.attr["use_bias"].b:
self.set_weight(source_node.name, "bias", self.weight_data.get(source_node.name + "_bias").asnumpy())