From ac72ec5a3e3cf5ce71305b2af42aac75fe02193c Mon Sep 17 00:00:00 2001 From: Oceania2018 Date: Sat, 4 Sep 2021 21:33:00 -0500 Subject: [PATCH] QuantizationParamsTest --- src/TensorFlowNET.Core/APIs/c_api_lite.cs | 2 +- src/TensorFlowNET.Core/Lite/TfLiteDataType.cs | 27 +++++++++ .../Lite/TfLiteTest.cs | 55 +++++++++++++++++- .../Lite/testdata/add_quantized.bin | Bin 0 -> 640 bytes .../Tensorflow.Native.UnitTest.csproj | 4 ++ 5 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/TensorFlowNET.Core/Lite/TfLiteDataType.cs create mode 100644 test/TensorFlowNET.Native.UnitTest/Lite/testdata/add_quantized.bin diff --git a/src/TensorFlowNET.Core/APIs/c_api_lite.cs b/src/TensorFlowNET.Core/APIs/c_api_lite.cs index 52373988..5a437d26 100644 --- a/src/TensorFlowNET.Core/APIs/c_api_lite.cs +++ b/src/TensorFlowNET.Core/APIs/c_api_lite.cs @@ -56,7 +56,7 @@ namespace Tensorflow public static extern TfLiteTensor TfLiteInterpreterGetInputTensor(SafeTfLiteInterpreterHandle interpreter, int input_index); [DllImport(TensorFlowLibName)] - public static extern TF_DataType TfLiteTensorType(TfLiteTensor tensor); + public static extern TfLiteDataType TfLiteTensorType(TfLiteTensor tensor); [DllImport(TensorFlowLibName)] public static extern int TfLiteTensorNumDims(TfLiteTensor tensor); diff --git a/src/TensorFlowNET.Core/Lite/TfLiteDataType.cs b/src/TensorFlowNET.Core/Lite/TfLiteDataType.cs new file mode 100644 index 00000000..7b3aa102 --- /dev/null +++ b/src/TensorFlowNET.Core/Lite/TfLiteDataType.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tensorflow.Lite +{ + public enum TfLiteDataType + { + kTfLiteNoType = 0, + kTfLiteFloat32 = 1, + kTfLiteInt32 = 2, + kTfLiteUInt8 = 3, + kTfLiteInt64 = 4, + kTfLiteString = 5, + kTfLiteBool = 6, + kTfLiteInt16 = 7, + kTfLiteComplex64 = 8, + kTfLiteInt8 = 9, + kTfLiteFloat16 = 10, + kTfLiteFloat64 = 11, + kTfLiteComplex128 = 12, + kTfLiteUInt64 = 13, + kTfLiteResource = 14, + kTfLiteVariant = 15, + kTfLiteUInt32 = 16, + } +} diff --git a/test/TensorFlowNET.Native.UnitTest/Lite/TfLiteTest.cs b/test/TensorFlowNET.Native.UnitTest/Lite/TfLiteTest.cs index a1c95ec0..e1665557 100644 --- a/test/TensorFlowNET.Native.UnitTest/Lite/TfLiteTest.cs +++ b/test/TensorFlowNET.Native.UnitTest/Lite/TfLiteTest.cs @@ -40,7 +40,7 @@ namespace Tensorflow.Native.UnitTest Assert.AreEqual(TfLiteStatus.kTfLiteOk, c_api_lite.TfLiteInterpreterAllocateTensors(interpreter)); var input_tensor = c_api_lite.TfLiteInterpreterGetInputTensor(interpreter, 0); - Assert.AreEqual(TF_DataType.TF_FLOAT, c_api_lite.TfLiteTensorType(input_tensor)); + Assert.AreEqual(TfLiteDataType.kTfLiteFloat32, c_api_lite.TfLiteTensorType(input_tensor)); Assert.AreEqual(1, c_api_lite.TfLiteTensorNumDims(input_tensor)); Assert.AreEqual(2, c_api_lite.TfLiteTensorDim(input_tensor, 0)); Assert.AreEqual(sizeof(float) * 2, c_api_lite.TfLiteTensorByteSize(input_tensor)); @@ -61,7 +61,7 @@ namespace Tensorflow.Native.UnitTest Assert.AreEqual(TfLiteStatus.kTfLiteOk, c_api_lite.TfLiteInterpreterInvoke(interpreter)); var output_tensor = c_api_lite.TfLiteInterpreterGetOutputTensor(interpreter, 0); - Assert.AreEqual(TF_DataType.TF_FLOAT, c_api_lite.TfLiteTensorType(output_tensor)); + Assert.AreEqual(TfLiteDataType.kTfLiteFloat32, c_api_lite.TfLiteTensorType(output_tensor)); Assert.AreEqual(1, c_api_lite.TfLiteTensorNumDims(output_tensor)); Assert.AreEqual(2, c_api_lite.TfLiteTensorDim(output_tensor, 0)); Assert.AreEqual(sizeof(float) * 2, c_api_lite.TfLiteTensorByteSize(output_tensor)); @@ -83,5 +83,56 @@ namespace Tensorflow.Native.UnitTest c_api_lite.TfLiteInterpreterDelete(interpreter.DangerousGetHandle()); } + + [TestMethod] + public unsafe void QuantizationParamsTest() + { + var model = c_api_lite.TfLiteModelCreateFromFile("Lite/testdata/add_quantized.bin"); + var interpreter = c_api_lite.TfLiteInterpreterCreate(model, new SafeTfLiteInterpreterOptionsHandle(IntPtr.Zero)); + c_api_lite.TfLiteModelDelete(model.DangerousGetHandle()); + var input_dims = new[] { 2 }; + Assert.AreEqual(TfLiteStatus.kTfLiteOk, c_api_lite.TfLiteInterpreterResizeInputTensor(interpreter, 0, input_dims, 1)); + Assert.AreEqual(TfLiteStatus.kTfLiteOk, c_api_lite.TfLiteInterpreterAllocateTensors(interpreter)); + + var input_tensor = c_api_lite.TfLiteInterpreterGetInputTensor(interpreter, 0); + Assert.IsNotNull(input_tensor); + + Assert.AreEqual(TfLiteDataType.kTfLiteUInt8, c_api_lite.TfLiteTensorType(input_tensor)); + Assert.AreEqual(1, c_api_lite.TfLiteTensorNumDims(input_tensor)); + Assert.AreEqual(2, c_api_lite.TfLiteTensorDim(input_tensor, 0)); + + var input_params = c_api_lite.TfLiteTensorQuantizationParams(input_tensor); + Assert.AreEqual((0.003922f, 0), (input_params.scale, input_params.zero_point)); + + var input = new byte[] { 1, 3 }; + fixed (byte* addr = &input[0]) + { + Assert.AreEqual(TfLiteStatus.kTfLiteOk, + c_api_lite.TfLiteTensorCopyFromBuffer(input_tensor, new IntPtr(addr), 2 * sizeof(byte))); + } + Assert.AreEqual(TfLiteStatus.kTfLiteOk, c_api_lite.TfLiteInterpreterInvoke(interpreter)); + + var output_tensor = c_api_lite.TfLiteInterpreterGetOutputTensor(interpreter, 0); + Assert.IsNotNull(output_tensor); + + var output_params = c_api_lite.TfLiteTensorQuantizationParams(output_tensor); + Assert.AreEqual((0.003922f, 0), (output_params.scale, output_params.zero_point)); + + var output = new byte[2]; + fixed (byte* addr = &output[0]) + { + Assert.AreEqual(TfLiteStatus.kTfLiteOk, + c_api_lite.TfLiteTensorCopyToBuffer(output_tensor, new IntPtr(addr), 2 * sizeof(byte))); + } + Assert.AreEqual(3f, output[0]); + Assert.AreEqual(9f, output[1]); + + var dequantizedOutput0 = output_params.scale * (output[0] - output_params.zero_point); + var dequantizedOutput1 = output_params.scale * (output[1] - output_params.zero_point); + Assert.AreEqual(dequantizedOutput0, 0.011766f); + Assert.AreEqual(dequantizedOutput1, 0.035298f); + + c_api_lite.TfLiteInterpreterDelete(interpreter.DangerousGetHandle()); + } } } diff --git a/test/TensorFlowNET.Native.UnitTest/Lite/testdata/add_quantized.bin b/test/TensorFlowNET.Native.UnitTest/Lite/testdata/add_quantized.bin new file mode 100644 index 0000000000000000000000000000000000000000..07d48b93eb87f9774af154b8cdb4d15ecb3e1499 GIT binary patch literal 640 zcmbtRy$%6E7#u7vagi+)3W>%8NR$eVh~f%`QX|o5P|zt93YE%}c_3?Mch6r`>}77h zzu9m0+ZKT7DC=?Ks-ppe1SxGx4=52?5$JF?M1fEisIboPAL5EAr<(E2xeNCbv5zqx zfnl_-&N-U3CVx6h97~S)suQ&22Tkyrs!?$RV}V~IbMC;C1pao)bkv4l%}+E zZHBQf{SG00stY=3#3jFdJoH2SFv# + PreserveNewest + + PreserveNewest +