| 800 | } |
| 801 | |
| 802 | bool CheckScaleSetOnQuantizedType(Layer* layer, Optional<std::vector<std::string>&> errMessages) |
| 803 | { |
| 804 | bool noErrors = true; |
| 805 | unsigned int numOutputs = layer->GetNumOutputSlots(); |
| 806 | for (unsigned int i = 0; i < numOutputs; i++) { |
| 807 | OutputSlot& outputSlot = layer->GetOutputSlot(i); |
| 808 | TensorInfo info = outputSlot.GetTensorInfo(); |
| 809 | auto quantizationDataType = info.GetDataType(); |
| 810 | auto quantizationScales = info.GetQuantizationScales(); |
| 811 | // For any Quantized Tensor ensure scale(s) are set |
| 812 | switch(quantizationDataType) { |
| 813 | case DataType::QAsymmU8: |
| 814 | case DataType::QSymmS16: |
| 815 | case DataType::QSymmS8: |
| 816 | case DataType::QAsymmS8: |
| 817 | if ((quantizationDataType == DataType::QAsymmU8 || quantizationDataType == DataType::QAsymmS8) |
| 818 | && info.HasPerAxisQuantization()) { |
| 819 | throw InvalidArgumentException("Per Axis Quantization is not supported in " |
| 820 | "Asymmetric Quantization Datatype."); |
| 821 | } |
| 822 | // Softmax under QuantisedAsymm8 must always be scale (1.0f/256.0f) and offset 0 |
| 823 | if (!info.HasPerAxisQuantization() && quantizationDataType == DataType::QAsymmU8 && |
| 824 | (info.GetQuantizationScale() != (1.0f / 256.0f) || |
| 825 | info.GetQuantizationOffset() != 0) && |
| 826 | layer->GetType() == armnn::LayerType::Softmax) { |
| 827 | std::stringstream ss; |
| 828 | ss << "Quantization parameters for Softmax layer (Scale: " << |
| 829 | info.GetQuantizationScale() << " and Offset: " << info.GetQuantizationOffset() << |
| 830 | ") are incorrect and have been updated to Scale: 0.00390625 and Offset: 0"; |
| 831 | ARMNN_LOG(warning) << ss.str(); |
| 832 | info.SetQuantizationScale((1.0f / 256.0f)); |
| 833 | info.SetQuantizationOffset(0); |
| 834 | outputSlot.SetTensorInfo(info); |
| 835 | ReportError(ss.str(), errMessages); |
| 836 | } |
| 837 | break; |
| 838 | default: |
| 839 | break; |
| 840 | } |
| 841 | } |
| 842 | return noErrors; |
| 843 | } |
| 844 | |
| 845 | OptimizationResult AttemptBackendAssignment(BackendSettings& backendSettings, |
| 846 | Graph& graph, |
no test coverage detected