aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sloyan <matthew.sloyan@arm.com>2021-08-09 15:33:41 +0100
committerMatthew Sloyan <matthew.sloyan@arm.com>2021-08-09 21:51:27 +0100
commitb20d1d4888c270d4d57a0bdcc011ded89a2f5b38 (patch)
treee4d5d3b5b5ae7ac0148c65e71d03ad9b2859df08
parentcd92c9c3835f4e5d1677b3f3aaae9e49a62bd537 (diff)
downloadarmnn-b20d1d4888c270d4d57a0bdcc011ded89a2f5b38.tar.gz
IVGCVSW-6119 ConstTensorsAsInput: FullyConnected Bug Fix
* Updated FullyConnected layer member variables when cloning as some backends still require them. * Added SetConstant call when using deprecated AddFullyConnectedLayer method to ensure backwards compatibility. * Added SetConstant to SimpleSample to ensure it runs on all backends. Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com> Change-Id: Ie7b4e4b868f23f8fcf9c41ffd12e2ea9ea53afca
-rw-r--r--samples/SimpleSample.cpp3
-rw-r--r--src/armnn/BackendHelper.cpp6
-rw-r--r--src/armnn/Network.cpp12
-rw-r--r--src/armnn/layers/FullyConnectedLayer.cpp5
4 files changed, 23 insertions, 3 deletions
diff --git a/samples/SimpleSample.cpp b/samples/SimpleSample.cpp
index 6bdc2983bb..3f94b53ca1 100644
--- a/samples/SimpleSample.cpp
+++ b/samples/SimpleSample.cpp
@@ -29,6 +29,7 @@ int main()
float weightsData[] = {1.0f}; // Identity
TensorInfo weightsInfo(TensorShape({1, 1}), DataType::Float32);
+ weightsInfo.SetConstant();
ConstTensor weights(weightsInfo, weightsData);
// Constant layer that now holds weights data for FullyConnected
@@ -54,7 +55,7 @@ int main()
TensorInfo outputTensorInfo(TensorShape({1, 1}), DataType::Float32);
fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
- constantWeightsLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
+ constantWeightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
// Optimise ArmNN network
IOptimizedNetworkPtr optNet = Optimize(*myNetwork, {Compute::CpuRef}, run->GetDeviceSpec());
diff --git a/src/armnn/BackendHelper.cpp b/src/armnn/BackendHelper.cpp
index 9ab30f8fb2..594d76916c 100644
--- a/src/armnn/BackendHelper.cpp
+++ b/src/armnn/BackendHelper.cpp
@@ -407,12 +407,18 @@ bool LayerSupportHandle::IsFullyConnectedSupported(const TensorInfo& input,
{
if(!weights.IsConstant())
{
+ reasonIfUnsupported.value() =
+ "This backend might not support non constant weights. "
+ "If weights are constant make sure to set IsConstant when creating TensorInfo";
return false;
}
if(descriptor.m_BiasEnabled)
{
if(!biases.IsConstant())
{
+ reasonIfUnsupported.value() =
+ "This backend might not support non constant bias. "
+ "If bias are constant make sure to set IsConstant when creating TensorInfo";
return false;
}
}
diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp
index 22a71c4923..365f1bdfa1 100644
--- a/src/armnn/Network.cpp
+++ b/src/armnn/Network.cpp
@@ -1805,7 +1805,11 @@ IConnectableLayer* NetworkImpl::AddFullyConnectedLayer(const FullyConnectedDescr
{
weightsLayer = m_Graph->AddLayer<ConstantLayer>("Weights");
weightsLayer->m_LayerOutput = std::make_shared<ScopedTensorHandle>(weights.value());
- weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsLayer->m_LayerOutput->GetTensorInfo());
+
+ TensorInfo weightsInfo = weightsLayer->m_LayerOutput->GetTensorInfo();
+ weightsInfo.SetConstant();
+
+ weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
}
else if (fullyConnectedDescriptor.m_ConstantWeights)
{
@@ -1817,7 +1821,11 @@ IConnectableLayer* NetworkImpl::AddFullyConnectedLayer(const FullyConnectedDescr
{
biasLayer = m_Graph->AddLayer<ConstantLayer>("Biases");
biasLayer->m_LayerOutput = std::make_shared<ScopedTensorHandle>(biases.value());
- biasLayer->GetOutputSlot(0).SetTensorInfo(biasLayer->m_LayerOutput->GetTensorInfo());
+
+ TensorInfo biasInfo = biasLayer->m_LayerOutput->GetTensorInfo();
+ biasInfo.SetConstant();
+
+ biasLayer->GetOutputSlot(0).SetTensorInfo(biasInfo);
}
if (numInputs < 2)
diff --git a/src/armnn/layers/FullyConnectedLayer.cpp b/src/armnn/layers/FullyConnectedLayer.cpp
index 8dfb011730..259d4149c8 100644
--- a/src/armnn/layers/FullyConnectedLayer.cpp
+++ b/src/armnn/layers/FullyConnectedLayer.cpp
@@ -38,6 +38,11 @@ std::unique_ptr<IWorkload> FullyConnectedLayer::CreateWorkload(const IWorkloadFa
FullyConnectedLayer* FullyConnectedLayer::Clone(Graph& graph) const
{
auto layer = CloneBase<FullyConnectedLayer>(graph, m_Param, GetName());
+ layer->m_Weight = m_Weight ? m_Weight : nullptr;
+ if (layer->m_Param.m_BiasEnabled)
+ {
+ layer->m_Bias = m_Bias ? m_Bias : nullptr;
+ }
return std::move(layer);
}