深度学习 与 C++ 的爱恨情仇
深度学习 与 C++ 的爱恨情仇
本文涉及的相关教程和代码:
- CPP-Call-Tensorflow
- C++ 调用Python(TensorFlow)程序
- BIGBALLON/CPP-Call-Tensorflow
需要c++资料加入小编c/c++编程群:825414254
深度学习 与 C++ 的爱恨情仇
Caffe2-Tutorial
使用Caffe2 Python API建立并训练LeNet,并正确存weight
使用Caffe2 Python API建立并训练ResNet, 不使用lmdb, 并正确存取带有BN的weight
使用Caffe2 C++ API 读取预训练model并进行预测
使用Caffe2 Python API 进行 Multi-GPU训练
将 Caffe 的 weight 转化为 Caffe2 的 weight, 并使用Caffe2 C++进行读取与预测
将 PyTorch 的 weight 转化为 Caffe2 的 weight, 并使用Caffe2 C++进行读取与预测
BIGBALLON/Caffe2-Tutorial
PyTorch-CPP
使用PyTorch C++ API (Libtorch) 读取预训练model并进行预测
BIGBALLON/PyTorch-CPP
OK,下面开始讲故事, 不想听故事的可以直接把代码抱走,不用客气,请随便啦。
0. 初识 Deep Learning
大约1年半前至2年前的样子,选修了学校的 Deep Learning and Practice,第一次接触深度学习,记得那时候大家用的多半是TensorFlow,第一个作业是实现 NIN(Network In Network),弄了半天由于initial的问题死活train不起来,神奇的舍友推荐我加一下BN试试,搞了半天TensorFlow有N个batch_normal的函数就是不知道怎样用,于是神奇的舍友又推荐我用一个叫做Keras的东西,我靠,BN只需一行。更神奇的是,加完BN后train得飞起,于是乎就寄信去问助教,可不可以用BN,第二天助教课得到得回答是,BN是 homework2 要求使用的trick,当时没别的,就觉得舍友好猛,啥都懂。
噢,跑偏了,回来回来。后来我们有一个需求,需要在C++中调用keras(tf),查了一下有好多种方法,选了原生支持的方法,就加个头文件Python.h,而后瞎一顿搞就好了,
代码见 CPP-Call-Tensorflow: BIGBALLON/CPP-Call-Tensorflow
深度学习 与 C++ 的爱恨情仇
1. Caffe2 与 C++
不经意间,身边的朋友几乎清一色都转向了PyTorch,而由于对 C++ 有特殊的需求,Lab的学长们还在使用Caffe。唔,而后Caffe2就出来了,原生支持 Python 和 C++。 于是我们就转向了 Caffe2
三种做法:
- 最直接的是用Caffe2 Python API 建network并完成训练,导出model,再用 C++ 进行加载与使用
- 当然,后来也会用Caffe2 Python API 拉出network,直接导出,在C++ 端完成所有的后续工作,包括训练,以及训练好后的导出model,inference等等。
- 最暴力的是直接放弃Caffe2 Python API, 完全使用 C++ 完成 建network,training,inference等所有的工作。
中间也遇到些许小坑,说出来你可能不信,Caffe2刚出来的时候,整个issue区问最多的问题就是weight怎样存和weight怎样读。后来都在问带有BN的network weight怎样存,当然更多的人是在问Caffe2为什么那么难装,哈哈。
image.png
当然Caffe2 还有一个好处, 能够将 Caffe的 weight 轻易地转化为 Caffe2 的 weight
不知不觉,Caffe2 猛然间和PyTorch合并了,PyTorch0.4 出现了, 与此同时一个叫做ONNX(Open Neural Network Exchange)的东西,它也lei le。 于是我们可以将weight 在不同的DL framework间相互转换。其中ONNX对Caffe2的支持也非常好。 于是我们又有了新的做法:
- 在PyTorch下进行训练,而后通过ONNX导出model,再将onnx model 转化为Caffe2 model。
值得吐槽的地方是,自从Caffe2 与 PyTorch合并后,官方的文档也长期不升级了,可以观察到Github上面关于Caffe2的issue也常常没有人回复,Caffe2的C++端进行了很大幅度的修改,官方也没有任何的文档说明,你想用的话就自己遇坑自己处理就对了。
在此期间也学会了一个小技巧:
通常情况下,你的程序就算是编译好,也无法直接从copy到其余机器上运行,由于你的程序需要用到cuda,cudnn,caffe2等等。怎样办,把它们打包起来,一起带走:
以Ubuntu16.04为例,首先先安装这两个工具:
而后进行打包操作,假设你的程序名字叫做 test, shell文件 pack.sh 如下
可以看到需要的库文件都打包进来了,而且程序执行的时候不会再去系统的路径中找,而是直接在当前目录找,把整个文件夹copy到其余机器去吧,现在你可以随便地执行它了。
上述Caffe2的使用(C++ inference,caffe转caffe2,pytorch转caffe2),
代码见 Caffe2-Tutorial
2. PyTorch 与 C++
随着PyTorch不断的完善,身边弃坑TF,投奔PyTorch的朋友就没有再回来的了。随着PyTorch1.0的发布,C++ 似乎有了新的曙光,现在我们可以这么做:
- 在PyTorch python 端训练model,并通过jit导出,而后使用PyTorch C++ API 编写需要的应用,编译就可上线。代码见 PyTorch-CPP
- 完全在PyTorch C++ API中拉net,training,inference等,say goodbye for python 。
深度学习 与 C++ 的爱恨情仇
3. Deep Learning 与 C++ 的 未来
Deep Learning 发展到现在,C++ 方面还是不能够随心所欲地coding, 希望在未来半年到一年内还会有新的突破。 期待一下能像写python一样随心所欲地写 C++ 程序!!
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 深度学习 与 C++ 的爱恨情仇