aboutsummaryrefslogtreecommitdiff
path: root/src/armnnSerializer
diff options
context:
space:
mode:
Diffstat (limited to 'src/armnnSerializer')
-rw-r--r--src/armnnSerializer/ArmnnSchema.fbs7
-rw-r--r--src/armnnSerializer/ArmnnSchema_generated.h53
-rw-r--r--src/armnnSerializer/Serializer.cpp3
-rw-r--r--src/armnnSerializer/SerializerUtils.cpp13
-rw-r--r--src/armnnSerializer/SerializerUtils.hpp2
-rw-r--r--src/armnnSerializer/test/SerializerTests.cpp30
6 files changed, 103 insertions, 5 deletions
diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs
index c577a11a52..40de3496b0 100644
--- a/src/armnnSerializer/ArmnnSchema.fbs
+++ b/src/armnnSerializer/ArmnnSchema.fbs
@@ -619,9 +619,16 @@ table PadLayer {
descriptor:PadDescriptor;
}
+enum PaddingMode : byte {
+ Constant = 0,
+ Reflect = 1,
+ Symmetric = 2
+}
+
table PadDescriptor {
padList:[uint];
padValue:float = 0;
+ paddingMode:PaddingMode = Constant;
}
/// @deprecated Use ElementwiseUnaryLayer instead
diff --git a/src/armnnSerializer/ArmnnSchema_generated.h b/src/armnnSerializer/ArmnnSchema_generated.h
index 712ad28574..7747f9edd9 100644
--- a/src/armnnSerializer/ArmnnSchema_generated.h
+++ b/src/armnnSerializer/ArmnnSchema_generated.h
@@ -1198,6 +1198,39 @@ inline const char *EnumNameNormalizationAlgorithmMethod(NormalizationAlgorithmMe
return EnumNamesNormalizationAlgorithmMethod()[index];
}
+enum PaddingMode {
+ PaddingMode_Constant = 0,
+ PaddingMode_Reflect = 1,
+ PaddingMode_Symmetric = 2,
+ PaddingMode_MIN = PaddingMode_Constant,
+ PaddingMode_MAX = PaddingMode_Symmetric
+};
+
+inline const PaddingMode (&EnumValuesPaddingMode())[3] {
+ static const PaddingMode values[] = {
+ PaddingMode_Constant,
+ PaddingMode_Reflect,
+ PaddingMode_Symmetric
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesPaddingMode() {
+ static const char * const names[4] = {
+ "Constant",
+ "Reflect",
+ "Symmetric",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNamePaddingMode(PaddingMode e) {
+ if (flatbuffers::IsOutRange(e, PaddingMode_Constant, PaddingMode_Symmetric)) return "";
+ const size_t index = static_cast<size_t>(e);
+ return EnumNamesPaddingMode()[index];
+}
+
enum Layer {
Layer_NONE = 0,
Layer_ActivationLayer = 1,
@@ -6383,7 +6416,8 @@ struct PadDescriptor FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef PadDescriptorBuilder Builder;
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_PADLIST = 4,
- VT_PADVALUE = 6
+ VT_PADVALUE = 6,
+ VT_PADDINGMODE = 8
};
const flatbuffers::Vector<uint32_t> *padList() const {
return GetPointer<const flatbuffers::Vector<uint32_t> *>(VT_PADLIST);
@@ -6391,11 +6425,15 @@ struct PadDescriptor FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
float padValue() const {
return GetField<float>(VT_PADVALUE, 0.0f);
}
+ armnnSerializer::PaddingMode paddingMode() const {
+ return static_cast<armnnSerializer::PaddingMode>(GetField<int8_t>(VT_PADDINGMODE, 0));
+ }
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyOffset(verifier, VT_PADLIST) &&
verifier.VerifyVector(padList()) &&
VerifyField<float>(verifier, VT_PADVALUE) &&
+ VerifyField<int8_t>(verifier, VT_PADDINGMODE) &&
verifier.EndTable();
}
};
@@ -6410,6 +6448,9 @@ struct PadDescriptorBuilder {
void add_padValue(float padValue) {
fbb_.AddElement<float>(PadDescriptor::VT_PADVALUE, padValue, 0.0f);
}
+ void add_paddingMode(armnnSerializer::PaddingMode paddingMode) {
+ fbb_.AddElement<int8_t>(PadDescriptor::VT_PADDINGMODE, static_cast<int8_t>(paddingMode), 0);
+ }
explicit PadDescriptorBuilder(flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
@@ -6425,22 +6466,26 @@ struct PadDescriptorBuilder {
inline flatbuffers::Offset<PadDescriptor> CreatePadDescriptor(
flatbuffers::FlatBufferBuilder &_fbb,
flatbuffers::Offset<flatbuffers::Vector<uint32_t>> padList = 0,
- float padValue = 0.0f) {
+ float padValue = 0.0f,
+ armnnSerializer::PaddingMode paddingMode = armnnSerializer::PaddingMode_Constant) {
PadDescriptorBuilder builder_(_fbb);
builder_.add_padValue(padValue);
builder_.add_padList(padList);
+ builder_.add_paddingMode(paddingMode);
return builder_.Finish();
}
inline flatbuffers::Offset<PadDescriptor> CreatePadDescriptorDirect(
flatbuffers::FlatBufferBuilder &_fbb,
const std::vector<uint32_t> *padList = nullptr,
- float padValue = 0.0f) {
+ float padValue = 0.0f,
+ armnnSerializer::PaddingMode paddingMode = armnnSerializer::PaddingMode_Constant) {
auto padList__ = padList ? _fbb.CreateVector<uint32_t>(*padList) : 0;
return armnnSerializer::CreatePadDescriptor(
_fbb,
padList__,
- padValue);
+ padValue,
+ paddingMode);
}
/// @deprecated Use ElementwiseUnaryLayer instead
diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp
index 84a9d53b69..c08784352d 100644
--- a/src/armnnSerializer/Serializer.cpp
+++ b/src/armnnSerializer/Serializer.cpp
@@ -894,7 +894,8 @@ void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer
auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
m_flatBufferBuilder.CreateVector(padList),
- padDescriptor.m_PadValue);
+ padDescriptor.m_PadValue,
+ GetFlatBufferPaddingMode(padDescriptor.m_PaddingMode));
auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
flatBufferBaseLayer,
diff --git a/src/armnnSerializer/SerializerUtils.cpp b/src/armnnSerializer/SerializerUtils.cpp
index 5ad27715c4..49ce7217dc 100644
--- a/src/armnnSerializer/SerializerUtils.cpp
+++ b/src/armnnSerializer/SerializerUtils.cpp
@@ -170,6 +170,19 @@ armnnSerializer::PaddingMethod GetFlatBufferPaddingMethod(armnn::PaddingMethod p
}
}
+armnnSerializer::PaddingMode GetFlatBufferPaddingMode(armnn::PaddingMode paddingMode)
+{
+ switch (paddingMode)
+ {
+ case armnn::PaddingMode::Reflect:
+ return armnnSerializer::PaddingMode::PaddingMode_Reflect;
+ case armnn::PaddingMode::Symmetric:
+ return armnnSerializer::PaddingMode::PaddingMode_Symmetric;
+ default:
+ return armnnSerializer::PaddingMode::PaddingMode_Constant;
+ }
+}
+
armnnSerializer::NormalizationAlgorithmChannel GetFlatBufferNormalizationAlgorithmChannel(
armnn::NormalizationAlgorithmChannel normalizationAlgorithmChannel)
{
diff --git a/src/armnnSerializer/SerializerUtils.hpp b/src/armnnSerializer/SerializerUtils.hpp
index 55179864e8..07cdc2a491 100644
--- a/src/armnnSerializer/SerializerUtils.hpp
+++ b/src/armnnSerializer/SerializerUtils.hpp
@@ -27,6 +27,8 @@ armnnSerializer::OutputShapeRounding GetFlatBufferOutputShapeRounding(
armnnSerializer::PaddingMethod GetFlatBufferPaddingMethod(armnn::PaddingMethod paddingMethod);
+armnnSerializer::PaddingMode GetFlatBufferPaddingMode(armnn::PaddingMode paddingMode);
+
armnnSerializer::NormalizationAlgorithmChannel GetFlatBufferNormalizationAlgorithmChannel(
armnn::NormalizationAlgorithmChannel normalizationAlgorithmChannel);
diff --git a/src/armnnSerializer/test/SerializerTests.cpp b/src/armnnSerializer/test/SerializerTests.cpp
index 2bffe0b9fd..e32b90837d 100644
--- a/src/armnnSerializer/test/SerializerTests.cpp
+++ b/src/armnnSerializer/test/SerializerTests.cpp
@@ -1684,6 +1684,36 @@ TEST_CASE("SerializePad")
deserializedNetwork->ExecuteStrategy(verifier);
}
+TEST_CASE("SerializePadReflect")
+{
+ const std::string layerName("padReflect");
+ const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
+ const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
+
+ armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
+ desc.m_PaddingMode = armnn::PaddingMode::Reflect;
+
+ armnn::INetworkPtr network = armnn::INetwork::Create();
+ armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
+ armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, layerName.c_str());
+ armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
+
+ inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
+ padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
+
+ inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
+ padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
+
+ armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
+ CHECK(deserializedNetwork);
+
+ LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier(layerName,
+ {inputTensorInfo},
+ {outputTensorInfo},
+ desc);
+ deserializedNetwork->ExecuteStrategy(verifier);
+}
+
TEST_CASE("EnsurePadBackwardCompatibility")
{
// The PadDescriptor is being extended with a float PadValue (so a value other than 0