Removed const transformer usage in graph transformer (#1164)
* Commented constant folding * Fix
This commit is contained in:
parent
ab19051b7d
commit
5d573e39cd
@ -40,11 +40,6 @@ public:
|
||||
*/
|
||||
void fullTrim();
|
||||
|
||||
/**
|
||||
* @brief move blobs from Constant layers to Convolution or FullyConnected layers attributes
|
||||
*/
|
||||
void moveWeights();
|
||||
|
||||
protected:
|
||||
/**
|
||||
* @brief collect all const layers with marking if it defines shape (1 - for shape, 0 - otherwise)
|
||||
|
@ -12,7 +12,6 @@
|
||||
#include <map>
|
||||
#include <utility>
|
||||
#include <memory>
|
||||
#include <shape_infer/const_infer/ie_const_infer_holder.hpp>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <mutex>
|
||||
@ -29,7 +28,7 @@ using namespace InferenceEngine::details;
|
||||
|
||||
namespace InferenceEngine {
|
||||
|
||||
bool isForFakeQuantzie(const CNNLayer& layer) {
|
||||
bool isForFakeQuantize(const CNNLayer& layer) {
|
||||
for (const DataPtr data : layer.outData) {
|
||||
for (const auto it : data->getInputTo()) {
|
||||
const CNNLayerPtr childLayer = it.second;
|
||||
@ -233,7 +232,8 @@ static std::vector<std::string> skipConstInfer = {
|
||||
"FakeQuantize",
|
||||
"Quantize",
|
||||
"CumSum", // Const inference function for CumSum is not implemented
|
||||
"Convolution" // Const inference function for Convolution is not implemented
|
||||
"Convolution", // Const inference function for Convolution is not implemented
|
||||
"Eltwise", // Const inference function for Eltwise is not implemented
|
||||
};
|
||||
|
||||
const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::vector<CNNLayerPtr>& sortedLayers) {
|
||||
@ -243,7 +243,8 @@ const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::ve
|
||||
// Layers with "Shape" and "Const" type are Const by definition
|
||||
if (layer->type == "Shape" || layer->type == "Const") {
|
||||
mapConstLayers[layer->name] = false;
|
||||
} else if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end() && !isForFakeQuantzie(*layer)) {
|
||||
} else if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end() &&
|
||||
!isForFakeQuantize(*layer)) {
|
||||
bool isAllInputsConst = true;
|
||||
for (auto const& data : layer->insData) {
|
||||
auto creator = data.lock()->getCreatorLayer().lock();
|
||||
@ -253,7 +254,7 @@ const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::ve
|
||||
}
|
||||
} else {
|
||||
// Empty creator means that it's a network representation via inputs/outs data collection
|
||||
// And it's a firs layer in network.
|
||||
// And it's a first layer in network.
|
||||
isAllInputsConst = false;
|
||||
}
|
||||
}
|
||||
@ -309,7 +310,6 @@ const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::ve
|
||||
|
||||
const BlobMap ConstTransformer::getConstData(const std::map<std::string, bool>& constLayers,
|
||||
const std::vector<CNNLayerPtr>& sortedLayers) {
|
||||
ShapeInfer::ConstInferHolder holder;
|
||||
BlobMap constData;
|
||||
auto getInputBlobs = [&constData](const std::vector<DataWeakPtr>& insData,
|
||||
bool isForShape) -> std::vector<Blob::CPtr> {
|
||||
@ -344,30 +344,21 @@ const BlobMap ConstTransformer::getConstData(const std::map<std::string, bool>&
|
||||
};
|
||||
|
||||
for (const auto& layer : sortedLayers) {
|
||||
if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) != skipConstInfer.end()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (constLayers.find(layer->name) != constLayers.end()) {
|
||||
std::string layerName = layer->name;
|
||||
bool isForShape = constLayers.at(layerName);
|
||||
|
||||
auto implPtr = holder.getConstInferImpl(layer->type);
|
||||
if (!implPtr && !isForShape)
|
||||
if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end())
|
||||
THROW_IE_EXCEPTION << "Failed to find reference implementation for `" + layer->name +
|
||||
"` Layer with `" + layer->type + "` Type on constant propagation";
|
||||
if (!isForShape && layer->type != "Const")
|
||||
THROW_IE_EXCEPTION << "Failed to find reference implementation for `" + layer->name +
|
||||
"` Layer with `" + layer->type + "` Type on constant propagation";
|
||||
if (!isForShape) {
|
||||
auto outputBlobs = getOutputBlobs(layer->outData);
|
||||
auto inp = getInputBlobs(layer->insData, isForShape);
|
||||
if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end())
|
||||
implPtr->infer(inp, layer->params, layer->blobs, outputBlobs);
|
||||
for (int i = 0; i < layer->outData.size(); i++) {
|
||||
std::string dataName = layer->outData[i]->getName();
|
||||
auto shapes = layer->outData[i]->getTensorDesc().getDims();
|
||||
outputBlobs[i]->getTensorDesc().reshape(shapes, TensorDesc::getLayoutByDims(shapes));
|
||||
constData[dataName] = outputBlobs[i];
|
||||
}
|
||||
auto & blobs = layer->blobs;
|
||||
auto it = blobs.find("custom");
|
||||
if (it == blobs.end())
|
||||
THROW_IE_EXCEPTION << "Missed `custom` blob in Const layer";
|
||||
|
||||
auto dataName = layer->outData[0]->getName();
|
||||
constData[dataName] = (*it).second;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -587,35 +587,6 @@ TEST_F(RemoveLayerTests, canGetConstDataForUnknownImpl) {
|
||||
ASSERT_EQ(getData("data9")->getTensorDesc().getDims(), refShape);
|
||||
}
|
||||
|
||||
TEST_F(RemoveLayerTests, canFoldConstSubgraphs) {
|
||||
IE::BlobMap refBlobs = initConstLayers({"input1", "input2", "input3"});
|
||||
std::vector<std::string> refNewLayers = {"layer5__data9__Const"};
|
||||
{ // TODO: method for marking layers
|
||||
getLayer("layer1")->type = "Mul";
|
||||
getLayer("layer2")->type = "Shape";
|
||||
getLayer("layer3")->type = "Power";
|
||||
getLayer("layer3")->params = {{"power", "1"},
|
||||
{"scale", "2"},
|
||||
{"shift", "-4"}};
|
||||
getLayer("layer4")->type = "Mul";
|
||||
getLayer("layer5")->type = "Mul";
|
||||
}
|
||||
float arr[] = {-2.f, 0.f, 54.f};
|
||||
auto ref5 = make_blob_with_precision(getData("data9")->getTensorDesc(), arr);
|
||||
|
||||
IE::ConstTransformer transformator(net.get());
|
||||
transformator.foldConstSubgraphs();
|
||||
|
||||
IE::CNNNetwork cnnNetwork(net);
|
||||
ASSERT_EQ(net->allLayers().size(), originalLayersNum - 7);
|
||||
auto newLayer = CommonTestUtils::getLayerByName(cnnNetwork, refNewLayers[0].c_str());
|
||||
auto actualBlob = newLayer->blobs["custom"];
|
||||
ASSERT_NE(actualBlob, nullptr);
|
||||
ASSERT_FALSE(actualBlob->buffer() == nullptr);
|
||||
TestsCommon::compare(*actualBlob, *ref5);
|
||||
ASSERT_EQ(newLayer->type, "Const");
|
||||
}
|
||||
|
||||
TEST_F(RemoveLayerTests, canSkipConstCalculation) {
|
||||
IE::BlobMap refBlobs = initConstLayers({"input1", "input2", "input3"});
|
||||
getLayer("layer6")->type = "Reshape";
|
||||
@ -950,887 +921,3 @@ TEST_F(AdvancedShapeInferTests, canReshapeWithScalar) {
|
||||
ASSERT_EQ(getData("data1")->getTensorDesc().getDims(), newInShape);
|
||||
ASSERT_EQ(getData("data3")->getTensorDesc().getDims(), newOutShape);
|
||||
}
|
||||
|
||||
TEST_F(AdvancedShapeInferTests, canFoldConstWithOneHot) {
|
||||
// Const-d1-OneHot-d2
|
||||
// \
|
||||
// I1-d3-Eltw(Sum)-d4
|
||||
auto testFunc = [&](IE::Precision precision) {
|
||||
netBuilder = NetBuilder();
|
||||
net = netBuilder
|
||||
.data("data1", IE::TensorDesc(precision, IE::SizeVector{2}, IE::Layout::C))
|
||||
.data("data2", IE::TensorDesc(precision, IE::SizeVector{10, 2}, IE::Layout::NC))
|
||||
.data("data3", IE::TensorDesc(precision, IE::SizeVector{10, 2}, IE::Layout::NC))
|
||||
.data("data4", IE::TensorDesc(precision, IE::SizeVector{10, 2}, IE::Layout::NC))
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"const", "dummy", precision})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"oneHot", "OneHot", precision})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input", "input", precision})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"eltwise", "Eltwise", precision})
|
||||
.linkToData("const", "data1")
|
||||
.linkDataTo("data1", "oneHot")
|
||||
.linkToData("oneHot", "data2")
|
||||
.linkDataTo("data2", "eltwise")
|
||||
.linkToData("input", "data3")
|
||||
.linkDataTo("data3", "eltwise")
|
||||
.linkToData("eltwise", "data4")
|
||||
.addInput("data3")
|
||||
.finalize();
|
||||
getLayer("oneHot")->params = {
|
||||
{"axis", "-1"},
|
||||
{"depth", "10"},
|
||||
{"off_value", "1.0"},
|
||||
{"on_value", "1.0"}
|
||||
};
|
||||
getLayer("eltwise")->params = {
|
||||
{"operation", "sum"}
|
||||
};
|
||||
originalLayersNum = net->allLayers().size();
|
||||
|
||||
IE::CNNNetwork cnnNetwork(net);
|
||||
initConstLayers({"const"});
|
||||
IE::ConstTransformer transformator(net.get());
|
||||
transformator.fullTrim();
|
||||
|
||||
ASSERT_EQ(net->allLayers().size(), originalLayersNum - 1);
|
||||
};
|
||||
|
||||
testFunc(IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16);
|
||||
testFunc(IE::Precision::Q78);
|
||||
testFunc(IE::Precision::I16);
|
||||
testFunc(IE::Precision::U8);
|
||||
testFunc(IE::Precision::I8);
|
||||
testFunc(IE::Precision::U16);
|
||||
testFunc(IE::Precision::I32);
|
||||
testFunc(IE::Precision::I64);
|
||||
testFunc(IE::Precision::U64);
|
||||
}
|
||||
|
||||
TEST_F(AdvancedShapeInferTests, MulWithTensorConstInferTest) {
|
||||
|
||||
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
|
||||
|
||||
netBuilder = NetBuilder();
|
||||
net = netBuilder
|
||||
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
|
||||
.data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{2, 2}, IE::Layout::NC))
|
||||
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"mulLayer", "Eltwise", IE::Precision::UNSPECIFIED})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
|
||||
.linkToData("input1", "data1")
|
||||
.linkToData("input2", "data2")
|
||||
.linkDataTo("data1", "mulLayer")
|
||||
.linkDataTo("data2", "mulLayer")
|
||||
.linkToData("mulLayer", "data3")
|
||||
.addInput("data1")
|
||||
.addInput("data2")
|
||||
.finalize();
|
||||
|
||||
getLayer("mulLayer")->params = {
|
||||
{"operation", "mul"}
|
||||
};
|
||||
|
||||
IE::CNNNetwork cnnNetwork(net);
|
||||
initConstLayersDiffPrec({"input1", "input2"});
|
||||
float ref[] = {4, 9, 16, 25};
|
||||
if (precisionOutData == IE::Precision::FP16) {
|
||||
for (int i = 0; i < 4; i++)
|
||||
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
|
||||
}
|
||||
IE::ConstTransformer transformator(net.get());
|
||||
transformator.foldConstSubgraphs();
|
||||
switch(precisionOutData) {
|
||||
case IE::Precision::U8: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::U64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP16: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
THROW_IE_EXCEPTION << "Unsupported precision!";
|
||||
}
|
||||
};
|
||||
|
||||
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
|
||||
}
|
||||
|
||||
|
||||
TEST_F(AdvancedShapeInferTests, MulWithScalarConstInferTest) {
|
||||
|
||||
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
|
||||
|
||||
netBuilder = NetBuilder();
|
||||
net = netBuilder
|
||||
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
|
||||
.data("data2", IE::TensorDesc(precisionInData2, IE::Layout::SCALAR))
|
||||
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"mulLayer", "Eltwise", IE::Precision::UNSPECIFIED})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
|
||||
.linkToData("input1", "data1")
|
||||
.linkToData("input2", "data2")
|
||||
.linkDataTo("data1", "mulLayer")
|
||||
.linkDataTo("data2", "mulLayer")
|
||||
.linkToData("mulLayer", "data3")
|
||||
.addInput("data1")
|
||||
.addInput("data2")
|
||||
.finalize();
|
||||
|
||||
getLayer("mulLayer")->params = {
|
||||
{"operation", "mul"}
|
||||
};
|
||||
|
||||
IE::CNNNetwork cnnNetwork(net);
|
||||
initConstLayersDiffPrec({"input1", "input2"});
|
||||
float ref[] = {4, 6, 8, 10};
|
||||
if (precisionOutData == IE::Precision::FP16) {
|
||||
for (int i = 0; i < 4; i++)
|
||||
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
|
||||
}
|
||||
IE::ConstTransformer transformator(net.get());
|
||||
transformator.foldConstSubgraphs();
|
||||
switch(precisionOutData) {
|
||||
case IE::Precision::U8: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::U64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP16: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
THROW_IE_EXCEPTION << "Unsupported precision!";
|
||||
}
|
||||
};
|
||||
|
||||
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
|
||||
}
|
||||
|
||||
TEST_F(AdvancedShapeInferTests, AddWithScalarConstInferTest) {
|
||||
|
||||
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
|
||||
|
||||
netBuilder = NetBuilder();
|
||||
net = netBuilder
|
||||
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
|
||||
.data("data2", IE::TensorDesc(precisionInData2, IE::Layout::SCALAR))
|
||||
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2},IE::Layout::NC))
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"addLayer", "Eltwise", IE::Precision::UNSPECIFIED})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
|
||||
.linkToData("input1", "data1")
|
||||
.linkToData("input2", "data2")
|
||||
.linkDataTo("data1", "addLayer")
|
||||
.linkDataTo("data2", "addLayer")
|
||||
.linkToData("addLayer", "data3")
|
||||
.addInput("data1")
|
||||
.addInput("data2")
|
||||
.finalize();
|
||||
|
||||
getLayer("addLayer")->params = {
|
||||
{"operation", "sum"}
|
||||
};
|
||||
|
||||
IE::CNNNetwork cnnNetwork(net);
|
||||
initConstLayersDiffPrec({"input1", "input2"});
|
||||
float ref[] = {4, 5, 6, 7};
|
||||
if (precisionOutData == IE::Precision::FP16) {
|
||||
for (int i = 0; i < 4; i++)
|
||||
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
|
||||
}
|
||||
IE::ConstTransformer transformator(net.get());
|
||||
transformator.foldConstSubgraphs();
|
||||
switch(precisionOutData) {
|
||||
case IE::Precision::U8: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::U64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP16: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
THROW_IE_EXCEPTION << "Unsupported precision!";
|
||||
}
|
||||
};
|
||||
|
||||
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
|
||||
}
|
||||
|
||||
TEST_F(AdvancedShapeInferTests, AddWithTensorConstInferTest) {
|
||||
|
||||
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
|
||||
|
||||
netBuilder = NetBuilder();
|
||||
net = netBuilder
|
||||
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
|
||||
.data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{2, 2}, IE::Layout::NC))
|
||||
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"addLayer", "Eltwise", IE::Precision::UNSPECIFIED})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
|
||||
.linkToData("input1", "data1")
|
||||
.linkToData("input2", "data2")
|
||||
.linkDataTo("data1", "addLayer")
|
||||
.linkDataTo("data2", "addLayer")
|
||||
.linkToData("addLayer", "data3")
|
||||
.addInput("data1")
|
||||
.addInput("data2")
|
||||
.finalize();
|
||||
|
||||
getLayer("addLayer")->params = {
|
||||
{"operation", "sum"}
|
||||
};
|
||||
|
||||
IE::CNNNetwork cnnNetwork(net);
|
||||
initConstLayersDiffPrec({"input1", "input2"});
|
||||
float ref[] = {4, 6, 8, 10};
|
||||
if (precisionOutData == IE::Precision::FP16) {
|
||||
for (int i = 0; i < 4; i++)
|
||||
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
|
||||
}
|
||||
IE::ConstTransformer transformator(net.get());
|
||||
transformator.foldConstSubgraphs();
|
||||
switch(precisionOutData) {
|
||||
case IE::Precision::U8: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::U64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP16: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
THROW_IE_EXCEPTION << "Unsupported precision!";
|
||||
}
|
||||
};
|
||||
|
||||
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
|
||||
}
|
||||
|
||||
TEST_F(AdvancedShapeInferTests, AddWithBroadcastingConstInferTest) {
|
||||
|
||||
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
|
||||
|
||||
netBuilder = NetBuilder();
|
||||
net = netBuilder
|
||||
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
|
||||
.data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{2, 1}, IE::Layout::NC))
|
||||
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"addLayer", "Eltwise", IE::Precision::UNSPECIFIED})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
|
||||
.linkToData("input1", "data1")
|
||||
.linkToData("input2", "data2")
|
||||
.linkDataTo("data1", "addLayer")
|
||||
.linkDataTo("data2", "addLayer")
|
||||
.linkToData("addLayer", "data3")
|
||||
.addInput("data1")
|
||||
.addInput("data2")
|
||||
.finalize();
|
||||
|
||||
getLayer("addLayer")->params = {
|
||||
{"operation", "sum"}
|
||||
};
|
||||
|
||||
IE::CNNNetwork cnnNetwork(net);
|
||||
initConstLayersDiffPrec({"input1", "input2"});
|
||||
float ref[] = {4, 5, 7, 8};
|
||||
if (precisionOutData == IE::Precision::FP16) {
|
||||
for (int i = 0; i < 4; i++)
|
||||
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
|
||||
}
|
||||
IE::ConstTransformer transformator(net.get());
|
||||
transformator.foldConstSubgraphs();
|
||||
switch(precisionOutData) {
|
||||
case IE::Precision::U8: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::U64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP16: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
THROW_IE_EXCEPTION << "Unsupported precision!";
|
||||
}
|
||||
};
|
||||
|
||||
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
|
||||
}
|
||||
|
||||
TEST_F(AdvancedShapeInferTests, MulWithBroadcastingConstInferTest) {
|
||||
|
||||
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
|
||||
|
||||
netBuilder = NetBuilder();
|
||||
net = netBuilder
|
||||
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{ 2, 2 }, IE::Layout::NC))
|
||||
.data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{ 2, 1 }, IE::Layout::NC))
|
||||
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{ 2, 2 }, IE::Layout::NC))
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"mulLayer", "Eltwise", IE::Precision::UNSPECIFIED})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
|
||||
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
|
||||
.linkToData("input1", "data1")
|
||||
.linkToData("input2", "data2")
|
||||
.linkDataTo("data1", "mulLayer")
|
||||
.linkDataTo("data2", "mulLayer")
|
||||
.linkToData("mulLayer", "data3")
|
||||
.addInput("data1")
|
||||
.addInput("data2")
|
||||
.finalize();
|
||||
|
||||
getLayer("mulLayer")->params = {
|
||||
{"operation", "mul"}
|
||||
};
|
||||
|
||||
IE::CNNNetwork cnnNetwork(net);
|
||||
initConstLayersDiffPrec({"input1", "input2"});
|
||||
float ref[] = {4, 6, 12, 15};
|
||||
if (precisionOutData == IE::Precision::FP16) {
|
||||
for (int i = 0; i < 4; i++)
|
||||
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
|
||||
}
|
||||
IE::ConstTransformer transformator(net.get());
|
||||
transformator.foldConstSubgraphs();
|
||||
switch(precisionOutData) {
|
||||
case IE::Precision::U8: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::I64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::U64: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP16: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
case IE::Precision::FP32: {
|
||||
InferenceEngine::CNNLayerPtr layer;
|
||||
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
|
||||
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
|
||||
ASSERT_EQ(l[0], ref[0]);
|
||||
ASSERT_EQ(l[1], ref[1]);
|
||||
ASSERT_EQ(l[2], ref[2]);
|
||||
ASSERT_EQ(l[3], ref[3]);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
THROW_IE_EXCEPTION << "Unsupported precision!";
|
||||
}
|
||||
};
|
||||
|
||||
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
|
||||
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
|
||||
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user