机器学习从理论到工程的第二步-开发环境与工具篇
在《第一步-編程語言篇》中,小夕為大家較為詳細(xì)的介紹了做機(jī)器學(xué)習(xí)(及其相關(guān)應(yīng)用方向)的編程語言的選擇問題,這一篇便是小夕為大家推薦的各個(gè)編程語言的開發(fā)環(huán)境/工具。
習(xí)慣性掃盲開篇。鑒于可能有部分同學(xué)的軟件開發(fā)經(jīng)驗(yàn)稍有欠缺,因此首先講講基本概念。
?
代碼編輯器:
代碼編輯器就是寫代碼的地方啦,其實(shí)任何文本編輯器都可以作為代碼編輯器,畢竟源代碼是寫成純文本的形式的。
?
但是效果往往就是像上圖一樣簡(jiǎn)陋而低效。由于寫代碼涉及到代碼自動(dòng)補(bǔ)全、語法關(guān)鍵字高亮、智能縮進(jìn)等高效排版和代碼檢查的需求,因此像windows下自帶的文本文檔這種編輯器是不適合直接拿來用的。
?
除了上面這類眾所周知的圖形化模式下的系統(tǒng)自帶的文本編輯器,還有命令行模式下的編輯器,比如眾所周知的vim編輯器。
?
對(duì)于資深程序員/喵來說,vim完全可以被DIY成寫代碼神器,但是對(duì)于初學(xué)者,小夕強(qiáng)烈不建議基于這類編輯器去DIY,很費(fèi)時(shí)費(fèi)力,而且除了可以裝X以外,對(duì)機(jī)器學(xué)習(xí)算法和工程的研發(fā)幾乎沒有實(shí)質(zhì)性的幫助。而且實(shí)踐證明,哪怕DIY的一身神裝,還是不如下面小夕會(huì)推薦的代碼編輯器強(qiáng)大。
?
一般意義上的代碼編輯器的話,大家也應(yīng)該比較熟悉啦。比如各種IDE中內(nèi)嵌的,比如上個(gè)世紀(jì)的產(chǎn)物VC6.0、windows下的VS、mac下的xcode、跨平臺(tái)的Eclipse、Qt等IDE中內(nèi)嵌的文本編輯器也是非常強(qiáng)大的,除此之外,Sublime等非IDE內(nèi)嵌的代碼編輯器也是各具特色,在性能上甚至遠(yuǎn)超過IDE內(nèi)嵌的編輯器。
??
編譯器:
很多初學(xué)者認(rèn)為,他們?cè)谟玫腣C6.0,VS就是編譯器,這就比較尷尬了。其實(shí)編譯器的功能很直接,就是將上面用純文本寫成的源代碼按照它會(huì)的編程語言的語法規(guī)則編譯成可執(zhí)行文件。
生成的可執(zhí)行文件可以運(yùn)行在你的操作系統(tǒng)里,比如windows下的exe文件,也可以運(yùn)行在某語言的虛擬機(jī)里,比如運(yùn)行在Java虛擬機(jī)JRE下的class文件。
?
比如我們寫了這么一段(C語言)源代碼。文件名叫hello.c。
??
然后我們僅僅是調(diào)用編譯器編譯它一下。(在命令行里直接調(diào)用C語言的經(jīng)典編譯器——GCC。如下圖:
?
?
即,調(diào)用gcc編譯器,編譯hello.c,目標(biāo)文件名叫“hello”。
?
然后編譯完成,我們通過這個(gè)命令看一下文件夾下的文件及其權(quán)限等信息:
?
發(fā)現(xiàn)文件夾下生成了hello這個(gè)文件,順便看一下文件權(quán)限(第一列)。
?
?
發(fā)現(xiàn)生成的hello的文件權(quán)限里有x,而x就代表著可執(zhí)行。運(yùn)行一下,就可以看到printf出的信息啦:
就醬,這就是編譯器的使命。
?
調(diào)試器:
但是,實(shí)際開發(fā)過程中,經(jīng)常有編譯錯(cuò)誤或者運(yùn)行時(shí)的錯(cuò)誤,因此我們需要通過打斷點(diǎn)(break point)來暫停程序運(yùn)行,實(shí)時(shí)查看運(yùn)行時(shí)代碼中變量的值等,來幫助我們調(diào)試代碼,找到錯(cuò)誤。
?
初學(xué)者完成這個(gè)過程往往是在vc6.0、VS等IDE中,以為這是IDE的專利。實(shí)際上這個(gè)也是跟編譯器一樣,是可以獨(dú)立運(yùn)行的一個(gè)程序。有興趣的同學(xué)可以在命令行試一下用GDB來調(diào)試代碼,小夕就不演示啦。
?
集成開發(fā)環(huán)境:
集成開發(fā)環(huán)境(IDE)就是集成了一系列開發(fā)工具的環(huán)境,比如上面的文本編輯器、xx語言編譯器、調(diào)試器等,往往還會(huì)包含開發(fā)環(huán)境(environments)管理、項(xiàng)目管理(projects)等功能。誒?那么開發(fā)環(huán)境和項(xiàng)目管理有什么區(qū)別和意義呢?
?
開發(fā)環(huán)境:
其實(shí),開發(fā)環(huán)境就可以看成一個(gè)虛擬機(jī)!凡是在這個(gè)虛擬機(jī)里進(jìn)行研發(fā)的項(xiàng)目,都可以自由使用這個(gè)虛擬機(jī)里的資源。這里的資源就是指各種庫/包。誒誒?弄這么一個(gè)虛擬機(jī)有什么用呢?我從來沒有感受過它的存在呀~
?
所以說呀,在埋頭苦推數(shù)學(xué)公式的時(shí)候,不要忘了編程經(jīng)驗(yàn)的積累哦~想象一下,平常你都是用最新版TensorFlow(比如1.x版本)+最新版python(比如3.x版本)去驗(yàn)證你剛開腦洞想出的算法,然后有一天,你突然發(fā)現(xiàn)這個(gè)算法別人已經(jīng)實(shí)現(xiàn)過了,掛在了github上。然后呢,你就想直接跑人家寫好的代碼看計(jì)算結(jié)果。
?
但是,不幸的是,他的代碼是用舊版TensorFlow實(shí)現(xiàn)的,比如0.5.0的版本!python也是舊版的python2!而你電腦上一直用的是1.x的版本tf和3.x版本的python!而舊版跟新版的API風(fēng)格差別很大,移植會(huì)特別費(fèi)時(shí)間!那怎么辦呢?把自己電腦上的TensorFlow和python卸掉嗎?
?
當(dāng)然這時(shí)就是開發(fā)環(huán)境發(fā)揮作用的時(shí)候啦~我們只需要新建一個(gè)開發(fā)環(huán)境(虛擬機(jī)),在這個(gè)虛擬機(jī)里,下載好舊版tensorflow等,這樣既能進(jìn)入到這個(gè)虛擬機(jī)里直接跑人家的代碼,又可以關(guān)掉這個(gè)虛擬機(jī),返回到你默認(rèn)的環(huán)境里,去繼續(xù)用你的最新版python和TensorFlow啦~
項(xiàng)目管理(project):?
項(xiàng)目管理,其實(shí)就跟操作系統(tǒng)里的文件系統(tǒng)是一樣的原理。
我們?cè)谧鰴C(jī)器學(xué)習(xí)項(xiàng)目時(shí),往往有不同源的數(shù)據(jù)集,因此需要一個(gè)Dataset文件夾里面放著各種數(shù)據(jù)集;然后需要由我們項(xiàng)目的核心代碼,因此需要一個(gè)Source文件夾;然后有時(shí)用到一些冷門的第三方庫,為了避免與我們的代碼混淆,于是將它們放到Library文件夾;然后訓(xùn)練模型的過程中,比如訓(xùn)練一個(gè)深度神經(jīng)網(wǎng)絡(luò),那么我們需要隔一段時(shí)間保存一下模型的訓(xùn)練結(jié)果呀,所以又需要額外的文件夾保存模型的參數(shù)日志等~更不用說測(cè)試的過程啦。
所以,將上面這些瑣碎的目錄納入到一個(gè)框架下,那就是project了。至此有沒有懂project和environment的區(qū)別呢?所以,我們同一個(gè)project完全可以放到不同的environment里去運(yùn)行,只要這個(gè)environment有這個(gè)project所需要的資源(版本符合要求的庫);而一個(gè)environment也當(dāng)然可以用在多個(gè)project啦。
腳本語言與解釋器:
還有一些現(xiàn)代編程語言,不需要被編譯器編譯成可執(zhí)行文件后才能運(yùn)行,這一類語言被稱為腳本語言,比如python、matlab。
?
不需要編譯就能直接運(yùn)行有什么好處呢?那就是可以用一個(gè)稱為“解釋器”的程序來實(shí)時(shí)的解釋你敲入的每一句話,比如在python解釋器中,
?
單純的解釋器好像看起來并沒什么卵用,只能當(dāng)做玩具寫寫hello Xi Xiaoyao這種代碼。但是在后面的講解中,小夕將給大家看到它的強(qiáng)大應(yīng)用——單元測(cè)試。
好啦,概念掃盲完成了~下面就開始正文了——工具推薦!
?
誒誒?快2000字了?那還是敬請(qǐng)期待《機(jī)器學(xué)習(xí)從理論到工程的第二步——開發(fā)環(huán)境與工具(下)》啦( ̄? ̄)
總結(jié)
以上是生活随笔為你收集整理的机器学习从理论到工程的第二步-开发环境与工具篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程系列(二):线程的五大状态
- 下一篇: 阿里P8架构师谈:JVM的内存分配、运行