{eval=Array;=+count(Array);}
C++屬于研發(fā)工,Python屬于裝配工。
你要知道Python調(diào)用的那些庫(kù)都應(yīng)該是C++寫的,沒(méi)有C++寫出基礎(chǔ)庫(kù),那Python也無(wú)米可炊;
當(dāng)然,你讓研發(fā)工去搞裝配,不是不行,但浪費(fèi)了,而且Python是個(gè)非常優(yōu)秀的膠水語(yǔ)言。尤其在試驗(yàn)過(guò)程中,可以降低成本。
說(shuō)實(shí)話,如果不求深入研發(fā),Python用用已有的C++庫(kù),夠了。
這個(gè)問(wèn)題我有答案,頂我上去。
因?yàn)檫@兩個(gè)崗位要干的活完全不一樣。
第一個(gè)要求python和tensorflow說(shuō)明整個(gè)工作主要在設(shè)計(jì)模型,訓(xùn)練模型,最后可能的輸出形式是用模型離線算一批數(shù)據(jù)或者用GPU在服務(wù)器部署;所以不需要太多的C/C++工程能力。
第二個(gè)工作要求C/C++,特別有一條要在手機(jī)客戶端部署,這個(gè)要求就高很多了,不只是模型訓(xùn)練,你還需要在手機(jī)上實(shí)現(xiàn)模型,手機(jī)上可沒(méi)有CUDA生態(tài)的GPU,主要是一些協(xié)處理器,沒(méi)法直接上tensorflow。所以此時(shí),比較好的方案就是用C/C++來(lái)進(jìn)行CPU編程實(shí)現(xiàn)模型。
人工智能,就是讓機(jī)器可以像人一樣思考問(wèn)題。典型的場(chǎng)景有:圖像識(shí)別、自然語(yǔ)言處理、語(yǔ)音處理、動(dòng)態(tài)物體跟蹤、可運(yùn)動(dòng)的機(jī)器人,等等。
智能,就是人類可以很容易作出判斷,但是卻根本描述不清楚為什么是這樣。比方說(shuō),一張人臉,人類盯上不超過(guò)一秒鐘,然后幾乎不需要思考,就立刻認(rèn)出這是誰(shuí)。但是人類卻根本無(wú)法用文字作出該臉特征的描述。讀文章,有“語(yǔ)感”,聽音樂(lè),有“樂(lè)感”。為什么某首樂(lè)曲聽上去悲傷?感覺(jué),樂(lè)感,真的說(shuō)不清楚悲傷的原因。開車,也是講“感覺(jué)”。只有學(xué)駕照的時(shí)候,教練才教很多公式,教很多特殊點(diǎn)(雨刷鉚釘,右邊玻璃的右下角等等)。AlphaGo為什么是人工智能?對(duì)了,就是“棋感”。
而早期的深藍(lán)下國(guó)際象棋,勝過(guò)人類,就不能叫智能。因?yàn)樗旧鲜且愿F舉為主,深藍(lán)的每一步操作都是精確可描述的,是“可知”的,是機(jī)器思維而不是人類思維。相反,AlphaGo就連開發(fā)者都搞不清楚這機(jī)器是怎么運(yùn)作的。它就是個(gè)“黑匣子”。它模擬的是人的“感覺(jué)”而不是一堆人類發(fā)明的精確圍棋算法公式。感覺(jué)是無(wú)法用語(yǔ)言描述的。
簡(jiǎn)單算術(shù)運(yùn)算也不是智能,因?yàn)槿祟惲兴闶接?jì)算的每一步都是可精確描述的。同樣電子計(jì)算器在算術(shù)運(yùn)算時(shí)的每一個(gè)步驟同樣也是如此(雖然它用的是二進(jìn)制計(jì)算,數(shù)字電路,泰勒級(jí)數(shù)展開等與人類不太一樣的方法)。
人工智能要模擬人的“感覺(jué)”,就必須訓(xùn)練,也可以叫做“學(xué)習(xí)”。比如讓它區(qū)分貓和狗,就給它幾萬(wàn)張貓和狗的圖片,讓它自己去慢慢學(xué)習(xí)。在學(xué)習(xí)前,人類只需要告訴它某張圖是貓或是狗,其他信息一概不用多說(shuō)。比如完全沒(méi)有必要提醒它有胡子的就是貓。
從目前的技術(shù)來(lái)看,訓(xùn)練是非??简?yàn)技術(shù)和花費(fèi)時(shí)間的。以致于大家一提到人工智能,就是以為在說(shuō)機(jī)器訓(xùn)練(機(jī)器學(xué)習(xí))。
訓(xùn)練是個(gè)反復(fù)迭代的過(guò)程,就是說(shuō)需要不斷地探索,此路不通,就換一條路,非常艱辛?,F(xiàn)實(shí)中,往往是不斷地調(diào)整神經(jīng)網(wǎng)絡(luò)的參數(shù),不斷地對(duì)比訓(xùn)練結(jié)果。多數(shù)時(shí)候還要數(shù)據(jù)預(yù)處理,以及輔助傳統(tǒng)的機(jī)器學(xué)習(xí)、傳統(tǒng)圖像處理、模式識(shí)別等技術(shù)。
那么,上述過(guò)程,誰(shuí)最擅長(zhǎng)?現(xiàn)在公認(rèn)的就是Python。
Python是解釋性語(yǔ)言而,弱類型,用起來(lái)很方便,開發(fā)效率大大高過(guò)C++、JAVA等語(yǔ)言,而且有很多現(xiàn)成的機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、科學(xué)計(jì)算庫(kù),這些都是它作為人工智能語(yǔ)言的優(yōu)勢(shì)。AlphaGo的頂層代碼大部分是用的Python,AlphaGo的成功,也對(duì)Python起了很大的推動(dòng)作用。
數(shù)據(jù)的訓(xùn)練還可以細(xì)分為兩類。一是前期的算法探索和小樣本數(shù)據(jù)訓(xùn)練,二是后期正式的大規(guī)模數(shù)據(jù)訓(xùn)練。比如實(shí)驗(yàn)的1萬(wàn)個(gè)樣本,可能要訓(xùn)練1個(gè)小時(shí)才能得到理想的網(wǎng)絡(luò)。而最終的100萬(wàn)個(gè)樣本時(shí),可能就需要100個(gè)小時(shí)。這已經(jīng)很長(zhǎng)了。這時(shí)候,C++的作用就體現(xiàn)出來(lái)了??梢杂肅++花很多的人力成本投入去優(yōu)化算法。概括說(shuō)來(lái)就是,前期用Python進(jìn)行算法探索,待算法和相關(guān)參數(shù)確定,后期用C++重寫算法實(shí)現(xiàn)生產(chǎn)環(huán)境的真實(shí)的正式的訓(xùn)練。
訓(xùn)練是人工智能的很難的一部分,但是絕對(duì)不是人工智能的全部。人工智能還包括前期的數(shù)據(jù)獲取、數(shù)據(jù)預(yù)處理和后期的實(shí)際應(yīng)用。
訓(xùn)練得到的只是一個(gè)巨大的神經(jīng)網(wǎng)絡(luò),有了它以后就可以預(yù)測(cè)了。預(yù)測(cè)所需要花的時(shí)間遠(yuǎn)遠(yuǎn)短于訓(xùn)練。比如訓(xùn)練花100個(gè)小時(shí),而用訓(xùn)練好后的網(wǎng)絡(luò)預(yù)測(cè)可能只需要5秒??蓜e小看這5秒的短時(shí)間。我們?nèi)匀挥斜匾獌?yōu)化,比如是否可以1秒就完成,0.1秒完成?試想,設(shè)計(jì)一個(gè)無(wú)人駕駛系統(tǒng),那可是分秒必爭(zhēng)??!稍微反應(yīng)遲緩就可能釀成事故。
這時(shí)候,C++的作用又一次體現(xiàn)出來(lái)了!
這還沒(méi)完。人工智能的載體可能會(huì)很精簡(jiǎn)。比方說(shuō)嵌入到人體,嵌入到汽車,這么小的系統(tǒng),不是Python的天下。還有機(jī)器人,是可以運(yùn)動(dòng)的,如何驅(qū)動(dòng)機(jī)器動(dòng),這不還是C++的強(qiáng)項(xiàng)嘛。
另外,還涉及到前期的數(shù)據(jù)采集和預(yù)處理。比如圖像、音頻、視頻,需要實(shí)時(shí)感知,包括必要的預(yù)處理(比如灰度化、關(guān)鍵部位快速定位)。這就要用到音頻視頻的高效處理,數(shù)據(jù)通信,物聯(lián)網(wǎng)等技術(shù)。這不還是C++的強(qiáng)項(xiàng)嗎?
總之,在人工智能開發(fā)的整個(gè)過(guò)程中,Python主要處理算法模型部分,而具體的前期數(shù)據(jù)獲取和后期與外部設(shè)備部分的交互則可以用C++來(lái)實(shí)現(xiàn)。
說(shuō)個(gè)最夸張的例子。假如我們已知X要預(yù)測(cè)Y,Python做的工作就是找到Y(jié)=aX+b這測(cè)關(guān)系式,特別是a和b的具體數(shù)值最值錢。而除此之外的所有工作,從數(shù)據(jù)采集,軟件架構(gòu)設(shè)計(jì),數(shù)據(jù)庫(kù)設(shè)計(jì)與讀寫,后臺(tái)運(yùn)作,分布式處理一直到前端展示可能都是用的Python以外的技術(shù)(比如C++)來(lái)實(shí)現(xiàn)。Python的工作僅僅是得到a和b,僅此而已!
不過(guò),從目前來(lái)看,人工智能最主要和最難的部分依然是由Python來(lái)實(shí)現(xiàn)的。
py用來(lái)訓(xùn)練、測(cè)試、驗(yàn)證模型,c++用來(lái)部署模型。拿mxnet來(lái)說(shuō),開發(fā)的時(shí)候,用py-mxnet來(lái)訓(xùn)練測(cè)試模型,當(dāng)模型達(dá)到性能和速度需求后,用mxnet的c動(dòng)態(tài)庫(kù)來(lái)deploy部署,可以編譯不同硬件平臺(tái)的動(dòng)態(tài)庫(kù)。
其實(shí)人工智能可以用到很多種語(yǔ)言,不只是Python和C/C++,還有Java,以及l(fā)isp,prolog.不過(guò)目前來(lái)看,還是Python和C++用得更多。
而Python其實(shí)是人工智能的首選語(yǔ)言,而且想要入門Python比其他語(yǔ)言都會(huì)容易些。當(dāng)然了,不是說(shuō)C++在人工智能中就毫無(wú)用處了,而是相比Python,它更不適合用在人工智能上。為什么?
看看它的缺點(diǎn):1.遵循自上而下的方法,語(yǔ)言比較復(fù)雜;2.僅僅是更適合實(shí)現(xiàn)特定系統(tǒng)或者是算法核心/基礎(chǔ)。
而Python呢??jī)?yōu)勢(shì)更多:1.開發(fā)速度明顯比C++更快;2.有各種各樣的庫(kù)和工具;3.它面向?qū)ο螅?.它還支持算法測(cè)試。
C++是所有語(yǔ)言的基礎(chǔ),現(xiàn)在很多編程語(yǔ)言都是由此衍生過(guò)來(lái)的,因?yàn)榫–++太難了,其語(yǔ)言的繁瑣性,很多人都在半路上就放棄了,所以才出現(xiàn)了之后的很多簡(jiǎn)潔版的編程語(yǔ)言。
所以就當(dāng)前的學(xué)習(xí)趨勢(shì)來(lái)看,很多人都會(huì)選擇Python,不僅僅是因?yàn)镻ython具有強(qiáng)大的數(shù)據(jù)庫(kù),對(duì)人工智能技術(shù)有著更多的優(yōu)勢(shì),還因?yàn)橄鄬?duì)于C++語(yǔ)言來(lái)說(shuō),是簡(jiǎn)單容易入門,容易上手的!很多零基礎(chǔ)的同學(xué)也是可以學(xué)會(huì)的!
這么說(shuō)吧,C++學(xué)精了,上手其他編程語(yǔ)言會(huì)簡(jiǎn)單許多,有很多優(yōu)勢(shì),python主要是上手簡(jiǎn)單,但是精通也不容易。程序語(yǔ)言也沒(méi)有哪個(gè)更重要,只有哪個(gè)更適合。人工智能的開發(fā)的核心庫(kù)一般都也是C++寫的,只是提供了python程序語(yǔ)言接口,因?yàn)樗憬?。在開發(fā)過(guò)程中遇到性能調(diào)優(yōu)的問(wèn)題時(shí)還是會(huì)繞回到C++的。
首先,什么是人工智能要搞清楚。機(jī)器學(xué)習(xí) 深度學(xué)習(xí)不能代替人工智能。第二,用于人工智能的語(yǔ)言很多,lisp,prolog,smalltalk是傳統(tǒng)人工智能語(yǔ)言,forth, C/C++,fortran,Cobol,JAVA,Python,...都可以并實(shí)際用于人工智能。第三 關(guān)于機(jī)器學(xué)習(xí),C/C++是Python算法庫(kù)的根。算法實(shí)現(xiàn)需要C/C++。應(yīng)用可以用Python.因此,真正搞機(jī)器學(xué)習(xí),還是需要C/C++。搞人工智能需要的知識(shí)更多。lisp,prolog也往往需要C/C++來(lái)實(shí)現(xiàn)。我自1983年進(jìn)入人工智能領(lǐng)域。幾十年沒(méi)有多少同行。去年冒出那么多專家。懵了。第四,我本人不贊成Python是最適合人工智能的語(yǔ)言。請(qǐng)問(wèn)lisp,prolog,smalltalk放哪?可解釋推理。Python怎么實(shí)現(xiàn)?
這個(gè)主要看這個(gè)崗位招收的人員是需要進(jìn)行哪個(gè)層次的編程工作。
C++在繼承了C語(yǔ)言的優(yōu)點(diǎn)的同時(shí)加入了面向?qū)ο蟮膬?nèi)容。所以C++語(yǔ)言不但可以構(gòu)建效率較高的底層具體的算法實(shí)現(xiàn),又有良好的擴(kuò)展性和代碼重用性。所以一般在追求高效運(yùn)行的底層算法中,我們一般使用C或C++來(lái)進(jìn)行構(gòu)建。
python語(yǔ)言作為一種解釋性語(yǔ)言,運(yùn)行效率比較低。但是python上已經(jīng)具有了大量構(gòu)建好的人工智能算法庫(kù)。所以python語(yǔ)言更適于構(gòu)建上層框架。這樣不但構(gòu)建效率高,容易調(diào)試。因此在上層算法中通常使用python語(yǔ)言構(gòu)建應(yīng)用層框架。
通過(guò)兩種語(yǔ)言的配合方式充分利用了兩種開發(fā)語(yǔ)言的長(zhǎng)處和有點(diǎn),也利于保持原有語(yǔ)言類型上所進(jìn)行的原有開發(fā)。
因此,在人工智能崗位的招聘中,大一些的公司都會(huì)分開來(lái)進(jìn)行招聘。需要底層算法實(shí)現(xiàn)的招熟悉C或C++的人,需要高層算法實(shí)現(xiàn)的招熟悉python的人。
平常訓(xùn)練使用python,真正上線的時(shí)候用cpp。因?yàn)槿绻胮ython環(huán)境是個(gè)問(wèn)題,一臺(tái)機(jī)器一臺(tái)機(jī)器的搭建paddle or tensorflow太麻煩了,況且效率也不高。將預(yù)測(cè)的代碼寫成cpp的,只把依賴的庫(kù)拷貝出來(lái)放到每臺(tái)機(jī)器上就行了。
10
回答0
回答3
回答0
回答10
回答0
回答0
回答0
回答0
回答0
回答