最近公司要用到深度学习去做图像的分类工作,添加到原有的软件中去,于是就尝试了几种方法,不外乎调用python和直接调用深度学习框架的c++api。
因为在调试模型的时候使用的是keras,于是最适合的就是编译tensorflow形成dll。但是公司软件是在windows上运行的,于是就开始了艰难困苦的tensorflow编译之旅。
首先在csdn上找到一大片自己编译的教程,但是都走不通啊,不是这里错就是那里错。
我使用的是vs2015update3社区版,python3.6.6。
最后按照这个博客把tensorflow1.3编译成功了。
https://blog.csdn.net/jiugeshao/article/details/79144438
在编译的时候一定要记得机器上装了java,不然会报莫名的错误,另外在编译的时候记得把re2的cmake重新编译一次。就可以快乐的编译成功,Release和Debug版本都可以编译成功。
运行样例完全正常!!
创建tensor正常,运算正常。
然而因为当前训练模型的时候使用的是tf1.12+keras2.2.4。tensorflow的api在调用模型的时候会报错。(图后补)
查了下,是说tensorflow1.5以上的版本才支持的操作,好吧,又重新陷入了对tensorflow的编译过程。
最终尝试发现,编译tensorflow1.8可以成功。注意在cmake编译的时候使用如下的配置,
因为我是要编译一个cpu版本出来,到时候可以在各类客户机上使用,所以不选ENABLE_GPU。BUILD_SHARED_LIB一定要选,这是编译出来的dll选项。
随后编译的时候Release版本很容易编译通过(要多编译几次,因为tf_core_kernels.vcxproj需要大量的内存,经常编译不过。这里一定要选ENALBE_SNAPPY_SUPPORT。否则就会编译不过。)
但是在C++调用的时候,程序调试时会报错,于是不得不去编译Debug版本,然后发现每次都卡在tf_core_kernels.vcxproj过不去。然后没办法,最终尝试下居然使用程序员命令行的形式编译成功。参见博客:https://blog.csdn.net/dageda1991/article/details/79721333
同样会在编译tf_core_kernels.vcxproj的时候编译不成功,单独编译它就好。再重新编译整个工程,同样是在命令行模式下。最终成功生成.lib和.dll文件。
回头想想过去一周多的时间,真是令人伤感。每天都在查资料,天天就是编译编译编译。不过好歹打通了c++端调用。