コード例 #1
0
 def test_embedding_converter(self):
     input_dim = (1, 1, 1, 1)
     output_dim = (1, 2, 1, 1)
     input = [('input', datatypes.Array(*input_dim))]
     output = [('output', datatypes.Array(*output_dim))]
     builder = NeuralNetworkBuilder(input, output)
     weights = numpy.zeros(shape=(2))
     weights[:] = [-1, 1]
     bias = numpy.zeros(shape=(2))
     bias[:] = [-100, 100]
     builder.add_embedding(name='Embed', input_dim=1, W=weights, b=bias, output_channels=2, has_bias=True,
                           input_name='input', output_name='output')
     model_onnx = convert_coreml(builder.spec)
     self.assertTrue(model_onnx is not None)
コード例 #2
0
    def test_linear_quant_embedding_7bit(self):
        embed_size = 2
        vocab_size = 3
        W = np.zeros((embed_size, vocab_size), dtype=np.uint8)
        W[:, 0] = [100, 127]
        W[:, 1] = [20, 40]
        W[:, 2] = [90, 1]
        quant_scale = np.reshape(np.array([10.0, 2.0]), (2, 1))
        quant_bias = np.reshape(np.array([-2.0, -10.0]), (2, 1))
        W_unquantized = np.broadcast_to(quant_scale, (2, 3)) * W + np.broadcast_to(
            quant_bias, (2, 3)
        )
        bias = np.reshape(np.array([1.0, 2.0]), (2, 1))
        W_unquantized = W_unquantized + np.broadcast_to(bias, (2, 3))

        input_features = [("data", datatypes.Array(4, 1, 1, 1))]
        output_features = [("out", None)]
        builder = NeuralNetworkBuilder(
            input_features, output_features, disable_rank5_shape_mapping=True
        )
        builder.add_embedding(
            name="embed",
            W=_convert_array_to_nbit_quantized_bytes(W.flatten(), 7).tobytes(),
            b=bias,
            input_dim=vocab_size,
            output_channels=embed_size,
            has_bias=True,
            input_name="data",
            output_name="out",
            is_quantized_weight=True,
            quantization_type="linear",
            nbits=7,
            quant_scale=quant_scale,
            quant_bias=quant_bias,
        )

        mlmodel = MLModel(builder.spec)
        data = np.reshape(np.array([2.0, 2.0, 1.0, 0.0]), (4, 1, 1, 1))
        data_dict = {"data": data}
        out = mlmodel.predict(data_dict, useCPUOnly=True)["out"]
        self.assertTrue(out.shape == (4, embed_size, 1, 1))
        expected_out = np.zeros((4, embed_size), dtype=np.float32)
        expected_out[0, :] = W_unquantized[:, 2].flatten()
        expected_out[1, :] = W_unquantized[:, 2].flatten()
        expected_out[2, :] = W_unquantized[:, 1].flatten()
        expected_out[3, :] = W_unquantized[:, 0].flatten()
        self.assertTrue(np.allclose(out.flatten(), expected_out.flatten()))
コード例 #3
0
 def test_embedding_converter(self):
     input_dim = (1, 1, 1, 1)
     output_dim = (1, 2, 1, 1)
     input = [('input', datatypes.Array(*input_dim))]
     output = [('output', datatypes.Array(*output_dim))]
     builder = NeuralNetworkBuilder(input, output)
     weights = numpy.zeros(shape=(2))
     weights[:] = [-1, 1]
     bias = numpy.zeros(shape=(2))
     bias[:] = [-100, 100]
     builder.add_embedding(name='Embed',
                           input_dim=1,
                           W=weights,
                           b=bias,
                           output_channels=2,
                           has_bias=True,
                           input_name='input',
                           output_name='output')
     context = ConvertContext()
     node = EmbeddingLayerConverter.convert(
         context, builder.spec.neuralNetwork.layers[0], ['input'],
         ['output'])
     self.assertTrue(node is not None)