丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
人工智能 正文
發(fā)私信給叢末
發(fā)送

1

一文詳解 TensorFlow 2.0 的符號式 API 和命令式 API

本文作者: 叢末 2019-01-30 20:47
導(dǎo)語:按照自身所需自行選擇最合適的 API~

雷鋒網(wǎng) AI 科技評論按:日前,Josh Gordon 在 TensorFlow 官網(wǎng)上發(fā)布了一篇博客,詳細(xì)介紹了符號式 API(symbolic API)和命令式 API(imperative API),并詳細(xì)介紹了兩種樣式各自的優(yōu)點(diǎn)和局限性,以及各自適用于哪些場景。雷鋒網(wǎng) AI 科技評論編譯如下。

TensorFlow 2.0 中,我最喜歡的一點(diǎn)就是它提供了多個抽象化(abstraction)級別,讓你可以根據(jù)自己的項目,挑選出最適合的級別。本文中,我將解讀如何權(quán)衡創(chuàng)建神經(jīng)網(wǎng)絡(luò)的兩種樣式:

  • 第一種是符號式(symbolic),即你通過操作層次圖來創(chuàng)建模型;

  • 第二種是一種命令式(imperative),即你通過擴(kuò)展類來創(chuàng)建模型。

除了介紹這兩種樣式,我還會分享關(guān)于重要設(shè)計和適用性方面需要注意的事項,并在文章最后給大家提供一些有助于選擇正確樣式的建議。

 符號式(Symbolic)API

符號式 API,也稱作聲明式(Declarative) API。

當(dāng)我們想到一個神經(jīng)網(wǎng)絡(luò)時,我們通常會將心智模型(mental model)用如下圖所示的「層次圖」來表示:

一文詳解 TensorFlow 2.0 的符號式 API 和命令式 API

當(dāng)我們想到一個神經(jīng)網(wǎng)絡(luò)時,我們通常會將心智模型(mental model)用「層次圖」來表示(圖像是 Inception-ResNet 的圖式)

該圖可以是有向無環(huán)圖(DAG),如左邊所示;也可以是堆棧圖(stack),如右邊所示。當(dāng)我們用符號來創(chuàng)建模型,我們通過對該圖的架構(gòu)進(jìn)行描述來創(chuàng)建。雖然這個操作聽起來帶有技術(shù)性,但是如果你曾經(jīng)使用過 Keras 的話,就會驚訝地發(fā)現(xiàn)你已經(jīng)擁有了相關(guān)的經(jīng)驗。這里有一個關(guān)于用符號來創(chuàng)建模型的簡單示例,這個示例中使用的是 Keras 的 Sequential API。

一文詳解 TensorFlow 2.0 的符號式 API 和命令式 API

使用 Keras 的 Sequential API 符號式地創(chuàng)建神經(jīng)網(wǎng)絡(luò)。你可以點(diǎn)擊這里運(yùn)行這個示例。

在上面這個示例中,我們定義了一個堆棧(a stack of layers),然后使用內(nèi)置的訓(xùn)練循環(huán)(training loop)——model.fit 來對它進(jìn)行訓(xùn)練。

使用 Keras 創(chuàng)建模型感覺與「把樂高積木拼裝在一起」一樣簡單。為什么這么說?除了匹配心智模型,針對后面將介紹到的技術(shù)原因,由于框架能夠提供詳細(xì)錯誤,使用這種方法來創(chuàng)建模型能夠輕易地排除故障。

一文詳解 TensorFlow 2.0 的符號式 API 和命令式 API

該圖展示了通過上述代碼創(chuàng)建的模型(使用plot_model創(chuàng)建,你在本文的下一個示例中可以重用該代碼片段)

TensorFlow 2.0 還提供了另一個符號式 API :Keras Functional。Sequential 是針對堆棧圖的 API;而 Functional,如你所想,是針對 DAG 的 API。

一文詳解 TensorFlow 2.0 的符號式 API 和命令式 API

使用 Functional API 創(chuàng)建多輸入/多輸出模型。

Functional API 是一種創(chuàng)建更靈活的模型的方法,可以操作非線性拓?fù)?、共享層的模型以及有多個輸入或輸出的模型。一般來說,F(xiàn)unctional API 是一個用來創(chuàng)建這些層次圖的工具集,我們現(xiàn)在也正在為大家準(zhǔn)備一些新教程,來教大家使用這些 API。

另外也有一些其他的符號式 API,這些 API 你們可能也使用過。例如,TensorFlow v1 (及 Theano) 提供了一個層級更低得多的 API。當(dāng)進(jìn)行編譯并執(zhí)行時,你可以通過設(shè)計一個 ops 圖來創(chuàng)建模型。有時候,使用這種 API 可能會讓你感覺像是在與一個編譯器進(jìn)行直接的互動。對于很多人(包括作者)來說,該 API 是比較難使用的。

相比之下,使用 Keras 的 Functional API,抽象化級別可以匹配心智模型:像樂高拼圖一樣將層次圖拼接起來。這種 API 使用起來感覺會比較自然,它也是我們在 TensorFlow 2.0 中進(jìn)行標(biāo)準(zhǔn)化的模型創(chuàng)建方法之一。接下來我將介紹另一種 API 樣式(同時,這種樣式你也可能使用過,或者你可能不久后會嘗試這種 API)。

命令式(Imperative)API

命令式 API,也稱作模型子類化(Model Subclassing) API。

在命令式 API 中,你要像編寫 NumPy 一樣編寫模型。用這種 API 創(chuàng)建模型感覺像是在開發(fā)面向?qū)ο蟮?Python。這里有一個關(guān)于子類化模型的簡單示例:

一文詳解 TensorFlow 2.0 的符號式 API 和命令式 API

使用命令式 API 為一個有文字說明的圖片創(chuàng)建模型(注意:該示例目前正在更新)。

從一個開發(fā)者的角度,它工作的方法就是擴(kuò)展由框架定義的模型類別,將模型中的層實例化,然后命令式地編寫下模型的正向傳遞(forward pass),而反向傳遞(backward pass)是自動生成的。

TensorFlow 2.0 支持使用現(xiàn)成的 Keras 的子類化 API 來創(chuàng)建模型。與 Sequential API 和 Functional API 一樣,它也是使用 TensorFlow 2.0 創(chuàng)建模型時推薦使用的方法之一。

雖然這種方法在 TensorFlow 來說還比較新,但是你會驚訝地發(fā)現(xiàn)早在 2015 年 Chainer 就對它進(jìn)行了介紹(時光飛逝!)自那以后,許多框架都采用了相似的方法,包括 Gluon、PyTorch 和 TensorFlow (以及 Keras Subclassing)。令人驚訝地是,在不同的框架中使用這種樣式所編寫的代碼看上去非常相似,研究者可能都難以分清哪些代碼是哪個框架的!

這種樣式能給開發(fā)人員帶來巨大的靈活性,不過也會帶來一些不明顯的適用性和維護(hù)成本。稍后我們會更詳細(xì)地討論這一點(diǎn)。

訓(xùn)練循環(huán)(Training Lloop)

自定義的模型無論是使用 Sequential API、Functional API 還是使用子類化樣式,都可以用兩種方式進(jìn)行訓(xùn)練:

  • 一種是使用內(nèi)建的訓(xùn)練路徑和損失函數(shù)(第一個示例講到的,我們使用的是 model.fit model.compile);

  • 另一種是定制更復(fù)雜的訓(xùn)練循環(huán)(例如,當(dāng)你想要自行編寫梯度裁剪代碼時)或損失函數(shù),你可以按照以下方法輕易實現(xiàn):

一文詳解 TensorFlow 2.0 的符號式 API 和命令式 API

 Pix2Pix 定制訓(xùn)練循環(huán)和損失函數(shù)的示例

將這些方法對外開放是非常重要的,使用它們來降低代碼復(fù)雜性以及維護(hù)成本都非常方便。一般而言,如果增加復(fù)雜度是有幫助的,那你就增加并將其利用起來;沒必要的話,就直接使用內(nèi)建的方法,將你的時間更多地花在你的研究或者項目上。

既然我們已經(jīng)對符號式 API 和命令式 API 都建立起了認(rèn)知,接下來就讓我們看一下兩者各自的優(yōu)劣勢。

符號式 API 的優(yōu)勢和局限性

優(yōu)勢

使用符號式 API 創(chuàng)建的模型,就是一個類似圖形的數(shù)據(jù)架構(gòu),這就意味著你的模型可以接受監(jiān)測或者進(jìn)行匯總。

  • 你可以將模型當(dāng)成圖像來為其繪制圖表(使用 keras.utils.plot_model);或者簡單地使用 model.summary() 來呈現(xiàn)層、權(quán)重以及形狀的描述。

同樣地,在將層拼接在一起時,開發(fā)庫的設(shè)計者可以運(yùn)行擴(kuò)展的層兼容性檢查(在創(chuàng)建模型時和執(zhí)行模型之前)。

  • 這類似于在編譯器中進(jìn)行類型檢查,可以極大地減少開發(fā)者的錯誤。

  • 大多數(shù)的故障排除都會在模型自定義階段而不是執(zhí)行期間進(jìn)行。你可以保障所有編譯的模型都能正常運(yùn)行,這也加速了迭代,并讓故障排除變得更簡單。

符號式模型提供了一個一致的 API,這就使得這些模型的重復(fù)使用和共享變得簡單。例如,在遷移學(xué)習(xí)中,你可以訪問中間層的神經(jīng)元,從而從現(xiàn)有的神經(jīng)元中創(chuàng)建新的模型,就像這樣:

一文詳解 TensorFlow 2.0 的符號式 API 和命令式 API

符號式模型由可自然地進(jìn)行復(fù)制和克隆的數(shù)據(jù)架構(gòu)進(jìn)行定義。

  • 例如,Sequential API 和 Functional API 可以提供 model.get_config(),model.to_json()model.save(),clone_model(model),同時僅憑借數(shù)據(jù)架構(gòu)就能夠重新創(chuàng)建同樣地模型(而不需要訪問用來定義和訓(xùn)練模型的原始代碼)。

雖然精心設(shè)計的 API 應(yīng)該跟神經(jīng)網(wǎng)絡(luò)的心智模型匹配,但是跟我們作為一個程序員所有的心智模型進(jìn)行匹配也同樣重要。對于我們大多數(shù)程序員來說,這種心智模型就是命令式的編程樣式。在符號式 API 中,你操作「聲明式的張量」(這些張量是沒有值的)來創(chuàng)建圖表。Keras 的 Sequential API 和 Functional API「感覺像」命令性的,它們是在開發(fā)者沒有意識到他們在用符號定義模型的情況下被設(shè)計出來的。

局限性

符號式 API 的當(dāng)前一代,可以很好地適用于有向無環(huán)圖的模型創(chuàng)建,這可以滿足絕大多數(shù)實際應(yīng)用的需要,然而現(xiàn)在也有一些特例無法匹配這個簡潔的抽象化,例如,樹形循環(huán)神經(jīng)網(wǎng)絡(luò)和遞歸神經(jīng)網(wǎng)絡(luò)等動態(tài)網(wǎng)絡(luò)。

這也是為什么 TensorFlow 要同時還提供命令式的模型創(chuàng)建 API 樣式(上文中提到的子類化 API)。無論是使用 Sequential API 還是 Functional API,你都會用到所有熟悉的層、初始化器以及優(yōu)化器。同時,這兩類 API 是完全互操作的,因此你可以混合并且搭配兩者使用(例如將一種模型嵌套到另一種模型中)。你可以采用一個符號式模型并在子類化模型中將它用作層,反之亦然。

命令式 API 的優(yōu)勢和局限性

優(yōu)勢

正向傳遞(forward pass)以命令式的方法編寫,這就使得用自己的實現(xiàn)來替換掉通過開發(fā)庫實現(xiàn)的部分(例如一層、一個神經(jīng)元后者一個損失函數(shù))變得很容易。這種方式的編程也非常自然,并且是深入了解深度學(xué)習(xí)的基本要點(diǎn)的不錯的方法。

  • 這也讓你快速地嘗試新想法變得很容易(深度學(xué)習(xí)開發(fā)工作流會變得與面向?qū)ο蟮?Python 一樣),同時對于研究人員來說尤其有幫助。

  • 也可以很輕易地使用 Python 指定模型正向傳遞中的任意控制流。

命令式 API 給予了你最大的靈活性,但同時也要付出代價。我喜歡用這種樣式來寫代碼,但還是想花點(diǎn)時間來強(qiáng)調(diào)一下它的局限性(意識到要對這種方法的優(yōu)勢和局限性進(jìn)行權(quán)衡是很不錯的)。

局限性

當(dāng)使用命令式 API 使,模型是由某個類別方法來進(jìn)行定義的。這樣的話,模型就不再是一個清晰的數(shù)據(jù)架構(gòu),而是一個不透明的字節(jié)碼。這種 API 樣式所獲得的靈活性是以可用性和可重用性換來的。

故障排除發(fā)生在執(zhí)行期間,而不是在定義模型之時。

  • 使用這一 API 樣式時,由于幾乎不會對輸入或者層間兼容性進(jìn)行檢查,因此大量的故障排除壓力就從框架上轉(zhuǎn)移到了開發(fā)者身上。

命令式模型很難進(jìn)行重復(fù)利用。例如你無法使用一個一致的 API 去訪問中間層或神經(jīng)元。

  • 相反地,提取神經(jīng)元的方法就是采用一種新的調(diào)用(或者前進(jìn))方法來編寫一個新的類別。最開始的時候可能會覺得這個操作有趣又簡單,但是如果沒有標(biāo)準(zhǔn)的話就會積累成技術(shù)債(tech debt)。 

命令式模型也很難進(jìn)行檢測、復(fù)制和克隆。

  • 例如,model.save(), model.get_config(),以及 clone_model 對于子類化的模型是不起作用的,而 model.summary() 也只能給你層的列表(并且不會提供任何關(guān)于它們怎樣進(jìn)行連接的信息,因為這些信息是訪問不了的)。

機(jī)器學(xué)習(xí)系統(tǒng)中的技術(shù)債(Technical debt)

記住:模型創(chuàng)建僅僅是機(jī)器學(xué)習(xí)實際應(yīng)用中的一個小小的部分。關(guān)于這個主題,有一個我非常喜歡的描述:模型本身(指定層、訓(xùn)練循環(huán)等的代碼部分)就是機(jī)器學(xué)習(xí)中央的一個小盒子。

一文詳解 TensorFlow 2.0 的符號式 API 和命令式 API

現(xiàn)實中的機(jī)器學(xué)習(xí)系統(tǒng)僅有一小部分是由機(jī)器學(xué)習(xí)代碼組成的,就像上圖中間的這個小塊所顯示的一樣。來源:Hidden Technical Debt in Machine Learning Systems

符號式定義的模型在可重用性、故障排除以及測試方面具有優(yōu)勢,例如,在教授期間,如果學(xué)生使用的是 Sequential API,我立刻就能排除故障;如果他們使用的是子類化的模型(不管框架),排除故障需要花費(fèi)的時間就更長(故障會更不易察覺,類型也更多)。

總結(jié)

TensorFlow 2.0 直接支持符號式 API 和命令式 API 兩種樣式,因此大家可以選擇最適合自己項目的抽象化(復(fù)雜性)層級。

如果你的目標(biāo)是易用、低預(yù)算,同時你傾向于將模型考慮稱層次圖,那就使用 Keras 的 Sequential API 或者 Functional API (就像拼裝樂高積木一樣) 和內(nèi)建的訓(xùn)練循環(huán)。這種方法適用于大多數(shù)問題。

如果你偏好于將模型考慮成面向?qū)ο蟮?Python/Numpy 開發(fā)者,同時有限考慮模型的靈活性和可破解性,Keras 的 Subclassing 這樣的 API 會比較適合你。

我希望這篇總結(jié)文對大家有所幫助,感謝大家的閱讀!如果想要了解關(guān)于 TensorFlow 2.0 棧以及其他模型創(chuàng)建 API 的更多信息,可前往閱讀這篇文章。想要對  TensorFlow 和 Keras 之間的關(guān)系有更多了解,可前往這里。

via:https://medium.com/tensorflow/what-are-symbolic-and-imperative-apis-in-tensorflow-2-0-dfccecb01021  雷鋒網(wǎng) AI 科技評論編譯。

雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知

一文詳解 TensorFlow 2.0 的符號式 API 和命令式 API

分享:
相關(guān)文章
當(dāng)月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說