您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>C/C++語(yǔ)言編程>

以Go綁定實(shí)例理解TensorFlow

大小:0.3 MB 人氣: 2017-09-28 需要積分:1

  本文通過(guò)一個(gè)簡(jiǎn)單的Go綁定實(shí)例,讓讀者一步一步地學(xué)習(xí)到Tensorflow有關(guān)ID、作用域、類型等方面的知識(shí)。以下是譯文。

  Tensorflow并不是機(jī)器學(xué)習(xí)方面專用的庫(kù),而是一個(gè)使用圖來(lái)表示計(jì)算的通用計(jì)算庫(kù)。它的核心是用C++實(shí)現(xiàn)的,并且還有不同語(yǔ)言的綁定。Go語(yǔ)言綁定是一個(gè)非常有用的工具,它與Python綁定不同,用戶不僅可以通過(guò)Go語(yǔ)言使用Tensorflow,還可以了解Tensorflow的底層實(shí)現(xiàn)。

  綁定

  Tensorflow的開發(fā)者正式發(fā)布了:

  C++源代碼:真正的Tensorflow核心,實(shí)現(xiàn)了具體的高級(jí)和低級(jí)操作。

  Python綁定和Python庫(kù):這個(gè)綁定是由C++實(shí)現(xiàn)自動(dòng)生成的,這樣我們可以使用Python來(lái)調(diào)用C++函數(shù)。此外,這個(gè)庫(kù)將調(diào)用融合到了綁定中,以便定義更高級(jí)別的API。

  Java綁定。

  Go綁定。

  作為一個(gè)Go開發(fā)者而不是一個(gè)Java愛好者,我開始關(guān)注Go綁定,以便了解他們創(chuàng)建了什么樣的任務(wù)。

  Go綁定

  

  地鼠與Tensorflow的徽標(biāo)

  首先要注意的是,Go API缺少對(duì)Variable的支持:該API旨在使用已經(jīng)訓(xùn)練過(guò)的模型,而不是從頭開始訓(xùn)練模型。安裝Tensorflow for Go的時(shí)候已經(jīng)明確說(shuō)明了:

  TensorFlow提供了可用于Go程序的API。這些API特別適合于加載用Python創(chuàng)建并需要在Go程序中執(zhí)行的模型。

  如果我們對(duì)培訓(xùn)ML模型不感興趣,萬(wàn)歲!相反,如果你對(duì)培訓(xùn)模型感興趣,那就有一個(gè)建議:

  作為一個(gè)真正的Go開發(fā)者,保持簡(jiǎn)單!使用Python定義并訓(xùn)練模型;你可以隨時(shí)使用Go來(lái)加載并使用訓(xùn)練過(guò)的模型!

  簡(jiǎn)而言之,go綁定可用于導(dǎo)入和定義常量圖;在這種情況下,常量指的是沒(méi)有經(jīng)過(guò)訓(xùn)練的過(guò)程,因此沒(méi)有可訓(xùn)練的變量。

  現(xiàn)在,開始用Go來(lái)深入學(xué)習(xí)Tensorflow吧:讓我們來(lái)創(chuàng)建第一個(gè)應(yīng)用程序。

  在下文中,我假設(shè)讀者已經(jīng)準(zhǔn)備好Go環(huán)境,并按照README(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/go/README.md)中的說(shuō)明編譯并安裝了Tensorflow綁定。

  理解Tensorflow結(jié)構(gòu)

  讓我們來(lái)重復(fù)一下什么是Tensorflow:

  TensorFlow?是一款使用數(shù)據(jù)流圖進(jìn)行數(shù)值計(jì)算的開源軟件庫(kù)。圖中的節(jié)點(diǎn)表示數(shù)學(xué)運(yùn)算,而圖的邊表示在節(jié)點(diǎn)之間傳遞的多維數(shù)據(jù)數(shù)組(張量)。

  我們可以把Tensorflow視為一種描述性語(yǔ)言,這有點(diǎn)像SQL,你可以在其中描述你想要的內(nèi)容,并讓底層引擎(數(shù)據(jù)庫(kù))解析你的查詢、檢查句法和語(yǔ)義錯(cuò)誤、將其轉(zhuǎn)換為內(nèi)部表示形式、進(jìn)行優(yōu)化并計(jì)算出結(jié)果:所有這一切都會(huì)給你正確的結(jié)果。

  因此,當(dāng)我們使用任何一個(gè)API時(shí),我們真正做的是描述一個(gè)圖:當(dāng)我們把圖放到Session中并顯式地在Session中運(yùn)行圖時(shí),圖的計(jì)算就開始了。

  知道了這一點(diǎn)之后,讓我們?cè)囍鴣?lái)定義一個(gè)計(jì)算圖并在一個(gè)Session中進(jìn)行計(jì)算吧。API文檔(https://godoc.org/github.com/tensorflow/tensorflow/tensorflow/go)為我們提供了(簡(jiǎn)寫為)和包中所有方法的列表。

  我們可以看到,這兩個(gè)包包含了我們需要定義和計(jì)算圖形的所有內(nèi)容。

  前者包含了構(gòu)建一個(gè)基本的“空”結(jié)構(gòu)(就像Graph本身)的功能,后者是包含由C++實(shí)現(xiàn)自動(dòng)生成綁定的最重要的包。

  然而,假設(shè)我們要計(jì)算A與x的矩陣乘法,其中

  以Go綁定實(shí)例理解TensorFlow

  我假設(shè)讀者已經(jīng)熟悉了tensorflow圖定義的基本思想,并且知道占位符是什么以及它們?nèi)绾喂ぷ鳌O旅娴拇a是對(duì)Tensorflow Python綁定的第一次嘗試。我們來(lái)調(diào)用這個(gè)文件attempt1.go

  以Go綁定實(shí)例理解TensorFlow

  代碼注釋的很詳細(xì),希望讀者能閱讀每一行注釋。

  現(xiàn)在,Tensorflow-Python用戶期望該代碼進(jìn)行編譯并正常工作。我們來(lái)看看它是否正確:

  這是他看到的結(jié)果:

  等等,這里發(fā)生了什么? 顯然,存在兩個(gè)名稱都為“Placeholder”的操作。

  第一節(jié)課:節(jié)點(diǎn)ID

  每當(dāng)我們調(diào)用一個(gè)方法來(lái)定義一個(gè)操作時(shí),Python API都會(huì)生成不同的節(jié)點(diǎn),無(wú)論是否已經(jīng)被調(diào)用過(guò)。下面的代碼返回3。

  以Go綁定實(shí)例理解TensorFlow

  我們可以通過(guò)打印占位符的名稱來(lái)驗(yàn)證此程序是否創(chuàng)建了兩個(gè)不同的節(jié)點(diǎn):print(a.name,b.name)生成Placeholder:0 Placeholder_1:0,因此,b占位符是Placeholder_1:0,而a占位符是Placeholder:0。

  在Go中,相反,之前的程序會(huì)執(zhí)行失敗,因?yàn)锳和x都命名為Placeholder。我們可以得出這樣的結(jié)論:

  Go API不會(huì)在每次調(diào)用函數(shù)來(lái)定義操作的時(shí)候自動(dòng)生成新的名字:操作的名字是固定的,我們無(wú)法修改。

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?