def emit_Conv()

in mmdnn/conversion/onnx/onnx_emitter.py [0:0]


    def emit_Conv(self, IR_node):
        kernel_shape = list(IR_node.get_attr('kernel_shape'))[:-2]
        dilations = list(IR_node.get_attr('dilations', [1] * (len(kernel_shape) + 2)))[1:-1]
        group = IR_node.get_attr('group', 1)
        if IR_node.type == 'DepthwiseConv':
            group = IR_node.IR_layer.attr["kernel_shape"].list.i[-2]
            self.weights_dict[IR_node.name]['weights'] = np.swapaxes(self.weights_dict[IR_node.name]['weights'], -1, -2)
        pads = IR_node.get_attr('pads')
        pad_length = len(pads)
        pads = pads[1:pad_length // 2 - 1] + pads[pad_length // 2 + 1:pad_length - 1]
        strides = list(IR_node.get_attr('strides'))[1:-1]
        use_bias=IR_node.get_attr('use_bias')
        self.add_body(1, "{:15} = _weights_dict['{}']['weights']".format(
            IR_node.variable_name + '_weight_array',
            IR_node.name))
        self.add_body(1, "{} = {}.transpose([3,2,0,1])".format(
            IR_node.variable_name + '_weight_array',
            IR_node.variable_name + '_weight_array'))
        self.add_body(1, "{:15} = helper.make_tensor_value_info('{}', onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], list({}.shape))".format(
                          IR_node.variable_name + '_weight',
                          IR_node.variable_name + '_weight',
                          IR_node.variable_name + '_weight_array',
                          IR_node.variable_name + '_weight_array'))

        self.add_body(1, "{:15} = helper.make_tensor(name='{}', data_type=onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], dims={}.shape, vals={}.flatten().astype(float))".format(
                          IR_node.variable_name + '_weight_init',
                          IR_node.variable_name + '_weight',
                          IR_node.variable_name + '_weight_array',
                          IR_node.variable_name + '_weight_array',
                          IR_node.variable_name + '_weight_array'))

        if use_bias:
            self.add_body(1, "{:15} = _weights_dict['{}']['bias'].squeeze()".format(
                IR_node.variable_name + '_bias_array',
                IR_node.name))

            self.add_body(1, "{:15} = helper.make_tensor_value_info('{}', onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], list({}.shape))".format(
                            IR_node.variable_name + '_bias',
                            IR_node.variable_name + '_bias',
                            IR_node.variable_name + '_bias_array',
                            IR_node.variable_name + '_bias_array'))

            self.add_body(1, "{:15} = helper.make_tensor(name='{}', data_type=onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], dims={}.shape, vals={}.flatten().astype(float))".format(
                              IR_node.variable_name + '_bias_init',
                              IR_node.variable_name + '_bias',
                              IR_node.variable_name + '_bias_array',
                              IR_node.variable_name + '_bias_array',
                              IR_node.variable_name + '_bias_array'))
            self.add_body(1, "{:15} = helper.make_node('Conv', inputs=['{}', '{}', '{}'],outputs=['{}'], dilations={}, group={}, kernel_shape={}, pads={}, strides={}, name='{}')".format(
                              IR_node.variable_name,
                              self.parent_variable_name(IR_node),
                              IR_node.variable_name + '_weight',
                              IR_node.variable_name + '_bias',
                              IR_node.variable_name,
                              dilations,
                              group,
                              kernel_shape,
                              pads,
                              strides,
                              IR_node.variable_name))
            # self.nodes.append(IR_node.variable_name + '_bias')
            self.initializer.append(IR_node.variable_name + '_bias_init')
            self.inputs.append(IR_node.variable_name + '_bias')
        else:
            self.add_body(1, "{:15} = helper.make_node('Conv', inputs=['{}', '{}'], outputs=['{}'], dilations={}, group={}, kernel_shape={}, pads={}, strides={}, name='{}')".format(
                              IR_node.variable_name,
                              self.parent_variable_name(IR_node),
                              IR_node.variable_name + '_weight',
                              IR_node.variable_name,
                              dilations,
                              group,
                              kernel_shape,
                              pads,
                              strides,
                              IR_node.variable_name))
        # self.nodes.append(IR_node.variable_name + '_weight')
        self.initializer.append(IR_node.variable_name + '_weight_init')
        self.inputs.append(IR_node.variable_name + '_weight')
        self.nodes.append(IR_node.variable_name)