From 65d30965eef7e8534fc16ea4ded413c42a81c362 Mon Sep 17 00:00:00 2001 From: Narumol Prangnawarat Date: Thu, 14 Mar 2019 11:55:03 +0000 Subject: IVGCVSW-2354 Caffe SqueezeNet through armnn Cl and Neon * Compute Softmax Acl axis for Cl and Neon * Add unittests for Softmax in 3D and 4D * Correct input and output layer names in CaffeSqueezeNet inference test Change-Id: I2d369d9a2db19c40f2af3341039dd33f0c5637b1 Signed-off-by: Narumol Prangnawarat --- src/backends/backendsCommon/test/LayerTests.cpp | 32 ++++++++ src/backends/backendsCommon/test/LayerTests.hpp | 20 +++++ .../backendsCommon/test/SoftmaxTestImpl.hpp | 90 ++++++++++++++++------ 3 files changed, 118 insertions(+), 24 deletions(-) (limited to 'src/backends/backendsCommon') diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp index ce02fedb98..a088aaa947 100644 --- a/src/backends/backendsCommon/test/LayerTests.cpp +++ b/src/backends/backendsCommon/test/LayerTests.cpp @@ -907,6 +907,22 @@ LayerTestResult SimpleSoftmaxTest( return SimpleSoftmaxTestImpl(workloadFactory, memoryManager, beta); } +LayerTestResult Simple3dSoftmaxTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float beta) +{ + return Simple3dSoftmaxTestImpl(workloadFactory, memoryManager, beta); +} + +LayerTestResult Simple4dSoftmaxTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float beta) +{ + return Simple4dSoftmaxTestImpl(workloadFactory, memoryManager, beta); +} + LayerTestResult SimpleSoftmaxUint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, @@ -915,6 +931,22 @@ LayerTestResult SimpleSoftmaxUint8Test( return SimpleSoftmaxTestImpl(workloadFactory, memoryManager, beta); } +LayerTestResult Simple3dSoftmaxUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float beta) +{ + return Simple3dSoftmaxTestImpl(workloadFactory, memoryManager, beta); +} + +LayerTestResult Simple4dSoftmaxUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float beta) +{ + return Simple4dSoftmaxTestImpl(workloadFactory, memoryManager, beta); +} + LayerTestResult CompareNormalizationTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index 587ffe9a3e..a8cb553ce9 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -335,11 +335,31 @@ LayerTestResult SimpleSoftmaxTest( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, float beta); +LayerTestResult Simple3dSoftmaxTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float beta); + +LayerTestResult Simple4dSoftmaxTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float beta); + LayerTestResult SimpleSoftmaxUint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, float beta); +LayerTestResult Simple3dSoftmaxUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float beta); + +LayerTestResult Simple4dSoftmaxUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float beta); + LayerTestResult SimpleSigmoidTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); diff --git a/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp b/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp index 25ceda1128..8081950ab8 100644 --- a/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp +++ b/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp @@ -19,34 +19,35 @@ #include -template> -LayerTestResult SimpleSoftmaxTestImpl( +template> +LayerTestResult SimpleSoftmaxBaseTestImpl( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - float beta) + float beta, + const armnn::TensorShape& inputShape, + const std::vector& outputData) { using std::exp; + const float qScale = 1.f / 256.f; + const int qOffset = 0; + armnn::TensorInfo inputTensorInfo; armnn::TensorInfo outputTensorInfo; - unsigned int inputShape[] = { 2, 4 }; - - inputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType); - float qScale = 1.f / 256.f; - int qOffset = 0; + inputTensorInfo = armnn::TensorInfo(inputShape, ArmnnType); inputTensorInfo.SetQuantizationScale(qScale); inputTensorInfo.SetQuantizationOffset(qOffset); - outputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType); + outputTensorInfo = armnn::TensorInfo(inputShape, ArmnnType); outputTensorInfo.SetQuantizationScale(qScale); outputTensorInfo.SetQuantizationOffset(qOffset); - LayerTestResult ret(outputTensorInfo); + LayerTestResult ret(outputTensorInfo); // Each row is independently softmax'd. - auto input = MakeTensor(inputTensorInfo, std::vector( - QuantizedVector(qScale, 0, { + auto input = MakeTensor(inputTensorInfo, std::vector( + QuantizedVector(qScale, qOffset, { 0.f, 1.f, 0.f, 0.f, .5f, 0.f, 0.f, 0.f, }))); @@ -65,35 +66,76 @@ LayerTestResult SimpleSoftmaxTestImpl( inputHandle->Allocate(); outputHandle->Allocate(); - CopyDataToITensorHandle(inputHandle.get(), &input[0][0]); + CopyDataToITensorHandle(inputHandle.get(), input.origin()); + + BOOST_ASSERT(workload); ExecuteWorkload(*workload, memoryManager); - CopyDataFromITensorHandle(&ret.output[0][0], outputHandle.get()); + CopyDataFromITensorHandle(ret.output.origin(), outputHandle.get()); + + std::vector expectedOutput = std::vector( + QuantizedVector(qScale, qOffset, outputData)); + ret.outputExpected = MakeTensor(outputTensorInfo, expectedOutput); + + return ret; +} + +template> +LayerTestResult SimpleSoftmaxTestImpl( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float beta) +{ + using std::exp; + const armnn::TensorShape inputShape{ 2, 4 }; float x0[4] = { exp((0.f - 1.0f) * beta), exp((1.0f - 1.0f) * beta), - exp((0.0f - 1.0f) * beta), exp((0.0f - 1.0f) * beta) }; + exp((0.0f - 1.0f) * beta), exp((0.0f - 1.0f) * beta) }; float sum0 = x0[0] + x0[1] + x0[2] + x0[3]; float x1[4] = { exp((0.5f - 0.5f) * beta), exp((0.0f - 0.5f) * beta), - exp((0.0f - 0.5f) * beta), exp((0.0f - 0.5f) * beta) }; + exp((0.0f - 0.5f) * beta), exp((0.0f - 0.5f) * beta) }; float sum1 = x1[0] + x1[1] + x1[2] + x1[3]; - ret.outputExpected = MakeTensor(outputTensorInfo, std::vector( - QuantizedVector(qScale, qOffset, { - x0[0] / sum0, x0[1] / sum0, x0[2] / sum0, x0[3] / sum0, - x1[0] / sum1, x1[1] / sum1, x1[2] / sum1, x1[3] / sum1 - }))); + const std::vector outputData = { x0[0] / sum0, x0[1] / sum0, x0[2] / sum0, x0[3] / sum0, + x1[0] / sum1, x1[1] / sum1, x1[2] / sum1, x1[3] / sum1 }; - return ret; + return SimpleSoftmaxBaseTestImpl(workloadFactory, memoryManager, beta, inputShape, outputData); } template> -LayerTestResult CompareSoftmaxTestImpl( +LayerTestResult Simple3dSoftmaxTestImpl( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float beta) +{ + const armnn::TensorShape inputShape{ 1, 8, 1 }; + const std::vector outputData = { 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f, + 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f }; + + return SimpleSoftmaxBaseTestImpl(workloadFactory, memoryManager, beta, inputShape, outputData); +} + +template> +LayerTestResult Simple4dSoftmaxTestImpl( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - armnn::IWorkloadFactory& refWorkloadFactory, float beta) { + const armnn::TensorShape inputShape{ 1, 8, 1, 1 }; + const std::vector outputData = { 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f, + 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f }; + + return SimpleSoftmaxBaseTestImpl(workloadFactory, memoryManager, beta, inputShape, outputData); +} + +template> +LayerTestResult CompareSoftmaxTestImpl( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::IWorkloadFactory& refWorkloadFactory, + float beta) +{ const int batchSize = 20; const int channels = 30; -- cgit v1.2.1