#include "caffe2_proto_helper.h"
#include "mir/ops/BatchNormOp.h"
-#include "mir/ops/BiasAddOp.h"
#include "mir/ops/CappedReluOp.h"
#include "mir/ops/ConcatOp.h"
#include "mir/ops/ConstantOp.h"
#include "mir/ops/ReluOp.h"
#include "mir/ops/ReshapeOp.h"
#include "mir/ops/ResizeOp.h"
-#include "mir/ops/ScaleOp.h"
#include "mir/ops/SigmoidOp.h"
#include "mir/ops/SoftmaxOp.h"
#include "mir/ops/TransposeOp.h"
return transpose->getOutput(0);
}
+mir::Operation::Output *Caffe2OpCreator::createAdd(const std::string &name,
+ mir::Operation::Output *arg1,
+ mir::Operation::Output *arg2)
+{
+ std::vector<mir::Operation::Output *> inputs{arg1, arg2};
+ auto op = createOp<ops::ElementwiseOp>(name, inputs, ops::ElementwiseOp::OpType::add);
+ return op->getOutput(0);
+}
+
+mir::Operation::Output *Caffe2OpCreator::createMul(const std::string &name,
+ mir::Operation::Output *arg1,
+ mir::Operation::Output *arg2)
+{
+ std::vector<mir::Operation::Output *> inputs{arg1, arg2};
+ auto op = createOp<ops::ElementwiseOp>(name, inputs, ops::ElementwiseOp::OpType::mul);
+ return op->getOutput(0);
+}
+
//
// Check functions
//
int num_groups = getSingleArgument(op, "group", 1);
bool is_depthwise = (num_groups != 1) && (in_group_size == 1) && (out_channels == num_groups);
- mir::Operation *result;
+ mir::Operation::Output *result;
if (is_depthwise)
{
// TODO handle properly kernel with layer multiplier
auto transposed_tensor = mir::transposeTensor<0, 1, 3, 2>(kernel_tensor);
auto kernel = createOp<ops::ConstantOp>("Constant", transposed_tensor)->getOutput(0);
result = createOp<ops::DepthwiseConv2DOp>("Depthwise_Conv2D", convertCaffeToMIR(inputs[0]),
- kernel, stride_shape, pad_before, pad_after);
+ kernel, stride_shape, pad_before, pad_after)
+ ->getOutput(0);
}
else
{
kernel_tensor = transposeTensor<3, 0, 1, 2>(kernel_tensor);
auto kernel = createOp<ops::ConstantOp>("Constant", kernel_tensor)->getOutput(0);
result = createOp<ops::Conv2DOp>("Conv2D", convertCaffeToMIR(inputs[0]), kernel, stride_shape,
- pad_before, pad_after);
+ pad_before, pad_after)
+ ->getOutput(0);
}
if (op.input_size() > 2)
{
- result = createOp<ops::BiasAddOp>("Bias_Add", result->getOutput(0), inputs[2]);
+ result = createAdd("Bias_Add", result, inputs[2]);
}
- return {convertMIRToCaffe(result->getOutput(0))};
+ return {convertMIRToCaffe(result)};
}
std::vector<mir::Operation::Output *>
// Transform input into 2-D tensor by flattening axes
Shape shape{input_shape.dim(0), input_shape.numElements() / input_shape.dim(0)};
- auto reshape = createOp<ops::ReshapeOp>("Reshape", inputs[0], shape);
+ auto reshape = createOp<ops::ReshapeOp>("Reshape", inputs[0], shape)->getOutput(0);
auto weights = createOp<ops::ConstantOp>("Constant", weights_tensor)->getOutput(0);
- auto result = createOp<ops::FullyConnectedOp>("Fully_Connected", reshape->getOutput(0), weights);
- result = createOp<ops::BiasAddOp>("Bias_Add", result->getOutput(0), inputs[2]);
+ auto result = createOp<ops::FullyConnectedOp>("Fully_Connected", reshape, weights)->getOutput(0);
+ result = createAdd("Bias_Add", result, inputs[2]);
- return {result->getOutput(0)};
+ return {result};
}
std::vector<mir::Operation::Output *>
bias_data.at(idx) *= -1;
auto mean = createOp<ops::ConstantOp>("Constant", mean_tensor)->getOutput(0);
- auto result = createOp<ops::BiasAddOp>("Bias_Add", convertCaffeToMIR(inputs[0]), mean);
+ auto result = createAdd("Bias_Add", convertCaffeToMIR(inputs[0]), mean);
// res2 = res1 * scale / (var + epsilon)
Tensor<float> multiplier(scale_tensor);
for (auto &idx : ShapeRange(scale_tensor.getShape()))
multiplier.at(idx) /= std::sqrt(*reinterpret_cast<float *>(var_tensor.at(idx)) + eps);
auto scale = createOp<ops::ConstantOp>("Constant", scale_tensor)->getOutput(0);
- result = createOp<ops::ScaleOp>("Scale", result->getOutput(0), scale);
+ result = createMul("Scale", result, scale);
// overall_res = res2 + bias
auto bias = createOp<ops::ConstantOp>("Constant", bias_tensor)->getOutput(0);
- result = createOp<ops::BiasAddOp>("Bias_Add", result->getOutput(0), bias);
+ result = createAdd("Bias_Add", result, bias);
- return {convertMIRToCaffe(result->getOutput(0))};
+ return {convertMIRToCaffe(result)};
}
std::vector<mir::Operation::Output *>