Example #1
0
    def test_dropout_remover(self):  # type: () -> None
        inputs = [('input', (1, 3, 50, 50))]
        outputs = [('out', (1, 5, 50, 50), TensorProto.FLOAT)]
        weight = numpy_helper.from_array(_random_array((5, 3, 1, 1)),
                                         name="weight")
        conv = helper.make_node("Conv",
                                inputs=["input", "weight"],
                                outputs=["conv_output"],
                                kernel_shape=(1, 1),
                                strides=(1, 1))
        drop = helper.make_node(
            "Dropout",
            inputs=["conv_output"],
            outputs=["drop_output"],
        )
        exp = helper.make_node("Exp", inputs=["drop_output"], outputs=['out'])

        onnx_model = _onnx_create_model([conv, drop, exp], inputs, outputs)

        graph = Graph.from_onnx(onnx_model.graph)
        new_graph = graph.transformed([DropoutRemover()])
        self.assertEqual(len(graph.nodes), 3)
        self.assertEqual(len(new_graph.nodes), 2)
        self.assertEqual(new_graph.nodes[0].inputs[0], 'input')
        self.assertEqual(new_graph.nodes[1].inputs[0],
                         new_graph.nodes[0].outputs[0])
        self.assertEqual(new_graph.nodes[1].outputs[0], 'out')
Example #2
0
    def test_image_scaler_remover(self):  # type: () -> None
        inputs = [('input', (1, 3, 50, 50))]
        outputs = [('out', (1, 3, 50, 50), TensorProto.FLOAT)]

        im_scaler = helper.make_node("ImageScaler",
                                     inputs=['input'],
                                     outputs=['scaler_out'],
                                     bias=[10, -6, 20],
                                     scale=3.0)

        exp = helper.make_node("Exp", inputs=["scaler_out"], outputs=['out'])

        onnx_model = _onnx_create_model([im_scaler, exp], inputs, outputs)

        graph = Graph.from_onnx(onnx_model.graph)
        new_graph = graph.transformed([ImageScalerRemover()])
        self.assertEqual(len(graph.nodes), 2)
        self.assertEqual(len(new_graph.nodes), 1)
        self.assertEqual(new_graph.nodes[0].inputs[0], 'input')
        self.assertEqual(new_graph.nodes[0].outputs[0], 'out')

        coreml_model = convert(onnx_model)
        spec = coreml_model.get_spec()

        self.assertEqual(
            spec.neuralNetwork.preprocessing[0].scaler.channelScale, 3.0)
        self.assertEqual(spec.neuralNetwork.preprocessing[0].scaler.blueBias,
                         20.0)
        self.assertEqual(spec.neuralNetwork.preprocessing[0].scaler.greenBias,
                         -6.0)
        self.assertEqual(spec.neuralNetwork.preprocessing[0].scaler.redBias,
                         10.0)
    def test_multiple_image_scaler(self): # type : () -> None
        inputs = [('input_color', (1,3,10,10)), ('input_gray', (1,1,10,10))]
        outputs = [('out', (1,4,10,10), TensorProto.FLOAT)]

        im_scaler1 = helper.make_node("ImageScaler",
                                     inputs = ['input_color'],
                                     outputs = ['scaler_out_1'],
                                     bias = [10,-6,20], scale=3.0)

        im_scaler2 = helper.make_node("ImageScaler",
                                     inputs = ['input_gray'],
                                     outputs = ['scaler_out_2'],
                                     bias = [-13], scale=5.0)

        concat = helper.make_node("Concat",
                                  inputs=['scaler_out_1', 'scaler_out_2'],
                                  outputs=['out'],
                                  axis = 1)

        onnx_model = _onnx_create_model([im_scaler1, im_scaler2, concat], inputs, outputs)

        spec = convert(onnx_model).get_spec()
        self.assertEqual(len(spec.neuralNetwork.layers), 1)
        self.assertEqual(len(spec.neuralNetwork.preprocessing), 2)
        self.assertEqual(spec.neuralNetwork.preprocessing[0].scaler.channelScale, 3.0)
        self.assertEqual(spec.neuralNetwork.preprocessing[0].scaler.blueBias, 20.0)
        self.assertEqual(spec.neuralNetwork.preprocessing[0].scaler.greenBias, -6.0)
        self.assertEqual(spec.neuralNetwork.preprocessing[0].scaler.redBias, 10.0)
        self.assertEqual(spec.neuralNetwork.preprocessing[1].scaler.channelScale, 5.0)
        self.assertEqual(spec.neuralNetwork.preprocessing[1].scaler.grayBias, -13.0)
Example #4
0
    def test_pixel_shuffle(self):
        scale_factor = 2
        input_shape = (1, 8, 2, 2)
        output_shape = (input_shape[0], int(
            input_shape[1] / (scale_factor**2)), input_shape[2] * scale_factor,
                        input_shape[3] * scale_factor)

        inputs = [('input0', input_shape)]
        outputs = [('output0', output_shape)]

        node_0 = helper.make_node("Reshape",
                                  inputs=[inputs[0][0]],
                                  outputs=['node0'],
                                  shape=[
                                      output_shape[0], output_shape[1],
                                      scale_factor, scale_factor,
                                      input_shape[2], input_shape[3]
                                  ])
        node_1 = helper.make_node("Transpose",
                                  inputs=['node0'],
                                  outputs=['node1'],
                                  perm=[0, 1, 4, 2, 5, 3])
        node_2 = helper.make_node("Reshape",
                                  inputs=['node1'],
                                  outputs=[outputs[0][0]],
                                  shape=list(output_shape))
        model = _onnx_create_model([node_0, node_1, node_2], inputs, outputs)
        _test_onnx_model(model, decimal=7)
Example #5
0
def _make_model_flatten_axis3(): # type: (...) -> ModelProto
  '''
  make a simple model: 4-D input -> flatten (axis=3)-> output
  '''
  inputs = [('input', (1,3,10,20), TensorProto.FLOAT)]
  outputs = [('output', (30,20), TensorProto.FLOAT)]
  flatten = helper.make_node("Flatten",
                            inputs=[inputs[0][0]],
                            outputs=[outputs[0][0]],
                            axis=3)
  return _onnx_create_model([flatten], inputs, outputs)
Example #6
0
def _make_model_concat_axis3():  # type: (...) -> ModelProto
    '''
  make a simple model: 4-D input1, 4-D input2 -> concat (axis=3)-> output
  '''
    inputs = [('input0', (1, 3, 10, 20)), ('input1', (1, 3, 10, 15))]
    outputs = [('output', (1, 3, 10, 35), TensorProto.FLOAT)]
    concat = helper.make_node("Concat",
                              inputs=[inputs[0][0], inputs[1][0]],
                              outputs=[outputs[0][0]],
                              axis=3)
    return _onnx_create_model([concat], inputs, outputs)
    def test_fuse_conv_without_bias(self):  # type: () -> None
        kernel_shape = (3, 2)
        strides = (2, 3)
        pads = (4, 2, 4, 2)
        dilations = (1, 2)
        group = 1
        weight = numpy_helper.from_array(
            _random_array((16, 3, 3, 2)), name="weight"
        )

        input_shape = (1, 3, 224, 224)
        output_size = _conv_pool_output_size(input_shape, dilations,
                                             kernel_shape, pads, strides)

        output_shape = (1, int(weight.dims[0]), output_size[0], output_size[1])

        inputs = [('input0', input_shape)]
        outputs = [('output0', output_shape, TensorProto.FLOAT)]

        conv = helper.make_node(
            "Conv",
            inputs=[inputs[0][0], "weight"],
            outputs=["conv_output"],
            dilations=dilations,
            group=group,
            kernel_shape=kernel_shape,
            pads=pads,
            strides=strides
        )

        b = _random_array((int(weight.dims[0]),))
        bias = numpy_helper.from_array(
            b, name="bias"
        )

        add = helper.make_node(
            "Add",
            inputs=[conv.output[0], "bias"],
            outputs=[outputs[0][0]],
            broadcast=1,
            axis=1
        )

        model = _onnx_create_model(
            [conv, add], inputs, outputs, [weight, bias]
        )
        graph_ = Graph.from_onnx(model.graph, onnx_ir_version=5)
        fused_graph = graph_.transformed([ConvAddFuser()])

        self.assertEqual(len(fused_graph.nodes), 1)
        node = fused_graph.nodes[0]
        self.assertEqual(len(node.inputs), 3)
        npt.assert_equal(node.input_tensors[node.inputs[2]], b)
        self.assertEqual(fused_graph.nodes[0].outputs[0], outputs[0][0])
Example #8
0
    def test_create_graph(self):  # type: () -> None
        kernel_shape = (3, 2)
        strides = (2, 3)
        pads = (4, 2, 4, 2)
        dilations = (1, 2)
        group = 1
        weight = numpy_helper.from_array(
            _random_array((16, 3, 3, 2)), name="weight"
        )

        input_shape = (1, 3, 224, 224)
        output_size = _conv_pool_output_size(input_shape, dilations,
                                             kernel_shape, pads, strides)

        output_shape = (1, int(weight.dims[0]), output_size[0], output_size[1])

        inputs = [('input0', input_shape)]
        outputs = [('output0', output_shape)]

        conv = helper.make_node(
            "Conv",
            inputs=[inputs[0][0], "weight"],
            outputs=["conv_output"],
            dilations=dilations,
            group=group,
            kernel_shape=kernel_shape,
            pads=pads,
            strides=strides
        )

        relu = helper.make_node(
            "Relu",
            inputs=[conv.output[0]],
            outputs=[outputs[0][0]]
        )

        model = _onnx_create_model([conv, relu], inputs, outputs, [weight])
        graph_ = Graph.from_onnx(model.graph)
        self.assertTrue(len(graph_.inputs) == 1)
        self.assertEqual(graph_.inputs[0][2], input_shape)
        self.assertTrue(len(graph_.outputs) == 1)
        self.assertEqual(graph_.outputs[0][2], output_shape)
        self.assertTrue(len(graph_.nodes) == 2)
        self.assertEqual(len(graph_.nodes[0].parents), 0)
        self.assertEqual(len(graph_.nodes[1].parents), 1)
        self.assertEqual(len(graph_.nodes[0].children), 1)
        self.assertEqual(len(graph_.nodes[1].children), 0)
Example #9
0
def _make_model_acos_exp_topk(): # type: (...) -> ModelProto
  '''
  make a very simple model for testing: input->clip->exp->topk->2 outputs
  '''
  inputs = [('input0', (10,), TensorProto.FLOAT), ('K', (1,), TensorProto.INT64)]
  outputs = [('output_values', (3,), TensorProto.FLOAT), ('output_indices', (3,), TensorProto.INT64)]
  acos = helper.make_node("Acos",
                          inputs=[inputs[0][0]],
                          outputs=['acos_out'])
  exp = helper.make_node("Exp",
                        inputs=[acos.output[0]],
                        outputs=['exp_out'])
  topk = helper.make_node("TopK",
                        inputs=[exp.output[0], inputs[1][0]],
                        outputs=[outputs[0][0], outputs[1][0]],
                        axis=0)
  return _onnx_create_model([acos, exp, topk], inputs, outputs)
    def test_pixel_shuffle(self):  # type: () -> None
        scale_factor = 2
        input_shape = (1, 8, 2, 2)
        output_shape = (
            input_shape[0],
            int(input_shape[1] / (scale_factor ** 2)),
            input_shape[2] * scale_factor,
            input_shape[3] * scale_factor
        )

        inputs = [('input0', input_shape)]
        outputs = [('output0', output_shape, TensorProto.FLOAT)]

        shape1 = [
            output_shape[0],
            output_shape[1],
            scale_factor,
            scale_factor,
            input_shape[2],
            input_shape[3]
        ]

        shape1 = numpy_helper.from_array(np.asarray(shape1), name="shape1")
        shape2 = numpy_helper.from_array(np.asarray(list(output_shape)), name="shape2")

        node_0 = helper.make_node(
            "Reshape",
            inputs=[inputs[0][0], 'shape1'],
            outputs=['node0'],
        )
        node_1 = helper.make_node(
            "Transpose",
            inputs=['node0'],
            outputs=['node1'],
            perm=[0, 1, 4, 2, 5, 3]
        )
        node_2 = helper.make_node(
            "Reshape",
            inputs=['node1','shape2'],
            outputs=[outputs[0][0]],
        )
        model = _onnx_create_model(
            [node_0, node_1, node_2], inputs, outputs, initializer=[shape1, shape2]
        )
        _test_onnx_model(model, decimal=7)
Example #11
0
def _make_model_clip_exp_topk():  # type: (...) -> ModelProto
    '''
  make a very simple model for testing: input->clip->exp->topk->2 outputs
  '''
    inputs = [('input0', (10, ))]
    outputs = [('output_values', (3, )), ('output_indices', (3, ))]
    clip = helper.make_node("Clip",
                            inputs=[inputs[0][0]],
                            outputs=['clip_out'],
                            max=10.0,
                            min=5.0)
    exp = helper.make_node("Exp", inputs=[clip.output[0]], outputs=['exp_out'])
    topk = helper.make_node("TopK",
                            inputs=[exp.output[0]],
                            outputs=[outputs[0][0], outputs[1][0]],
                            axis=0,
                            k=3)
    return _onnx_create_model([clip, exp, topk], inputs, outputs)