开源框架---tensorflow c++ API 运行第一个“手写字的例子”
#CMakeLists.txt cmake_minimum_required (VERSION 2.8.)
project (tf_example) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -W") #link_directories(./lib) include_directories(
/home/u/tf1./tensorflow-GPU
/home/u/tf1./tensorflow-GPU/bazel-genfiles
/home/u/tf1./tensorflow-GPU/bazel-bin/tensorflow
/home/u/tf1./tensorflow-GPU/tensorflow/contrib/makefile/downloads/nsync/public
/home/u/tf1./tensorflow-GPU/tensorflow/contrib/makefile/gen/protobuf/include
/usr/local/include/eigen3
/home/u/tf1./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./tensorflow-GPU/bazel-bin/tensorflow/libtensorflow_cc.so. /home/u/tf1./tensorflow-GPU/bazel-bin/tensorflow/libtensorflow_framework.so.)
//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 = ;
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(, file_size, &data, &(contents)[]));
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 = ;
// 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, ); float input_max = ;
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 -;
}
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 -;
}
cout << "Session successfully created."<< endl;
string image_path= "/home/u/tf1.13/tensorflow-c-mnist/digit.jpg";
int input_height =;
int input_width=;
int input_mean=;
int input_std=;
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 -;
} const Tensor& resized_tensor = resized_tensors[];
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 -;
}
//Fetch output value
std::cout << "Output tensor size:" << outputs.size() << std::endl;
for (std::size_t i = ; i < outputs.size(); i++) {
std::cout << outputs[i].DebugString()<<endl;
} Tensor t = outputs[]; // Fetch the first tensor
int ndim2 = t.shape().dims(); // Get the dimension of the tensor
auto tmap = t.tensor<float, >(); // Tensor Shape: [batch_size, target_class_num]
int output_dim = t.shape().dim_size(); // Get the target_class_num from 1st dimension
std::vector<double> tout; // Argmax: Get Final Prediction Label and Probability
int output_class_id = -;
double output_prob = 0.0;
for (int j = ; j < output_dim; j++)
{
std::cout << "Class " << j << " prob:" << tmap(, j) << "," << std::endl;
if (tmap(, j) >= output_prob) {
output_class_id = j;
output_prob = tmap(, j);
}
} std::cout << "Final class id: " << output_class_id << std::endl;
std::cout << "Final class prob: " << output_prob << std::endl; return ;
}
u@u160406:~/tf1./tensorflow-c-mnist/build$ cmake ..
-- The C compiler identification is GNU 5.4.
-- The CXX compiler identification is GNU 5.4.
-- 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./tensorflow-c-mnist/build u@u160406:~/tf1./tensorflow-c-mnist/build$ make
Scanning dependencies of target tf_test
[ %] Building CXX object CMakeFiles/tf_test.dir/tf.cpp.o
[%] Linking CXX executable tf_test
[%] Built target tf_test u@u160406:~/tf1./tensorflow-c-mnist/build$ ./tf_test
-- ::40.577836: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcuda.so.
-- ::40.599739: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:] successful NUMA node read from SysFS had negative value (-), but there must be at least one NUMA node, so returning NUMA node zero
-- ::40.600269: I tensorflow/core/common_runtime/gpu/gpu_device.cc:] Found device with properties:
name: GeForce RTX Ti major: minor: memoryClockRate(GHz): 1.65
pciBusID: ::00.0
-- ::40.600401: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcudart.so.10.0
-- ::40.601114: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcublas.so.10.0
-- ::40.601796: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcufft.so.10.0
-- ::40.601986: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcurand.so.10.0
-- ::40.603086: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcusolver.so.10.0
-- ::40.603734: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcusparse.so.10.0
-- ::40.605733: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcudnn.so.
-- ::40.605793: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:] successful NUMA node read from SysFS had negative value (-), but there must be at least one NUMA node, so returning NUMA node zero
-- ::40.606283: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:] successful NUMA node read from SysFS had negative value (-), but there must be at least one NUMA node, so returning NUMA node zero
-- ::40.606722: I tensorflow/core/common_runtime/gpu/gpu_device.cc:] Adding visible gpu devices:
-- ::40.606738: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcudart.so.10.0
-- ::40.697274: I tensorflow/core/common_runtime/gpu/gpu_device.cc:] Device interconnect StreamExecutor with strength edge matrix:
-- ::40.697295: I tensorflow/core/common_runtime/gpu/gpu_device.cc:]
-- ::40.697302: I tensorflow/core/common_runtime/gpu/gpu_device.cc:] : N
-- ::40.697444: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:] successful NUMA node read from SysFS had negative value (-), but there must be at least one NUMA node, so returning NUMA node zero
-- ::40.697830: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:] successful NUMA node read from SysFS had negative value (-), but there must be at least one NUMA node, so returning NUMA node zero
-- ::40.698271: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:] successful NUMA node read from SysFS had negative value (-), but there must be at least one NUMA node, so returning NUMA node zero
-- ::40.698632: I tensorflow/core/common_runtime/gpu/gpu_device.cc:] Created TensorFlow device (/job:localhost/replica:/task:/device:GPU: with MB memory) -> physical GPU (device: , name: GeForce RTX Ti, pci bus id: ::00.0, compute capability: 7.5)
Session successfully created.
-- ::41.417655: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:] successful NUMA node read from SysFS had negative value (-), but there must be at least one NUMA node, so returning NUMA node zero
-- ::41.419321: I tensorflow/core/common_runtime/gpu/gpu_device.cc:] Found device with properties:
name: GeForce RTX Ti major: minor: memoryClockRate(GHz): 1.65
pciBusID: ::00.0
-- ::41.419390: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcudart.so.10.0
-- ::41.419423: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcublas.so.10.0
-- ::41.419448: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcufft.so.10.0
-- ::41.419471: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcurand.so.10.0
-- ::41.419497: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcusolver.so.10.0
-- ::41.419523: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcusparse.so.10.0
-- ::41.419549: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcudnn.so.
-- ::41.419667: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:] successful NUMA node read from SysFS had negative value (-), but there must be at least one NUMA node, so returning NUMA node zero
-- ::41.421127: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:] successful NUMA node read from SysFS had negative value (-), but there must be at least one NUMA node, so returning NUMA node zero
-- ::41.422501: I tensorflow/core/common_runtime/gpu/gpu_device.cc:] Adding visible gpu devices:
-- ::41.422566: I tensorflow/core/common_runtime/gpu/gpu_device.cc:] Device interconnect StreamExecutor with strength edge matrix:
-- ::41.422592: I tensorflow/core/common_runtime/gpu/gpu_device.cc:]
-- ::41.422613: I tensorflow/core/common_runtime/gpu/gpu_device.cc:] : N
-- ::41.423170: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:] successful NUMA node read from SysFS had negative value (-), but there must be at least one NUMA node, so returning NUMA node zero
-- ::41.424636: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:] successful NUMA node read from SysFS had negative value (-), but there must be at least one NUMA node, so returning NUMA node zero
-- ::41.426045: I tensorflow/core/common_runtime/gpu/gpu_device.cc:] Created TensorFlow device (/job:localhost/replica:/task:/device:GPU: with MB memory) -> physical GPU (device: , name: GeForce RTX Ti, pci bus id: ::00.0, compute capability: 7.5)
Tensor<type: float shape: [,,,] values: [[[0.992156923][0.0823529437][]]]...>
-- ::44.755529: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcublas.so.10.0
-- ::45.821366: I tensorflow/stream_executor/platform/default/dso_loader.cc:] Successfully opened dynamic library libcudnn.so.
Output tensor size:
Tensor<type: float shape: [,] values: [0.000222602132 0.951202273 0.00674963091...]...>
Class prob:0.000222602,
Class prob:0.951202,
Class prob:0.00674963,
Class prob:0.00721128,
Class prob:0.0029518,
Class prob:0.0100965,
Class prob:0.0119467,
Class prob:0.00218653,
Class prob:0.00189467,
Class prob:0.00553806,
Final class id:
Final class prob: 0.951202 u@u160406:~/tf1./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 仿照这个来写的,而外国人进行了更新,国内很多人以前的博客都是老版本,所以我使用会出问题。 ”“”“
开源框架---tensorflow c++ API 运行第一个“手写字的例子”的更多相关文章
- 开源框架---tensorflow c++ API 一个卡了很久的问题
<开源框架---tensorflow c++ API 运行第一个“手写字的例子”> 中可以说明tensorflow c++ API是好用的,.......
- 开源框架---tensorflow c++ API中./configure步骤细节
u@u160406:~/tf1.13/tensorflow$ git checkout r1.13 分支 r1.13 设置为跟踪来自 origin 的远程分支 r1.13.切换到一个新分支 'r1.1 ...
- 【实践】如何利用tensorflow的object_detection api开源框架训练基于自己数据集的模型(Windows10系统)
如何利用tensorflow的object_detection api开源框架训练基于自己数据集的模型(Windows10系统) 一.环境配置 1. Python3.7.x(注:我用的是3.7.3.安 ...
- 开源框架---通过Bazel编译使用tensorflow c++ API 记录
开源框架---通过Bazel编译使用tensorflow c++ API 记录 tensorflow python API,在python中借用pip安装tensorflow,真的很方便,几句指令就完 ...
- 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程
视频中的物体识别 摘要 物体识别(Object Recognition)在计算机视觉领域里指的是在一张图像或一组视频序列中找到给定的物体.本文主要是利用谷歌开源TensorFlow Object De ...
- 对于谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程
本教程针对Windows10实现谷歌近期公布的TensorFlow Object Detection API视频物体识别系统,其他平台也可借鉴. 本教程将网络上相关资料筛选整合(文末附上参考资料链接) ...
- Android开源框架Afinal第一篇——揭开圣女的面纱
Android开源框架Afinal第一篇——揭开圣女的面纱 分类: Android开源框架哪点事2013-09-02 14:25 260人阅读 评论(0) 收藏 举报 Afinal 这是Afinal在 ...
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
随机推荐
- 【Leetcode_easy】977. Squares of a Sorted Array
problem 977. Squares of a Sorted Array solution: class Solution { public: vector<int> sortedSq ...
- spring boot如何打印mybatis的执行sql
方案一 application.properties配置: logging.level.com,后面的路径指的是mybatis对应的方法接口所在的包.并不是mapper.xml所在的包. 1. log ...
- 01点睛Spring4.1-依赖注入
转载:https://www.iteye.com/blog/wiselyman-2210252 1.1 声明bean 使用上例建立的testMavenSpring项目,将pom.xml文件中的 < ...
- 《ucore lab5》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 练习1: 加载应用程序并执行(需要编码) 题目 do_execv函数调用load_icode(位于kern/process/proc.c中) 来 ...
- jenkins publish .net core application to linux server
最近学习Docker与Jenkins, 网上大部分都是关于Jenkins+Git+Docker进行持续远程部署, 我一直在考虑为什么Jenkins和Docker要绑定一块使用, 因为我想单独使用Jen ...
- Variational Auto-encoder(VAE)变分自编码器-Pytorch
import os import torch import torch.nn as nn import torch.nn.functional as F import torchvision from ...
- Guava 工具类之Cache的使用
一.guava cache 介绍 1.介绍 guava cache是Google guava中提供的一款轻量级的本地缓存组件,其特点是简单.轻便.完善.扩展性强,内存管理机制也相对完善. 2.使用缓存 ...
- python基础学习(十四)
28.模块当脚本执行 !!!! 注意 这是分两个文件的 一个是student.py和app3.py student.py name = "Song Ke" name_list ...
- K-th occurrence HDU - 6704 (SA, 主席树)
大意: 给定串$s$, $q$个询问$(l,r,k)$, 求子串$s[l,r]$的第$k$次出现位置. 本来是个简单签到题, 可惜比赛的时候还没学$SA$...... 好亏啊 相同的子串在$SA$中是 ...
- 在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)
原文:在论坛中出现的比较难的sql问题:28(循环查询表来实现递归) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必 ...