diff options
Diffstat (limited to 'tensorflow/contrib/lite/kernels/internal/tensor_utils_test.cc')
-rw-r--r-- | tensorflow/contrib/lite/kernels/internal/tensor_utils_test.cc | 206 |
1 files changed, 205 insertions, 1 deletions
diff --git a/tensorflow/contrib/lite/kernels/internal/tensor_utils_test.cc b/tensorflow/contrib/lite/kernels/internal/tensor_utils_test.cc index e8343f1223..6458af714b 100644 --- a/tensorflow/contrib/lite/kernels/internal/tensor_utils_test.cc +++ b/tensorflow/contrib/lite/kernels/internal/tensor_utils_test.cc @@ -14,7 +14,7 @@ limitations under the License. ==============================================================================*/ #include "tensorflow/contrib/lite/kernels/internal/tensor_utils.h" #include <gmock/gmock.h> -#include "tensorflow/contrib/lite/builtin_op_data.h" +#include "tensorflow/contrib/lite/c/builtin_op_data.h" #include "tensorflow/contrib/lite/kernels/test_util.h" namespace tflite { @@ -496,6 +496,16 @@ TEST(uKernels, VectorVectorCwiseProductAccumulateTest) { {1.0, 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45}))); } +TEST(uKernels, VectorBatchVectorAddTest) { + constexpr int kVectorSize = 3; + constexpr int kBatchSize = 2; + static float input[kVectorSize] = {0.0, -0.5, 1.0}; + std::vector<float> output = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + VectorBatchVectorAdd(input, kVectorSize, kBatchSize, output.data()); + EXPECT_THAT(output, + testing::ElementsAreArray({1.0, 1.5, 4.0, 4.0, 4.5, 7.0})); +} + TEST(uKernels, VectorBatchVectorAssignTest) { constexpr int kVectorSize = 5; constexpr int kBatchSize = 3; @@ -555,6 +565,120 @@ TEST(uKernels, ZeroVectorTest) { ElementsAreArray(ArrayFloatNear({0.0, 0.0, 0.0, 0.0, 0.0}))); } +TEST(uKernels, VectorBatchVectorCwiseProductAccumulate) { + constexpr int kVectorSize = 29; + constexpr int kBatchSize = 4; + static float input[kVectorSize] = { + 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, + 11.11, 12.12, 13.13, 14.14, 15.15, 16.16, 17.17, 18.18, 19.19, 20.2, + 21.21, 22.22, 23.23, 24.24, 25.25, 26.26, 27.27, 28.28, 0}; + std::vector<float> output = { + /* batch 0 */ + 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, + 14.14, 15.15, 16.16, 17.17, 18.18, 19.19, 20.2, 21.21, 22.22, 23.23, + 24.24, 25.25, 26.26, 27.27, 28.28, 0, + /* batch 1 */ + -1.1, -2.2, -3.3, -4.4, -5.5, -6.6, -7.7, -8.8, -9.9, -10.1, -11.11, + -12.12, -13.13, -14.14, -15.15, -16.16, -17.17, -18.18, -19.19, -20.2, + -21.21, -22.22, -23.23, -24.24, -25.25, -26.26, -27.27, -28.28, 0, + /* batch 2 */ + 1.1, -2.2, 3.3, -4.4, 5.5, -6.6, 7.7, -8.8, 9.9, -10.1, 11.11, -12.12, + 13.13, -14.14, 15.15, -16.16, 17.17, -18.18, 19.19, -20.2, 21.21, -22.22, + 23.23, -24.24, 25.25, -26.26, 27.27, -28.28, 0, + /* batch 3 */ + -1.1, 2.2, -3.3, 4.4, -5.5, 6.6, -7.7, 8.8, -9.9, 10.1, -11.11, 12.12, + -13.13, 14.14, -15.15, 16.16, -17.17, 18.18, -19.19, 20.2, -21.21, 22.22, + -23.23, 24.24, -25.25, 26.26, -27.27, 28.28, 0}; + VectorBatchVectorCwiseProductAccumulate(input, kVectorSize, output.data(), + kBatchSize, output.data()); + + // Expect output = input * output + output. + const std::vector<float> expected_output = { + /* batch 0 */ + 2.310000, 7.040000, 14.190000, 23.760000, 35.750000, 50.159996, 66.989998, + 86.240005, 107.909996, 112.110008, 134.542084, 159.014389, 185.526901, + 214.079605, 244.672485, 277.305603, 311.978912, 348.692413, 387.446136, + 428.240051, 471.074066, 515.948364, 562.862854, 611.817566, 662.812500, + 715.847595, 770.922974, 828.038452, 0.000000, + /* batch 1 */ + -2.310000, -7.040000, -14.190000, -23.760000, -35.750000, -50.159996, + -66.989998, -86.240005, -107.909996, -112.110008, -134.542084, + -159.014389, -185.526901, -214.079605, -244.672485, -277.305603, + -311.978912, -348.692413, -387.446136, -428.240051, -471.074066, + -515.948364, -562.862854, -611.817566, -662.812500, -715.847595, + -770.922974, -828.038452, 0.000000, + /* batch 2 */ + 2.310000, -7.040000, 14.190000, -23.760000, 35.750000, -50.159996, + 66.989998, -86.240005, 107.909996, -112.110008, 134.542084, -159.014389, + 185.526901, -214.079605, 244.672485, -277.305603, 311.978912, -348.692413, + 387.446136, -428.240051, 471.074066, -515.948364, 562.862854, -611.817566, + 662.812500, -715.847595, 770.922974, -828.038452, 0.000000, + /* batch 3 */ + -2.310000, 7.040000, -14.190000, 23.760000, -35.750000, 50.159996, + -66.989998, 86.240005, -107.909996, 112.110008, -134.542084, 159.014389, + -185.526901, 214.079605, -244.672485, 277.305603, -311.978912, 348.692413, + -387.446136, 428.240051, -471.074066, 515.948364, -562.862854, 611.817566, + -662.812500, 715.847595, -770.922974, 828.038452, 0.000000}; + EXPECT_THAT(output, testing::ElementsAreArray(expected_output)); +} + +TEST(uKernels, VectorBatchVectorCwiseProductNoAccumulate) { + constexpr int kVectorSize = 29; + constexpr int kBatchSize = 4; + static float input[kVectorSize] = { + 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, + 11.11, 12.12, 13.13, 14.14, 15.15, 16.16, 17.17, 18.18, 19.19, 20.2, + 21.21, 22.22, 23.23, 24.24, 25.25, 26.26, 27.27, 28.28, 0}; + std::vector<float> output = { + /* batch 0 */ + 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, + 14.14, 15.15, 16.16, 17.17, 18.18, 19.19, 20.2, 21.21, 22.22, 23.23, + 24.24, 25.25, 26.26, 27.27, 28.28, 0, + /* batch 1 */ + -1.1, -2.2, -3.3, -4.4, -5.5, -6.6, -7.7, -8.8, -9.9, -10.1, -11.11, + -12.12, -13.13, -14.14, -15.15, -16.16, -17.17, -18.18, -19.19, -20.2, + -21.21, -22.22, -23.23, -24.24, -25.25, -26.26, -27.27, -28.28, 0, + /* batch 2 */ + 1.1, -2.2, 3.3, -4.4, 5.5, -6.6, 7.7, -8.8, 9.9, -10.1, 11.11, -12.12, + 13.13, -14.14, 15.15, -16.16, 17.17, -18.18, 19.19, -20.2, 21.21, -22.22, + 23.23, -24.24, 25.25, -26.26, 27.27, -28.28, 0, + /* batch 3 */ + -1.1, 2.2, -3.3, 4.4, -5.5, 6.6, -7.7, 8.8, -9.9, 10.1, -11.11, 12.12, + -13.13, 14.14, -15.15, 16.16, -17.17, 18.18, -19.19, 20.2, -21.21, 22.22, + -23.23, 24.24, -25.25, 26.26, -27.27, 28.28, 0}; + VectorBatchVectorCwiseProduct(input, kVectorSize, output.data(), kBatchSize, + output.data()); + + // Expect output = input * output + output. + const std::vector<float> expected_output = { + /* batch 0 */ + 1.210000, 4.840000, 10.889999, 19.360001, 30.250000, 43.559998, 59.289997, + 77.440002, 98.009995, 102.010010, 123.432091, 146.894394, 172.396896, + 199.939606, 229.522491, 261.145599, 294.808899, 330.512421, 368.256134, + 408.040039, 449.864075, 493.728363, 539.632874, 587.577576, 637.562500, + 689.587585, 743.652954, 799.758423, 0.000000, + /* batch 1 */ + -1.210000, -4.840000, -10.889999, -19.360001, -30.250000, -43.559998, + -59.289997, -77.440002, -98.009995, -102.010010, -123.432091, -146.894394, + -172.396896, -199.939606, -229.522491, -261.145599, -294.808899, + -330.512421, -368.256134, -408.040039, -449.864075, -493.728363, + -539.632874, -587.577576, -637.562500, -689.587585, -743.652954, + -799.758423, 0.000000, + /* batch 2 */ + 1.210000, -4.840000, 10.889999, -19.360001, 30.250000, -43.559998, + 59.289997, -77.440002, 98.009995, -102.010010, 123.432091, -146.894394, + 172.396896, -199.939606, 229.522491, -261.145599, 294.808899, -330.512421, + 368.256134, -408.040039, 449.864075, -493.728363, 539.632874, -587.577576, + 637.562500, -689.587585, 743.652954, -799.758423, 0.000000, + /* batch 3 */ + -1.210000, 4.840000, -10.889999, 19.360001, -30.250000, 43.559998, + -59.289997, 77.440002, -98.009995, 102.010010, -123.432091, 146.894394, + -172.396896, 199.939606, -229.522491, 261.145599, -294.808899, 330.512421, + -368.256134, 408.040039, -449.864075, 493.728363, -539.632874, 587.577576, + -637.562500, 689.587585, -743.652954, 799.758423, 0.000000}; + EXPECT_THAT(output, testing::ElementsAreArray(expected_output)); +} + TEST(uKernels, BatchVectorBatchVectorDotProductTest) { constexpr int kVectorSize = 5; constexpr int kBatch = 2; @@ -598,5 +722,85 @@ TEST(uKernels, ReductionSumVectorTest) { EXPECT_THAT(result2, ElementsAreArray(ArrayFloatNear({1.0, 3.5}))); } +TEST(uKernels, MeanStddevNormalizationNoneZeroInput) { + constexpr int kVectorSize = 4; + constexpr int kBatchSize = 2; + constexpr float kNormalizationEpsilon = 1e-8; + + // None-zero input. + static float input[kVectorSize * kBatchSize] = { + 0.1, 0.2, 0.3, 0.4, // batch 0 + 0.9, 1.0, 1.1, 1.2, // batch 1 + }; + std::vector<float> output(kVectorSize * kBatchSize); + MeanStddevNormalization(input, output.data(), kVectorSize, kBatchSize, + kNormalizationEpsilon); + const std::vector<float> expected_output = { + -1.34164071, -0.447213531, 0.44721365, 1.34164071, // batch 0 + -1.34163153, -0.447210163, 0.447211236, 1.3416326, // batch 1 + }; + EXPECT_THAT(output, testing::ElementsAreArray(expected_output)); +} + +TEST(uKernels, MeanStddevNormalizationAllZeroInput) { + constexpr int kVectorSize = 4; + constexpr int kBatchSize = 2; + constexpr float kNormalizationEpsilon = 1e-8; + + // Zero input. + static float input[kVectorSize * kBatchSize] = { + 0.0, 0.0, 0.0, 0.0, // batch 0 + 0.0, 0.0, 0.0, 0.0, // batch 1 + }; + std::vector<float> output(kVectorSize * kBatchSize); + MeanStddevNormalization(input, output.data(), kVectorSize, kBatchSize, + kNormalizationEpsilon); + const std::vector<float> expected_output = { + 0.0, 0.0, 0.0, 0.0, // batch 0 + 0.0, 0.0, 0.0, 0.0, // batch 1 + }; + EXPECT_THAT(output, testing::ElementsAreArray(expected_output)); +} + +TEST(uKernels, MeanStddevNormalizationMixed) { + constexpr int kVectorSize = 4; + constexpr int kBatchSize = 2; + constexpr float kNormalizationEpsilon = 1e-8; + + // Mix of zero and non-zero input. + static float input[kVectorSize * kBatchSize] = { + 0.0, 0.0, 0.0, 0.0, // batch 0 + 0.1, 0.2, 0.3, 0.4, // batch 1 + }; + std::vector<float> output(kVectorSize * kBatchSize); + MeanStddevNormalization(input, output.data(), kVectorSize, kBatchSize, + kNormalizationEpsilon); + const std::vector<float> expected_output = { + 0.0, 0.0, 0.0, 0.0, // batch 0 + -1.34164071, -0.447213531, 0.44721365, 1.34164071, // batch 1 + }; + EXPECT_THAT(output, testing::ElementsAreArray(expected_output)); +} + +TEST(uKernels, MeanStddevNormalizationSmallValue) { + constexpr int kVectorSize = 4; + constexpr int kBatchSize = 2; + constexpr float kNormalizationEpsilon = 1e-8; + + // Mix of zero and non-zero input. + static float input[kVectorSize * kBatchSize] = { + 3e-5, -7e-6, -9e-5, 1e-6, // batch 0 + 4e-5, 9e-6, 2e-4, 0.0, // batch 1 + }; + std::vector<float> output(kVectorSize * kBatchSize); + MeanStddevNormalization(input, output.data(), kVectorSize, kBatchSize, + kNormalizationEpsilon); + const std::vector<float> expected_output = { + 1.04231524, 0.212946132, -1.64753067, 0.392269224, // batch 0 + -0.275023013, -0.658201098, 1.70267045, -0.769446373, // batch 1 + }; + EXPECT_THAT(output, testing::ElementsAreArray(expected_output)); +} + } // namespace tensor_utils } // namespace tflite |