百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

深度学习 与 C++ 的爱恨情仇

bigegpt 2024-08-10 12:06 15 浏览


本文涉及的相关教程和代码:

  • CPP-Call-Tensorflow
  • C++ 调用Python(TensorFlow)程序
  • https://github.com/BIGBALLON/CPP-Call-Tensorflow

需要c++资料加入小编c/c++编程群:825414254


  • 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++进行读取与预测
  • https://github.com/BIGBALLON/Caffe2-Tutorial
  • PyTorch-CPP
  • 使用PyTorch C++ API (Libtorch) 读取预训练model并进行预测
  • https://github.com/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:https://github.com/BIGBALLON/CPP-Call-Tensorflow


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为什么那么难装,哈哈。


当然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为例,首先先安装这两个工具:

sudo apt install chrpath patchelf

然后进行打包操作,假设你的程序名字叫做 test, shell文件 pack.sh 如下

ldd test | grep "=> /" | awk '{print $3}' | xargs -I '{}' cp -v '{}' .
rm libcuda.so*
rm libnvidia-fatbinaryloader.so*
rm libc.so.6
ls -1 lib* | xargs -t -n1 patchelf --set-rpath .
cp /lib/x86_64-linux-gnu/libc.so.6 .
strip test
chrpath -r . test
打包前
┌─[bg@bg-cgi] - [~/Documents/czf/debug] - [2019-01-19 01:49:54]
└─[0] ls
pack.sh test
打包后
┌─[bg@bg-cgi] - [~/Documents/czf/debug] - [2019-01-19 01:50:21]
└─[0] ls
libatk-1.0.so.0 libfontconfig.so.1 libgraphite2.so.3 libk5crypto.so.3 libopencv_highgui.so.2.4 libschroedinger-1.0.so.0 libusb-1.0.so.0 libXcursor.so.1
libavcodec-ffmpeg.so.56 libfreetype.so.6 libgsm.so.1 libkeyutils.so.1 libopencv_imgproc.so.2.4 libselinux.so.1 libutil.so.1 libXdamage.so.1
libavformat-ffmpeg.so.56 libgcc_s.so.1 libgssapi_krb5.so.2 libkrb5.so.3 libopenjpeg.so.5 libshine.so.3 libuuid.so.1 libXdmcp.so.6
libavutil-ffmpeg.so.54 libgcrypt.so.20 libgtkglext-x11-1.0.so.0 libkrb5support.so.0 libopen-pal.so.13 libSM.so.6 libv4l1.so.0 libXext.so.6
libbluray.so.1 libgdkglext-x11-1.0.so.0 libgtk-x11-2.0.so.0 libleveldb.so.1 libopen-rte.so.12 libsnappy.so.1 libv4l2.so.0 libXfixes.so.3
libbz2.so.1.0 libgdk_pixbuf-2.0.so.0 libHalf.so.12 liblmdb.so.0 libopus.so.0 libsoxr.so.0 libv4lconvert.so.0 libXinerama.so.1
libcaffe2_gpu.so libgdk-x11-2.0.so.0 libharfbuzz.so.0 libltdl.so.7 liborc-0.4.so.0 libspeex.so.1 libva.so.1 libXi.so.6
libcaffe2.so libgflags.so.2 libhogweed.so.4 liblzma.so.5 libp11-kit.so.0 libssh-gcrypt.so.4 libvorbisenc.so.2 libxml2.so.2
libcairo.so.2 libgio-2.0.so.0 libhwloc.so.5 libmodplug.so.1 libpango-1.0.so.0 libstdc++.so.6 libvorbis.so.0 libXmu.so.6
libcom_err.so.2 libglib-2.0.so.0 libibverbs.so.1 libmp3lame.so.0 libpangocairo-1.0.so.0 libswresample-ffmpeg.so.1 libvpx.so.3 libXrandr.so.2
libcrystalhd.so.3 libglog.so.0 libICE.so.6 libmpi_cxx.so.1 libpangoft2-1.0.so.0 libswscale-ffmpeg.so.3 libwavpack.so.1 libXrender.so.1
libc.so.6 libGL.so.1 libicudata.so.55 libmpi.so.12 libpangox-1.0.so.0 libtasn1.so.6 libwebp.so.5 libXt.so.6
libcublas.so.8.0 libGLU.so.1 libicuuc.so.55 libm.so.6 libpcre.so.3 libtbb.so.2 libX11.so.6 libxvidcore.so.4
libcudnn.so.7 libgme.so.0 libidn.so.11 libnettle.so.6 libpixman-1.so.0 libthai.so.0 libx264.so.148 libz.so.1
libcurand.so.8.0 libgmodule-2.0.so.0 libIex-2_2.so.12 libnuma.so.1 libpng12.so.0 libtheoradec.so.1 libx265.so.79 libzvbi.so.0
libdatrie.so.1 libgmp.so.10 libIlmImf-2_2.so.22 libnvidia-glcore.so.410.78 libpthread.so.0 libtheoraenc.so.1 libXau.so.6 pack.sh
libdc1394.so.22 libgnutls.so.30 libIlmThread-2_2.so.12 libnvidia-tls.so.410.78 libraw1394.so.11 libtiff.so.5 libxcb-render.so.0 test
libdl.so.2 libgobject-2.0.so.0 libjasper.so.1 libnvrtc.so.8.0 libresolv.so.2 libtwolame.so.0 libxcb-shm.so.0
libexpat.so.1 libgomp.so.1 libjbig.so.0 libogg.so.0 librtmp.so.1 libudev.so.1 libxcb.so.1
libffi.so.6 libgpg-error.so.0 libjpeg.so.8 libopencv_core.so.2.4 librt.so.1 libunwind.so.8 libXcomposite.so.1

可以看到需要的库文件都打包进来了,而且程序执行的时候不会再去系统的路径中找,而是直接在当前目录找,把整个文件夹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 。

3. Deep Learning 与 C++ 的 未来

Deep Learning 发展到现在,C++ 方面还是不能够随心所欲地coding, 希望在未来半年到一年内还会有新的突破。 期待一下能像写python一样随心所欲地写 C++ 程序!!

相关推荐

5分钟调色大片的方法(5分钟调色大片的方法有哪些)

哈喽大家好。在大家印象中一定觉得ps非常难学非常难。大家不要着急,小编的教学都是针对ps零基础的同学的,而且非常实用哦。只要大家跟着图文练习一两遍,保证大家立马学会~!好了,废话少说,下面开始我们今天...

闪白特效原来是这么用的(闪白特效怎么使用)

作者|高艳侠订阅|010-86092062闪白特效是影视作品中应用比较多的效果之一,那么具体该在哪些场景使用闪白特效?具体该如何操作?下面就以AdobePremiere(以下简称PR)为例,...

ppt常用小图标去哪里找?3个矢量素材网站推荐!

ppt是一个注重可视化表达的演示载体,除了高清图片,ppt中另一类常用的素材是各种小图标,也叫矢量图标,巧妙运用小图标能提升整体美观度和表现力,那么ppt常用小图标去哪里找呢?为方便各位快速找到合适的...

有什么好用的截图录屏工具?试试这9款

经常有朋友反馈苦于缺乏截屏和录屏的趁手工具,本期我们分享几个相当好用的截屏和录屏工具,希望能帮到大家。ScreenToGifScreenToGif是一款免费且开源的录屏工具。此款工具最大的特点是可以...

配色苦手福音!专业快速色环配色PS插件

今天橘子老师给的大家介绍的是一款快速配色的插件,非常强大配色苦手福音来啦!(获取方式见文末)【插件介绍】配色在后期设计中占有主导地位,好的配色能让作品更加抢眼Coolorus这款专业的配色插件,能够...

如何用PS抠主体?(ps怎么抠主体)

1.主体法抠图-抠花苞和花梗导入一张荷花苞的照片,点击上图中顶部“选择”菜单栏,下拉单击“主体”。可以看到,只有花苞被选中,但是花梗并没有被选中。接下来单击上图中左侧工具栏的“快速选择工具”,上图中顶...

2799元的4K电视,有保障吗?(买4k电视机哪个品牌好)

在上一期《电脑报》的3·15专题报道中,我们揭露了一款不靠谱的42英寸4K智能电视——TCLD42A561U。这款售价2699元的4K智能电视不仅4K画质方面存在严重问题,而且各种功能和应用体验也不理...

苹果电脑的Touch Bar推出一段时间了 这款工具可以帮你开发适用于它的APP

距离苹果推出带有TouchBar的MacBookPro已经有一段时间了,除了那些像Adobe、Google和Microsoft大公司在开发适用于TouchBar的应用之外,其实还有很多独立的开...

如魔法般吸取颜色的桌灯(如魔法般吸取颜色的桌灯叫什么)

色彩为生活带来的感官刺激,逐渐被视为理所当然。一盏桌灯运用它的神奇力量,将隐藏于物件中的颜色逐一释放,成为装点环境的空间魔法师。ColorUp是一款可以改变颜色的吸色台灯,沿用传统灯泡的造型,融入了拾...

一篇文章带你用jquery mobile设计颜色拾取器

【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...

ps拾色器快捷键是什么?(ps2019拾色器快捷键)

ps拾色器快捷键是什么?文章末尾有获取方式,按照以下步骤就能自动获得!学会制作PS特效需要一定程度的耐心和毅力。初学者可以从基本的工具和技术开始学习,逐渐提高他们的技能水平。同时,观看更多优秀的特效作...

免费开源的 Windows 截图录屏工具,支持 OCR 识别和滚动截图等

功能很强大、安装很小巧的免费截图、录屏工具,提供很多使用的工具来帮我么能解决问题,推荐给大家。关于ShareXShareX是一款免费的windows工具,起初是一个小巧的截图工具,经过多年的迭...

入门到精通系列PS教程:第13篇 · 拾色器、颜色问题说明及补充

入门到精通系列PS教程:第13篇·拾色器、颜色问题说明及补充作者|侯潇问题说明我的第12篇教程里,有个小问题没有说清楚。要说是错误,又不算是错误,只是没有说准确。写完那篇教程后,因为已经到了深...

PS冷知识:用吸管工具吸取屏幕上的任意颜色

今天,我们给大家介绍PS中的一个冷知识:用吸管工具可以吸取屏幕上的任意颜色。其实,操作起来是非常简单的。大多数情况下,我们认为,PS的吸管工具只能吸取PS软件作图区域范围内的颜色,最多加上画布四周的...

Windows 11 将提供内置颜色选择器工具

Windows11内置了颜色选择器,可以扫描并识别屏幕上的颜色并生成颜色代码。此外,微软还利用人工智能技术,让屏幕上的文本扫描和选择变得更加便捷。这两项功能均已在SnippingToolv1...