C++ 如何迁移c++;从old-caffe2到基于pytorch的caffe2的OpenFOAM库?
我有一个(Pytorch-->onnx-->caffe2)神经网络,我想用于OpenFOAM CFD模拟。问题是C++库是为“旧”的咖啡因设计的,而不是基于基于Pyras的咖啡因。如何让它工作?我不知道该怎么办 reynolds.Net.C文件:C++ 如何迁移c++;从old-caffe2到基于pytorch的caffe2的OpenFOAM库?,c++,openfoam,C++,Openfoam,我有一个(Pytorch-->onnx-->caffe2)神经网络,我想用于OpenFOAM CFD模拟。问题是C++库是为“旧”的咖啡因设计的,而不是基于基于Pyras的咖啡因。如何让它工作?我不知道该怎么办 reynolds.Net.C文件: #include "reynoldsNet.H" // Global variables std::string init_net_dir = "test"; std::string pred_net_dir
#include "reynoldsNet.H"
// Global variables
std::string init_net_dir = "test";
std::string pred_net_dir = "";
// Define NN model
caffe2::NetDef initNet, predictNet;
// Define workspace
caffe2::Workspace workSpace;
caffe2::reynoldsNet::reynoldsNet() {
init_net_dir = "init_net.pb";
pred_net_dir = "predict_net.pb";
caffe2::GlobalInit();
}
caffe2::reynoldsNet::reynoldsNet(std::string init_dir, std::string pred_dir) {
init_net_dir = init_dir;
pred_net_dir = pred_dir;
caffe2::GlobalInit();
}
void caffe2::reynoldsNet::readNetFromFile() const {
//Check to see if the protobuf files exist...
if (!std::ifstream(init_net_dir).good()) {
std::cerr << "error: init net model file missing: "
<< init_net_dir
<< std::endl;
return;
}
if (!std::ifstream(pred_net_dir).good()) {
std::cerr << "error: predict net model file missing: "
<< pred_net_dir
<< std::endl;
return;
}
//Open protobuffer files and read NN
std::cout << "Reading in protobuf files" << std::endl;
CAFFE_ENFORCE(ReadProtoFromFile(init_net_dir, &initNet));
CAFFE_ENFORCE(ReadProtoFromFile(pred_net_dir, &predictNet));
std::cout << "Reading complete..." << std::endl;
std::cout << "Setting NN device to CPU" << std::endl;
predictNet.mutable_device_option()->set_device_type(DeviceTypeProto::PROTO_CPU);
initNet.mutable_device_option()->set_device_type(DeviceTypeProto::PROTO_CPU);
for(int i = 0; i < predictNet.op_size(); ++i){
predictNet.mutable_op(i)->mutable_device_option()->set_device_type(DeviceTypeProto::PROTO_CPU);
}
for(int i = 0; i < initNet.op_size(); ++i){
initNet.mutable_op(i)->mutable_device_option()->set_device_type(DeviceTypeProto::PROTO_CPU);
}
std::cout << "Setting NN device to CPU" << std::endl;
CAFFE_ENFORCE(workSpace.RunNetOnce(initNet));
CAFFE_ENFORCE(workSpace.CreateNet(predictNet));
}
std::vector<float> caffe2::reynoldsNet::forward(std::vector<float> inputdata) const {
// Now create input tensor (only supports 1 size for now)
CPUContext ctx;
auto inputTensor = Tensor({1, 5}, inputdata, &ctx);
// Get data input blob out of network object
// NOTE!!! The names of the input and output blog are defined
// when converting from PyTorch to Caffe2. MUST be consistent
// or bad things will happen. See pytorchToCaffe2.py onnxExport function
auto data = workSpace.GetBlob("input")->GetMutable<TensorCPU>();
// Copy Tensor data onto blob in NN
data->CopyFrom(inputTensor);
// Forward
workSpace.RunNet(predictNet.name());
// Get blob of NN output
auto outBlob = workSpace.GetBlob("output")->Get<TensorCPU>();
std::vector<float> out_vect(outBlob.data<float>(), outBlob.data<float>() + outBlob.size());
return out_vect;
}
#包括“reynoldsNet.H”
//全局变量
std::string init_net_dir=“test”;
std::string pred_net_dir=“”;
//定义神经网络模型
caffe2::NetDef initNet,predictNet;
//定义工作空间
工作空间;
caffe2::reynoldsNet::reynoldsNet(){
init_net_dir=“init_net.pb”;
pred_net_dir=“predict_net.pb”;
caffe2::GlobalInit();
}
caffe2::reynoldsNet::reynoldsNet(std::string init_dir,std::string pred_dir){
init_net_dir=init_dir;
pred_net_dir=pred_dir;
caffe2::GlobalInit();
}
void caffe2::reynoldsNet::readNetFromFile()常量{
//检查protobuf文件是否存在。。。
if(!std::ifstream(init_net_dir).good()){
标准:cerr