hanqing-yu/hanqing-yu.github.io

在 C++ 中调用 keras | iqhy's Blog

Opened this issue · 9 comments

https://iqhy.github.io/posts/2020/0228155601/

Python 的代码优雅而实用,但是经常会遇到性能问题,这时可以使用 C/C++ 重写几个函数来解决,这样就同时兼顾了开发效率和性能。

如果想将predict的input设置成一个二维或者三维矩阵,例如{{1,2}, {3,4}}, 应该如何操作呢?感谢解答!

@lingxiaw
如果想将predict的input设置成一个二维或者三维矩阵,例如{{1,2}, {3,4}}, 应该如何操作呢?感谢解答!

可以参考我写的第一个常见问题

先用fdeep::tensor声明一个tensor,如

// tensor的形状参数在fdeep::tensor_shape()中,0是初始化的值
fdeep::tensor t(fdeep::tensor_shape(3, 8, 3), 0);

然后最简单的方法是使用下面的语句给每个位置赋值 (这里也有其他赋值方法FAQ)

t.set(fdeep::internal::tensor_pos(0, 1, 2), 1);
t.set(fdeep::internal::tensor_pos(0, 1, 1), 2);
t.set(fdeep::internal::tensor_pos(0, 1, 0), 3);

然后使用model.predict()即可

fdeep::tensors result = model.predict(t);

了解,感谢解答!

@iqhy

@lingxiaw
如果想将predict的input设置成一个二维或者三维矩阵,例如{{1,2}, {3,4}}, 应该如何操作呢?感谢解答!

可以参考我写的第一个常见问题

先用fdeep::tensor声明一个tensor,如

// tensor的形状参数在fdeep::tensor_shape()中,0是初始化的值
fdeep::tensor t(fdeep::tensor_shape(3, 8, 3), 0);

然后最简单的方法是使用下面的语句给每个位置赋值 (这里也有其他赋值方法FAQ)

t.set(fdeep::internal::tensor_pos(0, 1, 2), 1);
t.set(fdeep::internal::tensor_pos(0, 1, 1), 2);
t.set(fdeep::internal::tensor_pos(0, 1, 0), 3);

然后使用model.predict()即可

fdeep::tensors result = model.predict(t);

还有一个问题:在得到result之后,如何将其转化成为double型的参数呢?
我了解到对于fdeep::tensor型的tensor可以用tensor.to_vector来解决问题,但是对于fdeep::tensors型的没有to_vetcor这个函数。
感谢解答!

@lingxiaw
还有一个问题:在得到result之后,如何将其转化成为double型的参数呢?
我了解到对于fdeep::tensor型的tensor可以用tensor.to_vector来解决问题,但是对于fdeep::tensors型的没有to_vetcor这个函数。
感谢解答!

fdeep::tensors 实际上是 std::vector<tensor> 的别名

如果你的模型只输出一个 tensor,那么可以使用

const auto result_vec = result.front().to_vector();

了解,感谢解答!
请问您如何得知 'result.front()' 中'front()' 的用法?有时候我也想知道具体函数的用法,但是看官方信息上好像没有很多具体函数用法的信息。

@lingxiaw
了解,感谢解答!
请问您如何得知 'result.front()' 中'front()' 的用法?有时候我也想知道具体函数的用法,但是看官方信息上好像没有很多具体函数用法的信息。

这里的 fdeep::tensors 实际上就是一个 vector,作者在代码中是这样定义的

typedef std::vector<tensor> tensors;

frontstd::vector 中的一个函数,对普通的 vector 也可以使用,作用是获取 vector 的第一个元素,用法这里可以查到。

这个工具仅支持tf2,但是 import tf.keras接口比tf1的import keras 慢10倍怎么办,直接c++训练更合适吗

@chocolate-byte
这个工具仅支持tf2,但是 import tf.keras接口比tf1的import keras 慢10倍怎么办,直接c++训练更合适吗

我当时使用的时候没有遇到性能问题,所以没有研究你说的这个问题。另外,这个工具不支持在 C++ 中训练,需要 Python 训练好后导入 C++ 调用。