Files
alibaba--mnn/tools/converter/source/tensorflow/TFGraphResolver.hpp
T
2026-07-13 13:33:03 +08:00

104 lines
2.4 KiB
C++

//
// TFGraphResolver.hpp
// MNNConverter
//
// Created by MNN on 2020/06/13.
// Copyright © 2018, Alibaba Group Holding Limited
//
#ifndef TF_GRAPH_RESOLVER_HPP_
#define TF_GRAPH_RESOLVER_HPP_
#include <vector>
#include <unordered_map>
#include "MNN/MNNDefine.h"
#include "graph.pb.h"
#include "MNN_generated.h"
#include "../compression/quantization.hpp"
struct TFNode;
typedef tensorflow::NodeDef NodeDef;
struct TFEdge {
std::string name;
TFNode* start;
TFNode* end;
};
struct TFNode {
const NodeDef* node_def;
std::string name;
std::string op;
std::vector<TFEdge*> inputs;
std::vector<TFEdge*> outputs;
};
class TFGraph {
public:
TFGraph() = default;
virtual ~TFGraph() = default;
void AddNode(const NodeDef* node);
void Finalize();
std::unique_ptr<MNN::SubGraphProtoT> ToProto() const;
private:
friend class TFGraphResolver;
std::string name_ = "main";
std::vector<std::unique_ptr<TFNode>> nodes_;
std::vector<std::unique_ptr<TFEdge>> edges_;
std::vector<std::unique_ptr<NodeDef>> allocated_nodes_;
// Output nodes.
std::vector<TFNode*> final_nodes_;
};
class TFGraphResolver {
public:
explicit TFGraphResolver(const tensorflow::GraphDef& graph_def);
virtual ~TFGraphResolver() = default;
TFGraph* graph(const int graph_index);
const TFGraph* graph(const int graph_index) const;
int graph_size() const { return graphs_.size(); }
private:
TFGraph* main_graph();
void ResolveQuantization(TFGraph* graph,
const compression::Quantization& int8_calibration);
std::unique_ptr<TFNode> BuildQuantOrDequantNode(
const std::string& name,
const std::string& op,
const int& nbit,
const std::vector<float>& scales,
const float& zero_point,
const float& clamp_min,
const float& clamp_max,
const MNN::Compression::LayerQuantizeParams_QuantMethod& method);
std::unique_ptr<TFEdge> BuildEdge(
const std::string& name, TFNode* start, TFNode* end);
private:
std::vector<std::unique_ptr<TFGraph>> graphs_;
struct StringComp {
bool operator()(const std::string& lhs, const std::string& rhs) const {
if (lhs.size() != rhs.size()) {
return lhs.size() > rhs.size();
} else {
return lhs > rhs;
}
}
};
};
#endif // TF_GRAPH_RESOLVER_HPP_