zoukankan      html  css  js  c++  java
  • 开源框架---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() << "
    ";
          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() << "
    ";
          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  仿照这个来写的,而外国人进行了更新,国内很多人以前的博客都是老版本,所以我使用会出问题。 ”“”“

  • 相关阅读:

    远见卓识,领导力在于把握企业潮流
    创业者白手起家需要的6个基本因素
    企业领袖的最高境界
    人才招聘中的“笔迹分析技术”
    个人品牌,无法复制的职场优势
    美丽的姑娘,请允许我为你写诗
    重做日志浪费(redo wastage)
    利用Toad for Data Analysts软件生成查询语句
    JailbreakMe.com最新浏览器模式破解iPhones,iPads和iPod Touches方法
  • 原文地址:https://www.cnblogs.com/carle-09/p/11676324.html
Copyright © 2011-2022 走看看