开源框架---tensorflow c++ API 运行第一个“手写字的例子”
#CMakeLists.txt cmake_minimum_required (VERSION 2.8.8) project (tf_example) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -W") #link_directories(./lib) include_directories( /home/u/tf1.13/tensorflow-GPU /home/u/tf1.13/tensorflow-GPU/bazel-genfiles /home/u/tf1.13/tensorflow-GPU/bazel-bin/tensorflow /home/u/tf1.13/tensorflow-GPU/tensorflow/contrib/makefile/downloads/nsync/public /home/u/tf1.13/tensorflow-GPU/tensorflow/contrib/makefile/gen/protobuf/include /usr/local/include/eigen3 /home/u/tf1.13/tensorflow-GPU/tensorflow/contrib/makefile/downloads/absl ) add_executable(tf_test tf.cpp) #link_directories(./lib) #target_link_libraries(tf_test tensorflow_cc tensorflow_framework) target_link_libraries(tf_test /home/u/tf1.13/tensorflow-GPU/bazel-bin/tensorflow/libtensorflow_cc.so.1 /home/u/tf1.13/tensorflow-GPU/bazel-bin/tensorflow/libtensorflow_framework.so.1)
//tf.cpp /* * test tensorflow_cc c++ successfully * load mnist.pb model successfully * conference:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/label_image * */ //@wp conference:https://blog.csdn.net/wd1603926823/article/details/92843830 #include <fstream> #include <utility> #include <vector> #include <Eigen/Core> #include <Eigen/Dense> #include "tensorflow/cc/ops/const_op.h" #include "tensorflow/cc/ops/image_ops.h" #include "tensorflow/cc/ops/standard_ops.h" #include "tensorflow/core/framework/graph.pb.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/graph/default_device.h" #include "tensorflow/core/graph/graph_def_builder.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/stringpiece.h" #include "tensorflow/core/lib/core/threadpool.h" #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/lib/strings/stringprintf.h" #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/init_main.h" #include "tensorflow/core/platform/logging.h" #include "tensorflow/core/platform/types.h" #include "tensorflow/core/public/session.h" #include "tensorflow/core/util/command_line_flags.h" using namespace std; using namespace tensorflow; using namespace tensorflow::ops; using tensorflow::Flag; using tensorflow::Tensor; using tensorflow::Status; using tensorflow::string; using tensorflow::int32; static Status ReadEntireFile(tensorflow::Env* env, const string& filename, Tensor* output) { tensorflow::uint64 file_size = 0; TF_RETURN_IF_ERROR(env->GetFileSize(filename, &file_size)); string contents; contents.resize(file_size); std::unique_ptr<tensorflow::RandomAccessFile> file; TF_RETURN_IF_ERROR(env->NewRandomAccessFile(filename, &file)); tensorflow::StringPiece data; TF_RETURN_IF_ERROR(file->Read(0, file_size, &data, &(contents)[0])); if (data.size() != file_size) { return tensorflow::errors::DataLoss("Truncated read of '", filename, "' expected ", file_size, " got ", data.size()); } // output->scalar<string>()() = data.ToString(); output->scalar<string>()() = string(data); return Status::OK(); } Status ReadTensorFromImageFile(const string& file_name, const int input_height, const int input_width, const float input_mean, const float input_std, std::vector<Tensor>* out_tensors) { auto root = tensorflow::Scope::NewRootScope(); using namespace ::tensorflow::ops; string input_name = "file_reader"; string output_name = "normalized"; // read file_name into a tensor named input Tensor input(tensorflow::DT_STRING, tensorflow::TensorShape()); TF_RETURN_IF_ERROR( ReadEntireFile(tensorflow::Env::Default(), file_name, &input)); // use a placeholder to read input data auto file_reader = Placeholder(root.WithOpName("input"), tensorflow::DataType::DT_STRING); std::vector<std::pair<string, tensorflow::Tensor>> inputs = { {"input", input}, }; // Now try to figure out what kind of file it is and decode it. const int wanted_channels = 1; // tensorflow::Output image_reader; // if (tensorflow::StringPiece(file_name).ends_with(".png")) { // image_reader = DecodePng(root.WithOpName("png_reader"), file_reader, // DecodePng::Channels(wanted_channels)); // } else if (tensorflow::StringPiece(file_name).ends_with(".gif")) { // // gif decoder returns 4-D tensor, remove the first dim // image_reader = // Squeeze(root.WithOpName("squeeze_first_dim"), // DecodeGif(root.WithOpName("gif_reader"), file_reader)); // } else if (tensorflow::StringPiece(file_name).ends_with(".bmp")) { // image_reader = DecodeBmp(root.WithOpName("bmp_reader"), file_reader); // } else { // // Assume if it's neither a PNG nor a GIF then it must be a JPEG. // image_reader = DecodeJpeg(root.WithOpName("jpeg_reader"), file_reader, // DecodeJpeg::Channels(wanted_channels)); // } tensorflow::Output image_reader; if (tensorflow::str_util::EndsWith(file_name, ".png")) { image_reader = DecodePng(root.WithOpName("png_reader"), file_reader, DecodePng::Channels(wanted_channels)); } else if (tensorflow::str_util::EndsWith(file_name, ".gif")) { // gif decoder returns 4-D tensor, remove the first dim image_reader = Squeeze(root.WithOpName("squeeze_first_dim"), DecodeGif(root.WithOpName("gif_reader"), file_reader)); } else if (tensorflow::str_util::EndsWith(file_name, ".bmp")) { image_reader = DecodeBmp(root.WithOpName("bmp_reader"), file_reader); } else { // Assume if it's neither a PNG nor a GIF then it must be a JPEG. image_reader = DecodeJpeg(root.WithOpName("jpeg_reader"), file_reader, DecodeJpeg::Channels(wanted_channels)); } // Now cast the image data to float so we can do normal math on it. auto float_caster = Cast(root.WithOpName("float_caster"), image_reader, tensorflow::DT_FLOAT); auto dims_expander = ExpandDims(root.WithOpName("expand"), float_caster, 0); float input_max = 255; Div(root.WithOpName("div"),dims_expander,input_max); tensorflow::GraphDef graph; TF_RETURN_IF_ERROR(root.ToGraphDef(&graph)); std::unique_ptr<tensorflow::Session> session( tensorflow::NewSession(tensorflow::SessionOptions())); TF_RETURN_IF_ERROR(session->Create(graph)); // std::vector<Tensor> out_tensors; // TF_RETURN_IF_ERROR(session->Run({}, {output_name + ":0", output_name + ":1"}, // {}, &out_tensors)); TF_RETURN_IF_ERROR(session->Run({inputs}, {"div"}, {}, out_tensors)); return Status::OK(); } int main() { Session* session; Status status = NewSession(SessionOptions(), &session);//创建新会话Session string model_path="model.pb"; GraphDef graphdef; //Graph Definition for current model Status status_load = ReadBinaryProto(Env::Default(), model_path, &graphdef); //从pb文件中读取图模型; if (!status_load.ok()) { std::cout << "ERROR: Loading model failed..." << model_path << std::endl; std::cout << status_load.ToString() << "\n"; return -1; } Status status_create = session->Create(graphdef); //将模型导入会话Session中; if (!status_create.ok()) { std::cout << "ERROR: Creating graph in session failed..." << status_create.ToString() << std::endl; return -1; } cout << "Session successfully created."<< endl; string image_path= "/home/u/tf1.13/tensorflow-c-mnist/digit.jpg"; int input_height =28; int input_width=28; int input_mean=0; int input_std=1; std::vector<Tensor> resized_tensors; Status read_tensor_status = ReadTensorFromImageFile(image_path, input_height, input_width, input_mean, input_std, &resized_tensors); if (!read_tensor_status.ok()) { LOG(ERROR) << read_tensor_status; cout<<"resing error"<<endl; return -1; } const Tensor& resized_tensor = resized_tensors[0]; std::cout << resized_tensor.DebugString()<<endl; vector<tensorflow::Tensor> outputs; string output_node = "softmax"; Status status_run = session->Run({{"inputs", resized_tensor}}, {output_node}, {}, &outputs); if (!status_run.ok()) { std::cout << "ERROR: RUN failed..." << std::endl; std::cout << status_run.ToString() << "\n"; return -1; } //Fetch output value std::cout << "Output tensor size:" << outputs.size() << std::endl; for (std::size_t i = 0; i < outputs.size(); i++) { std::cout << outputs[i].DebugString()<<endl; } Tensor t = outputs[0]; // Fetch the first tensor int ndim2 = t.shape().dims(); // Get the dimension of the tensor auto tmap = t.tensor<float, 2>(); // Tensor Shape: [batch_size, target_class_num] int output_dim = t.shape().dim_size(1); // Get the target_class_num from 1st dimension std::vector<double> tout; // Argmax: Get Final Prediction Label and Probability int output_class_id = -1; double output_prob = 0.0; for (int j = 0; j < output_dim; j++) { std::cout << "Class " << j << " prob:" << tmap(0, j) << "," << std::endl; if (tmap(0, j) >= output_prob) { output_class_id = j; output_prob = tmap(0, j); } } std::cout << "Final class id: " << output_class_id << std::endl; std::cout << "Final class prob: " << output_prob << std::endl; return 0; }
u@u160406:~/tf1.13/tensorflow-c-mnist/build$ cmake .. -- The C compiler identification is GNU 5.4.0 -- The CXX compiler identification is GNU 5.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /home/u/tf1.13/tensorflow-c-mnist/build u@u160406:~/tf1.13/tensorflow-c-mnist/build$ make Scanning dependencies of target tf_test [ 50%] Building CXX object CMakeFiles/tf_test.dir/tf.cpp.o [100%] Linking CXX executable tf_test [100%] Built target tf_test u@u160406:~/tf1.13/tensorflow-c-mnist/build$ ./tf_test 2019-10-15 10:43:40.577836: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1 2019-10-15 10:43:40.599739: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-10-15 10:43:40.600269: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: name: GeForce RTX 2080 Ti major: 7 minor: 5 memoryClockRate(GHz): 1.65 pciBusID: 0000:01:00.0 2019-10-15 10:43:40.600401: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0 2019-10-15 10:43:40.601114: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0 2019-10-15 10:43:40.601796: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10.0 2019-10-15 10:43:40.601986: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10.0 2019-10-15 10:43:40.603086: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10.0 2019-10-15 10:43:40.603734: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10.0 2019-10-15 10:43:40.605733: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7 2019-10-15 10:43:40.605793: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-10-15 10:43:40.606283: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-10-15 10:43:40.606722: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0 2019-10-15 10:43:40.606738: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0 2019-10-15 10:43:40.697274: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix: 2019-10-15 10:43:40.697295: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165] 0 2019-10-15 10:43:40.697302: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0: N 2019-10-15 10:43:40.697444: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-10-15 10:43:40.697830: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-10-15 10:43:40.698271: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-10-15 10:43:40.698632: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 10138 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2080 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5) Session successfully created. 2019-10-15 10:43:41.417655: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-10-15 10:43:41.419321: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: name: GeForce RTX 2080 Ti major: 7 minor: 5 memoryClockRate(GHz): 1.65 pciBusID: 0000:01:00.0 2019-10-15 10:43:41.419390: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0 2019-10-15 10:43:41.419423: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0 2019-10-15 10:43:41.419448: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10.0 2019-10-15 10:43:41.419471: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10.0 2019-10-15 10:43:41.419497: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10.0 2019-10-15 10:43:41.419523: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10.0 2019-10-15 10:43:41.419549: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7 2019-10-15 10:43:41.419667: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-10-15 10:43:41.421127: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-10-15 10:43:41.422501: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0 2019-10-15 10:43:41.422566: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix: 2019-10-15 10:43:41.422592: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165] 0 2019-10-15 10:43:41.422613: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0: N 2019-10-15 10:43:41.423170: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-10-15 10:43:41.424636: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-10-15 10:43:41.426045: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 10138 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2080 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5) Tensor<type: float shape: [1,28,28,1] values: [[[0.992156923][0.0823529437][0]]]...> 2019-10-15 10:43:44.755529: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0 2019-10-15 10:43:45.821366: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7 Output tensor size:1 Tensor<type: float shape: [1,10] values: [0.000222602132 0.951202273 0.00674963091...]...> Class 0 prob:0.000222602, Class 1 prob:0.951202, Class 2 prob:0.00674963, Class 3 prob:0.00721128, Class 4 prob:0.0029518, Class 5 prob:0.0100965, Class 6 prob:0.0119467, Class 7 prob:0.00218653, Class 8 prob:0.00189467, Class 9 prob:0.00553806, Final class id: 1 Final class prob: 0.951202 u@u160406:~/tf1.13/tensorflow-c-mnist/build$
@https://github.com/zhangcliff/tensorflow-c-mnist 会报错:
参照@https://blog.csdn.net/wd1603926823/article/details/92843830解决问题。
”“”“找了很久原因没解决。因为我去看string_view的源码,真的没有报错的这几个成员函数。所以可能是我用错了版本还是这几个函数已经被废弃。
今天终于解决了。原来上面这个例程是按照 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/label_image/main.cc 仿照这个来写的,而外国人进行了更新,国内很多人以前的博客都是老版本,所以我使用会出问题。 ”“”“
【. . . . . .本博客仅作个人生活、工作、学习等的日常记录。说明: (1) 内容有参考其他博主、网页等,有因“懒”直接粘贴来,会备注出处。若遇雷同,或忘备注,并无故意抄袭之意,请诸“原主”谅解,很感谢您的辛勤"笔记"可供本人参考学习。 (2) 如遇同行,有参考学习者,因个人学识有限,不保证所写内容完全正确。您对本博文有任何的意见或建议,欢迎留言,感谢指正。 (3) 若您认为本主的全博客还不错,可以点击关注,便于互相学习。 (4) 感谢您的阅读,希望对您有一定的帮助。欢迎转载或分享,但请注明出处,谢谢。. . . . . .】
【作者: Carole0904 ; 出处: https://www.cnblogs.com/carle-09/ 】