Added stubs to Visitors for Missing Caffe Ops.
ShapeInference, DotDumper, Interpreter now have skeleton implementations
Signed-off-by: Andrei Shedko <a.shedko@partner.samsung.com>
#include "core/modelIR/operations/concat_op.h"
#include "core/modelIR/operations/bias_add_op.h"
#include "core/modelIR/operations/reshape_op.h"
+#include "core/modelIR/operations/batch_norm.h"
+#include "core/modelIR/operations/scale_op.h"
+#include "core/modelIR/operations/dropout_op.h"
namespace nncc
{
op.setOutputShape(0, outShape);
}
+void ShapeInference::visit(ADT::INode::Ref node, ops::ScaleOp &op)
+{
+ fillInputShapes(node, op);
+ op.setOutputShape(0, op.getInputShape(0));
+}
+
+void ShapeInference::visit(ADT::INode::Ref node, ops::DropoutOp &op)
+{
+ fillInputShapes(node, op);
+ op.setOutputShape(0, op.getInputShape(0));
+}
+
+void ShapeInference::visit(ADT::INode::Ref node, ops::BatchNormOp &op)
+{
+ fillInputShapes(node, op);
+ op.setOutputShape(0, op.getInputShape(0));
+}
+
} // namespace model
} // namespace IR
} // namespace core
dotBuilder.updateWithNode(node, nodeInfo);
}
+void IrDotDumper::visit(INode *node, ops::BatchNormOp &op)
+{
+ auto nodeInfo = DotIrNodeInfo().withType("BatchNorm", node->getName())
+ .withInShapes(getInputShapes(op))
+ .withOutShapes(getOutputShapes(op))
+ .withMisc("Moving Average Fraction", op.getMovingAvgFraction())
+ .withMisc("Eps", op.getEps())
+ .withMisc("Spatial", op.getSpatial());
+ dotBuilder.updateWithNode(node, nodeInfo);
+}
+
+void IrDotDumper::visit(INode *node, ops::ScaleOp &op)
+{
+ auto nodeInfo = DotIrNodeInfo().withType("ScaleOp", node->getName())
+ .withInShapes(getInputShapes(op))
+ .withOutShapes(getOutputShapes(op))
+ .withShape("Scale Tensor", op.getWeights().getShape());
+ dotBuilder.updateWithNode(node, nodeInfo);
+}
+
+void IrDotDumper::visit(INode *node, ops::DropoutOp &op)
+{
+ auto nodeInfo = DotIrNodeInfo().withType("DropoutOp", node->getName())
+ .withInShapes(getInputShapes(op))
+ .withOutShapes(getOutputShapes(op))
+ .withMisc("DropRate",op.getRate());
+ dotBuilder.updateWithNode(node, nodeInfo);
+}
+
} // namespace dumper
} // namespace core
} // namespace contrib
+
+#include <core/modelIR/visitor.h>
+
#include "core/modelIR/visitor.h"
namespace nncc {
void Visitor::visit(ADT::INode *node, ops::VariableOp &op) {(void)node; (void)op;};
void Visitor::visit(ADT::INode *node, ops::ReluOp &op) {(void)node; (void)op;};
void Visitor::visit(ADT::INode *node, ops::ReshapeOp &op) {(void)node; (void)op;};
+void Visitor::visit(ADT::INode *node, ops::ScaleOp &op) {(void)node; (void)op;};
+void Visitor::visit(ADT::INode *node, ops::BatchNormOp &op) {(void)node; (void)op;};
+void Visitor::visit(ADT::INode *node, ops::DropoutOp &op) {(void)node; (void)op;};
} // namespace model
} // namespace IR
void visit(ADT::INode::Ref node, ops::BiasAddOp &op) override;
void visit(ADT::INode::Ref node, ops::ReshapeOp &op) override;
void visit(ADT::INode::Ref node, ops::VariableOp &op) override;
+ void visit(ADT::INode *node, ops::ScaleOp &op) override;
+ void visit(ADT::INode *node, ops::BatchNormOp &op) override;
+ void visit(ADT::INode *node, ops::DropoutOp &op) override;
- protected:
+protected:
void fillInputShapes(ADT::INode::Ref node, OpDescription &op);
};
#include "core/modelIR/operations/concat_op.h"
#include "core/modelIR/operations/bias_add_op.h"
#include "core/modelIR/operations/reshape_op.h"
+#include "core/modelIR/operations/batch_norm.h"
+#include "core/modelIR/operations/scale_op.h"
+#include "core/modelIR/operations/dropout_op.h"
#include "core/modelIR/ir_dot_builder.h"
void visit(INode *node, ops::BiasAddOp &op) override;
void visit(INode *node, ops::VariableOp &op) override;
void visit(INode *node, ops::ReshapeOp &op) override;
+ void visit(INode *node, ops::ScaleOp &op) override;
+ void visit(INode *node, ops::BatchNormOp &op) override;
+ void visit(INode *node, ops::DropoutOp &op) override;
void writeDot(std::ostream &os) { dotBuilder.writeDot(os); };
bool hasPool = false;
PoolType poolType = PoolType::MAX;
-
- float axis = -1;
};
} // namespace dumper
class VariableOp;
class ReluOp;
class ReshapeOp;
+ class ScaleOp;
+ class BatchNormOp;
+ class DropoutOp;
}
/**
virtual void visit(ADT::INode *node, ops::VariableOp &op) = 0;
virtual void visit(ADT::INode *node, ops::ReluOp &op) = 0;
virtual void visit(ADT::INode *node, ops::ReshapeOp &op) = 0;
+ virtual void visit(ADT::INode *node, ops::ScaleOp &op) = 0;
+ virtual void visit(ADT::INode *node, ops::BatchNormOp &op) = 0;
+ virtual void visit(ADT::INode *node, ops::DropoutOp &op) = 0;
virtual ~IVisitor() = default;
};
void visit(ADT::INode *node, ops::VariableOp &op) override;
void visit(ADT::INode *node, ops::ReluOp &op) override;
void visit(ADT::INode *node, ops::ReshapeOp &op) override;
+ void visit(ADT::INode *node, ops::ScaleOp &op) override;
+ void visit(ADT::INode *node, ops::BatchNormOp &op) override;
+ void visit(ADT::INode *node, ops::DropoutOp &op) override;
+
+ ~Visitor() override = default;
+
};
} // namespace model
void visit(ADT::INode::Ref node, ops::BiasAddOp &op) override;
void visit(ADT::INode::Ref node, ops::VariableOp &op) override;
void visit(ADT::INode::Ref node, ops::ReshapeOp &op) override;
+ void visit(ADT::INode::Ref node, ops::ScaleOp &op) override;
+ void visit(ADT::INode::Ref node, ops::BatchNormOp &op) override;
+ void visit(ADT::INode::Ref node, ops::DropoutOp &op) override;
void setInput(const std::string &name, const TensorVariant& data);
std::vector<TensorVariant> &getResult(ADT::INode::Ref node);
#include <cmath>
+#include <cassert>
#include "plugin/interpreter/Interpreter.h"
#include "core/modelIR/operations/relu_op.h"
#include "core/modelIR/operations/concat_op.h"
#include "core/modelIR/operations/bias_add_op.h"
+#include "core/modelIR/operations/batch_norm.h"
+#include "core/modelIR/operations/scale_op.h"
+#include "core/modelIR/operations/dropout_op.h"
#include "ops/Bias.h"
#include "ops/Concat.h"
var(node->getId()) = impl::BiasAdd(input, op.getWeights(), op.getOutputShape(0))();
}
+void NNInterpreter::visit(ADT::INode *node, ops::BatchNormOp &op)
+{
+ mapByName(node);
+ auto operand = node->getPrevNodes()[0];
+ TensorVariant input(var(operand.node->getId())[operand.index]);
+ (void)input; (void)op;
+ // TODO implement this
+ // var(node->getId()) = impl::BatchNormOp(input, op)();
+ assert("BatchNormOp Not implemented yet" == 0);
+
+}
+
+void NNInterpreter::visit(ADT::INode *node, ops::ScaleOp &op)
+{
+ mapByName(node);
+ auto operand = node->getPrevNodes()[0];
+ TensorVariant input(var(operand.node->getId())[operand.index]);
+ (void)input; (void)op;
+ // TODO implement this
+ // var(node->getId()) = impl::ScaleOp(input, op)();
+ assert("ScaleOp Not implemented yet" == 0);
+}
+
+void NNInterpreter::visit(ADT::INode *node, ops::DropoutOp &op)
+{
+ mapByName(node);
+ auto operand = node->getPrevNodes()[0];
+ TensorVariant input(var(operand.node->getId())[operand.index]);
+ (void)input; (void)op;
+ // TODO implement this
+ // var(node->getId()) = impl::DropoutOp(input, op)();
+ assert("DropoutOp Not implemented yet" == 0);
+}
+
void NNInterpreter::mapByName(ADT::INode::Ref n) {
auto &nodeName = n->getName();
if (nodeByName.find(nodeName) != nodeByName.end())
#include "core/modelIR/operations/bias_add_op.h"
#include "core/modelIR/operations/relu_op.h"
#include "core/modelIR/operations/reshape_op.h"
+#include "core/modelIR/operations/batch_norm.h"
+#include "core/modelIR/operations/scale_op.h"
+#include "core/modelIR/operations/dropout_op.h"
using namespace std;
addOpDescr(node, "reshape");
}
+void ModelAnalyzer::visit(ADT::INode *node, ops::DropoutOp &op)
+{
+ addOpDescr(node, "dropout");
+}
+
+void ModelAnalyzer::visit(ADT::INode *node, ops::ScaleOp &op)
+{
+ addOpDescr(node, "scale");
+}
+
+void ModelAnalyzer::visit(ADT::INode *node, ops::BatchNormOp &op)
+{
+ addOpDescr(node, "batchNorm");
+}
+
} // namespace soft
} // namespace backend
} // namespace contrib
void visit(ADT::INode *node, ops::VariableOp &op) override;
void visit(ADT::INode *node, ops::ReluOp &op) override;
void visit(ADT::INode *node, ops::ReshapeOp &op) override;
+ void visit(ADT::INode *node, ops::ScaleOp &op) override;
+ void visit(ADT::INode *node, ops::BatchNormOp &op) override;
+ void visit(ADT::INode *node, ops::DropoutOp &op) override;
struct TensorDescription
{
#include "core/modelIR/operations/bias_add_op.h"
#include "core/modelIR/operations/relu_op.h"
#include "core/modelIR/operations/reshape_op.h"
+#include "core/modelIR/operations/batch_norm.h"
+#include "core/modelIR/operations/scale_op.h"
+#include "core/modelIR/operations/dropout_op.h"
#include "core/modelIR/ir_node.h"
#include <algorithm>
serializeShape(op.getOutputShape(0));
}
+void Serializer::visit(ADT::INode *node, ops::BatchNormOp &op)
+{
+ _curOp->_paramStartOffset = _buffer.size();
+ serializeT<float>(op.getEps());
+ serializeT<float>(op.getMovingAvgFraction());
+ serializeT<bool>(op.getSpatial());
+}
+
+void Serializer::visit(ADT::INode *node, ops::ScaleOp &op)
+{
+ _curOp->_paramStartOffset = _buffer.size();
+ serializeTensor(op.getWeights());
+}
+
+void Serializer::visit(ADT::INode *node, ops::DropoutOp &op)
+{
+ _curOp->_paramStartOffset = _buffer.size();
+ serializeT<float>(op.getRate());
+}
+
void Serializer::serialize(list<ModelAnalyzer::OpDescr> &inferenceSequence)
{
for (ModelAnalyzer::OpDescr &descr: inferenceSequence)
void visit(ADT::INode *node, ops::VariableOp &op) override;
void visit(ADT::INode *node, ops::ReluOp &op) override;
void visit(ADT::INode *node, ops::ReshapeOp &op) override;
+ void visit(ADT::INode *node, ops::ScaleOp &op) override;
+ void visit(ADT::INode *node, ops::BatchNormOp &op) override;
+ void visit(ADT::INode *node, ops::DropoutOp &op) override;
void serialize(std::list<ModelAnalyzer::OpDescr> &inferenceSequence);