国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站建設(shè)公司價(jià)seo營銷軟件

網(wǎng)站建設(shè)公司價(jià),seo營銷軟件,濟(jì)寧專業(yè)建網(wǎng)站,有哪些做相冊(cè)視頻剪輯的網(wǎng)站原文:What’s New in TensorFlow 2.0 協(xié)議:CC BY-NC-SA 4.0 譯者:飛龍 本文來自【ApacheCN 深度學(xué)習(xí) 譯文集】,采用譯后編輯(MTPE)流程來盡可能提升效率。 不要擔(dān)心自己的形象,只關(guān)心如何實(shí)現(xiàn)目…

原文:What’s New in TensorFlow 2.0

協(xié)議:CC BY-NC-SA 4.0

譯者:飛龍

本文來自【ApacheCN 深度學(xué)習(xí) 譯文集】,采用譯后編輯(MTPE)流程來盡可能提升效率。

不要擔(dān)心自己的形象,只關(guān)心如何實(shí)現(xiàn)目標(biāo)。——《原則》,生活原則 2.3.c

第 3 部分:TensorFlow 2.0 - 模型推斷和部署以及 AIY

如果您使用過 TensorFlow 1.x,則本部分將重點(diǎn)介紹遷移到 TensorFlow 2.0 所需的總體概念更改。 它還將教您使用 TensorFlow 可以進(jìn)行的各種 AIY 項(xiàng)目。 最后,本節(jié)向您展示如何將 TensorFlow Lite 與跨多個(gè)平臺(tái)的低功耗設(shè)備一起使用。

本節(jié)包含以下章節(jié):

  • 第 5 章,“模型推理管道 – 多平臺(tái)部署”
  • 第 6 章,“AIY 項(xiàng)目和 TensorFlow Lite”

五、模型推理管道 - 多平臺(tái)部署

訓(xùn)練完模型后您會(huì)怎么做? 用它? 如果答案是肯定的,那么您將如何使用它? 您正在尋找的答案是推理。 簡而言之,推理過程是確保機(jī)器學(xué)習(xí)模型可用于滿足實(shí)際用戶需求的基礎(chǔ)。 正式地說,推理是有效地計(jì)算經(jīng)過訓(xùn)練的機(jī)器學(xué)習(xí)模型以滿足用戶需求的過程。 可以在各種硬件類型上進(jìn)行推斷,包括服務(wù)器以及最終用戶設(shè)備(例如電話和 Web 瀏覽器)。 根據(jù)用戶要求,它也可以在不同的操作系統(tǒng)上執(zhí)行。

前幾章重點(diǎn)介紹了如何…

技術(shù)要求

為了運(yùn)行本章中給出的代碼摘錄,您將需要以下硬件和軟件:

  • TensorFlow 2.0TF 2.0)或更高版本(CPU 或 GPU 版本都足夠)
  • Python 3.4+(當(dāng)前,TensorFlow 支持的最高 Python 版本是 3.6)
  • NumPy(如果不是由 TensorFlow 自動(dòng)安裝)
  • Docker(請(qǐng)參閱第 1 章和 “TensorFlow 2.0 入門”,有關(guān)如何安裝 Docker 的詳細(xì)信息)
  • curl
  • 具有命令行界面的 Linux 計(jì)算機(jī)

本章中的每個(gè) Python 代碼段均假定已安裝 TF 2.0,并且已將其導(dǎo)入到名稱空間中。 這意味著在執(zhí)行任何代碼塊之前,請(qǐng)先輸入以下行:

import tensorflow as tf

可在這個(gè)頁面中獲得本章的代碼文件。

機(jī)器學(xué)習(xí)工作流程 - 推理階段

機(jī)器學(xué)習(xí)應(yīng)用的最常見子集之一遵循構(gòu)建一次,并多次使用范式。 這種類型的應(yīng)用涉及所謂的推理階段。 在推斷階段,開發(fā)人員必須專注于運(yùn)行模型以滿足用戶需求。 滿足用戶需求可能涉及從用戶那里接受輸入并對(duì)其進(jìn)行處理以返回適當(dāng)?shù)妮敵觥?下圖描述了典型的高級(jí)機(jī)器學(xué)習(xí)應(yīng)用工作流程:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-CvP0nnKr-1681704017943)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/4dba2f20-e39c-4cce-98ba-9f2d018a4f3e.png)]

從上圖,我們可以看到推理過程如何適應(yīng)整體情況。 在隨后的應(yīng)用中…

從推理的角度理解模型

實(shí)現(xiàn)基于機(jī)器學(xué)習(xí)的應(yīng)用的開發(fā)人員可以依靠的一件事是使生活變得輕松,無論所服務(wù)模型中的實(shí)際計(jì)算如何,向用戶提供模型的過程或多或少都是相同的。 這意味著,如果實(shí)現(xiàn)正確,工程師可能不必在每次數(shù)據(jù)科學(xué)家更新模型時(shí)都重新構(gòu)建部署管道。 這可以通過利用抽象的力量來實(shí)現(xiàn)。 這里的一個(gè)關(guān)鍵抽象是模型存儲(chǔ)和加載的格式。 通過引入標(biāo)準(zhǔn)化格式,TF 2.0 使得在一個(gè)環(huán)境中訓(xùn)練模型然后在各個(gè)平臺(tái)上使用它變得容易。 在 TF 2.0 中,執(zhí)行此操作的標(biāo)準(zhǔn)方法是通過SavedModel格式。 這種標(biāo)準(zhǔn)化格式類似于軟件開發(fā)管道中的構(gòu)建工件。 讀者可以將模型工件視為快照,可用于重新創(chuàng)建模型而無需訪問創(chuàng)建模型的實(shí)際代碼。

實(shí)際上,在推理時(shí),模型被簡化為一個(gè)黑盒子,它具有一組預(yù)定義的輸入和輸出以及一個(gè)與底層模型進(jìn)行交互的統(tǒng)一接口。 開發(fā)人員現(xiàn)在要做的就是建立在給定環(huán)境中實(shí)現(xiàn)和執(zhí)行黑匣子所需的基礎(chǔ)結(jié)構(gòu)。 在以下各節(jié)中,我們將學(xué)習(xí)如何構(gòu)建管道以服務(wù)于各種流行的軟件和硬件環(huán)境中的模型。

模型工件 – SavedModel 格式

SavedModel格式是 TensorFlow 使用的默認(rèn)模型序列化和反序列化格式。 用外行的術(shù)語來說,這可以理解為一個(gè)容器,它容納了在不訪問創(chuàng)建模型的原始代碼的情況下從頭開始重現(xiàn)模型的所有內(nèi)容。 我們可以使用SavedModel將訓(xùn)練后的模型從訓(xùn)練階段轉(zhuǎn)移到推理階段,甚至在訓(xùn)練過程的不同部分之間轉(zhuǎn)移狀態(tài)。 簡而言之,可以說SavedModel包含完整的 TensorFlow 程序以及模型權(quán)重和所描述的各種計(jì)算操作的描述。 使用 TF 2.0 的 Python API 時(shí),現(xiàn)在可以導(dǎo)出某些本機(jī)…

了解核心數(shù)據(jù)流模型

在我們研究SavedModel格式的細(xì)微差別之前,重要的是要首先了解 TensorFlow 模型的真正含義。 對(duì)于初學(xué)者,TensorFlow 實(shí)現(xiàn)數(shù)據(jù)流編程范例。 在這種范式下,程序被建模為在不同計(jì)算操作之間流動(dòng)的數(shù)據(jù)的有向圖。 這意味著每個(gè)節(jié)點(diǎn)代表一個(gè)操作(或計(jì)算),邊代表數(shù)據(jù)。 輸入邊緣將代表該節(jié)點(diǎn)的輸入,而輸出邊緣將對(duì)應(yīng)于計(jì)算節(jié)點(diǎn)產(chǎn)生的輸出。 為了說明這個(gè)想法,讓我們看一下tf.add()操作的(粗略)數(shù)據(jù)流表示形式。 如下圖所示,輸入邊對(duì)應(yīng)于 x 和 y 的輸入。 輸出邊緣z(x + y)對(duì)應(yīng)于節(jié)點(diǎn)的輸出,在這種特定情況下,該輸出恰好是輸入的總和:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-C9eLDsaC-1681704017944)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/2e09fd48-ab43-4546-8eab-1df5c1dae380.png)]

使用數(shù)據(jù)流范例可以使 TensorFlow 在執(zhí)行用戶代碼時(shí)利用某些好處:

  • 并行性:將模型表示為有向圖可以使 TensorFlow 識(shí)別哪些操作相互依賴,哪些不依賴。 這樣,可以并行執(zhí)行獨(dú)立的操作,從而加快基礎(chǔ)計(jì)算圖的執(zhí)行速度。
  • 分布式執(zhí)行:并行性的一個(gè)相關(guān)好處是,并行執(zhí)行可以在同一臺(tái)物理計(jì)算機(jī)上執(zhí)行,也可以在另一臺(tái)物理計(jì)算機(jī)上完成。 TensorFlow 還負(fù)責(zé)這些節(jié)點(diǎn)之間的通信。
  • 編譯:TensorFlow 的 XLA 編譯器旨在利用數(shù)據(jù)流圖中的信息,通過一系列優(yōu)化來生成更快的代碼。
  • 可移植性:數(shù)據(jù)流圖是模型中代碼的語言無關(guān)表示形式。 這使得可以在 Python 中構(gòu)建數(shù)據(jù)流圖并以較低級(jí)別的語言(例如 C 或 Java)將其還原以進(jìn)行低延遲推理。

我們已經(jīng)看到了如何使用數(shù)據(jù)流范例來表示一個(gè)簡單的操作。 實(shí)際的 TensorFlow 程序或模型將由許多這樣的簡單操作組成。 這意味著此類程序的數(shù)據(jù)流表示形式將由許多此類簡單表示形式組成,每個(gè)操作通常具有一個(gè)或多個(gè)節(jié)點(diǎn)。 SavedModel格式可以理解為該基礎(chǔ)數(shù)據(jù)流圖的序列化。 這里有趣地提到了諸如 Keras 和 Estimators 之類的高級(jí) API 的角色。 實(shí)際上,他們從用戶那里抽象出了該數(shù)據(jù)流圖的細(xì)節(jié),以至于用戶甚至不必考慮它。 它們?yōu)橛脩籼峁┝艘唤M高級(jí)操作,以供實(shí)現(xiàn),然后將其轉(zhuǎn)換為 TensorFlow 可以執(zhí)行的數(shù)據(jù)流圖。 這意味著,最終,在 TensorFlow 中創(chuàng)建的任何模型,無論其創(chuàng)建方式如何,都將轉(zhuǎn)換為統(tǒng)一的計(jì)算圖。 這樣就可以使用一個(gè)統(tǒng)一的格式保存和加載所有模型。

tf.function API

正如我們?cè)诘?1 章中看到的那樣,第 2 章“TensorFlow 2.0 入門”, “Keras 默認(rèn)集成和急切執(zhí)行”,默認(rèn)情況下啟用急切執(zhí)行是 TF 2.0 中引入的主要更改之一。 第 1 章和 “TensorFlow 2.0 入門”還簡要提到了 TF 2.0 與 Python 編程語言更緊密地結(jié)合在一起。 此更改的核心是低級(jí)tf.function API。 實(shí)際上,這是通過使用戶能夠從 Python 函數(shù)創(chuàng)建 TensorFlow 圖而將 TensorFlow 1.x 的功能與急切執(zhí)行的優(yōu)點(diǎn)相結(jié)合。 它既可以用作可調(diào)用函數(shù),也可以用作裝飾器。 在本節(jié)中,我們將簡要介紹一下如何在每個(gè)人中使用它。

tf.autograph函數(shù)

到目前為止,我們已經(jīng)看到了如何從 Python 函數(shù)創(chuàng)建 TensorFlow 圖的代碼。 TF 2.0 將 Python-TensorFlow 耦合提升到了一個(gè)全新的水平。 新引入的 AutoGraph(tf.autograph)函數(shù)使用戶可以使用本機(jī) Python 語法編寫圖的代碼。

當(dāng)前,此功能僅支持 Python 語法的有限子集。 這個(gè)頁面中提供了當(dāng)前支持的語法元素的詳細(xì)列表。

這樣做的主要優(yōu)點(diǎn)是,它使開發(fā)人員可以編寫直觀的 Python 代碼來完成特定任務(wù),然后自動(dòng)將其轉(zhuǎn)換為高性能的 TensorFlow 圖代碼。 這意味著開發(fā)人員可以以直觀的 Python 形式描述基本的編程語言結(jié)構(gòu)(例如循環(huán)和條件),而不是 TensorFlow 等效形式,并且具有可比的性能。

在 TF 2.0 中,調(diào)用tf.function時(shí)會(huì)自動(dòng)調(diào)用 AutoGraph。 用戶不需要單獨(dú)調(diào)用它。 tf.autograph模塊包含低級(jí)模塊。 初學(xué)者或中級(jí)用戶幾乎不必直接使用它們,現(xiàn)在可以安全地忽略詳細(xì)信息。

讓我們看看執(zhí)行此操作的示例。 考慮一個(gè)計(jì)算給定張量中所有值之和的函數(shù)。 讓我們完全使用 Pythonic 語法實(shí)現(xiàn)它,然后使用tf.function將其轉(zhuǎn)換為本地 TensorFlow 計(jì)算圖代碼:

@tf.function
def sum_of_cubes(numbers):_sum = 0for number in numbers:_sum += number ** 3return _sum

為了測試到目前為止已經(jīng)編寫的代碼,讓我們創(chuàng)建一個(gè)介于 1 到 5 之間(包括兩端)的整數(shù)張量。 然后,將它們傳遞給我們的函數(shù):

input_values = tf.constant([1, 2, 3, 4, 5])
result = sum_of_cubes(input_values)
print(type(result))
print(result)

這將導(dǎo)致以下輸出:

<class 'tensorflow.python.framework.ops.EagerTensor'>
tf.Tensor(225, shape=(), dtype=int32)

正如我們?cè)谔崛〉妮敵鲋锌吹降哪菢?#xff0c;我們已經(jīng)編寫的純 Python 函數(shù)現(xiàn)在被轉(zhuǎn)換為 TensorFlow 圖。 函數(shù)現(xiàn)在返回張量而不是單個(gè)數(shù)字的事實(shí)證明了這一點(diǎn)。 輸出值與預(yù)期值相同。 有效地,我們已經(jīng)證明了特定于 Python 的語法結(jié)構(gòu)(例如for循環(huán)和冪運(yùn)算符)已成功轉(zhuǎn)換為 TensorFlow 圖的代碼。 這是tf.function和 AutoGraph 的真正功能。 由于我們現(xiàn)在已經(jīng)有效地將本機(jī) Python 代碼轉(zhuǎn)換為 TensorFlow 計(jì)算圖,因此可以使用SavedModel格式在環(huán)境之間共享此圖。

導(dǎo)出自己的 SavedModel 模型

如前所述,SavedModel格式用于生成當(dāng)前計(jì)算圖(數(shù)據(jù)流圖)的可再現(xiàn)表示。 此表示獨(dú)立于用于創(chuàng)建計(jì)算圖的特定代碼。 它也獨(dú)立于用于構(gòu)造該圖的特定過程。 例如,SavedModel格式?jīng)]有積極地區(qū)分使用本機(jī) TensorFlow 操作,Keras 甚至tf.function創(chuàng)建的計(jì)算圖。 盡管我們可以互換地將此計(jì)算圖稱為模型,但從技術(shù)上講,它也可以被認(rèn)為是訓(xùn)練有素的數(shù)學(xué)模型和圍繞它編寫的一些其他代碼的組合,以執(zhí)行支持…

使用tf.function API

如前所述,tf.function API 使我們能夠使用簡單的 Python 編寫 TensorFlow 圖和模型。 讓我們從構(gòu)建一個(gè)簡單模型開始,該模型接受一個(gè)數(shù)字或一個(gè)數(shù)字列表并返回列表中值的平方。 然后,我們將由此創(chuàng)建的模型導(dǎo)出為SavedModel格式。 這是本章以下大部分內(nèi)容的重要步驟。 我們將幾乎在所有地方都使用SavedModel工件。

首先,讓我們首先編寫一個(gè)簡單的 Python 函數(shù)來計(jì)算平方。 然后,我們可以從那里向后退:

def compute_square(number):return number ** 2

如我們所見,前面的 Python 方法接受一個(gè)數(shù)字作為輸入并返回其平方。 我們的最終目標(biāo)是構(gòu)建用于執(zhí)行此計(jì)算的 TensorFlow 圖。 利用我們從前面的部分中學(xué)到的知識(shí),我們知道一種實(shí)現(xiàn)方法是使用tf.function。 我們選擇使用tf.function的裝飾器形式。 如果仔細(xì)觀察我們剛剛編寫的代碼段,您將意識(shí)到我們假設(shè)傳遞給number變量的值是一個(gè)數(shù)值。 在現(xiàn)實(shí)世界中,情況未必一定如此。 為了解決這個(gè)問題,我們可以在裝飾器中指定此方法可以接受的值的類型。 這是通過在裝飾器中固定輸入簽名來完成的。 我們將其固定為包含 32 位浮點(diǎn)數(shù)的一維張量。 任何不符合此標(biāo)準(zhǔn)的輸入將被自動(dòng)丟棄。 我們修改后的代碼片段(帶有實(shí)現(xiàn)錯(cuò)誤檢查的功能)現(xiàn)在看起來像這樣:

@tf.function(input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
def compute_square(number):return number ** 2

到目前為止,我們已經(jīng)成功實(shí)現(xiàn)了一個(gè) TensorFlow 計(jì)算圖,該圖可以計(jì)算給定一維張量的平方。 現(xiàn)在唯一要做的就是以SavedModel格式將此圖導(dǎo)出到磁盤。 您可能還記得,tf.saved_model模塊中提供了用于SavedModel的 API。 在閱讀該模塊的文檔時(shí),我們發(fā)現(xiàn)save方法可能會(huì)對(duì)我們有所幫助。 一個(gè)粗糙的邊緣是tf.saved_model.save方法僅適用于Trackable類型的對(duì)象,而我們所擁有的是tf.function()對(duì)象(屬于Trackable類型或其子類)。 為了克服這個(gè)問題,我們只需將代碼包裝在實(shí)現(xiàn)Trackable接口的類中:

class Square(tf.Module):@tf.function(input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])def compute_square(self, number):return number ** 2?

現(xiàn)在,我們將邏輯封裝在[H??TG0]方法支持的表示形式中。 最后,我們創(chuàng)建一個(gè)Square類的對(duì)象(繼承自Trackable)并將其傳遞給save方法:

sos = Square()
tf.saved_model.save(sos, './square/1')

現(xiàn)在,您將看到模型已成功導(dǎo)出到./square/1目錄。 可以通過列出前面目錄的內(nèi)容來驗(yàn)證。 打開終端并輸入以下內(nèi)容:

cd <directory-containing-your-code>
ls -ax ./square/1

您將看到如下內(nèi)容:

.  ..  assets  saved_model.pb  variables 

在接下來的分析SavedModel工件的部分中,我們將研究這些文件中的每個(gè)文件所包含的內(nèi)容以及它們?cè)诒4婺P偷倪^程中所起的作用。

分析 SavedModel 工件

在本小節(jié)中,我們將詳細(xì)研究SavedModel如何序列化和反序列化 TensorFlow 圖。 我們還將看看SavedModel命令行界面,這是一個(gè)功能強(qiáng)大的工具,可以分析磁盤上SavedModel的內(nèi)容,甚至可以在本地運(yùn)行SavedModel

SavedModel格式本質(zhì)上描述了一種在磁盤上存儲(chǔ) TensorFlow 圖的方法。 在較低的級(jí)別上,其工作的一部分是編纂一種用于在文件中表示該圖的格式。 按照這種格式,每個(gè)圖都使用組成的底層函數(shù)及其狀態(tài)的組合表示。 用 TensorFlow 的話來說,這些組成函數(shù)用名稱標(biāo)識(shí),并稱為簽名或命名簽名。 這些…

SavedModel 命令行界面

SavedModel 命令行界面CLI)是非常方便的工具,可用于分析各種SavedModel實(shí)例并運(yùn)行它們。 它在調(diào)試磁盤上的模型時(shí)非常有用,并且可以在不讀取,編寫或修改任何代碼的情況下使用。 在本節(jié)中,我們將簡要介紹如何安裝此工具,使用它分析圖的不同組件并運(yùn)行計(jì)算圖。

該工具與 TensorFlow 二進(jìn)制文件捆綁在一起。 如果您通過從源代碼構(gòu)建 TensorFlow 來安裝它,則必須單獨(dú)安裝它。 有關(guān)安裝說明,請(qǐng)參見這里。

這里值得簡要討論的兩個(gè)命令是showrun。 前者可用于列出 MetaGraph 信息,而后者可用于通過命令行在一組輸入上執(zhí)行圖。 通過使用-h參數(shù)運(yùn)行工具,可以在每個(gè)步驟中獲取詳細(xì)說明:

saved_model_cli -h

可以通過在命令名稱后調(diào)用-h參數(shù)來獲取特定命令的說明。 例如,如果您想要有關(guān)run命令的詳細(xì)說明,請(qǐng)鍵入以下內(nèi)容:

saved_model_cli run -h

為了親身體驗(yàn)此工具,讓我們回到在tf.function API 的較早部分中構(gòu)建和訓(xùn)練的模型。 您可能還記得,模型接受任何維數(shù)的張量,并返回包含原始元素平方的相同形狀的張量。 首先讓我們看一下模型中存在的元圖數(shù)量。 為此,請(qǐng)?jiān)凇敖K端”窗口中鍵入以下內(nèi)容:

saved_model_cli show --dir <path-to-model-dir>

對(duì)于我們計(jì)算平方的模型,您應(yīng)該看到以下內(nèi)容:

The given SavedModel contains the following tag-sets:
serve

如前所述,使用標(biāo)記集來標(biāo)識(shí)元圖。 在這里,我們可以看到只有一個(gè)名為serve的標(biāo)簽集。 我們可能還想看一下構(gòu)成該元圖的組成函數(shù)。 要查看構(gòu)成此標(biāo)簽集的SignatureDefs(有關(guān)詳細(xì)信息,請(qǐng)參閱 這里,您可以鍵入以下命令:

saved_model_cli show \--dir <path-to-model-dir> \--tag_set serve

對(duì)于我們計(jì)算平方的模型,您應(yīng)該看到以下內(nèi)容:

The given SavedModel MetaGraphDef contains SignatureDefs with the following keys:
SignatureDef key: "__saved_model_init_op"
SignatureDef key: "serving_default"

現(xiàn)在,讓我們看看如何使用run函數(shù)與直接使用命令行通過SavedModel保存的 TensorFlow 計(jì)算圖進(jìn)行交互,而無需編寫任何代碼。 從上一階段的輸出中可以看到,有兩個(gè)組件函數(shù)。 其中,我們選擇使用serving_default SignatureDef。 現(xiàn)在,我們可以通過提供所需的輸入并獲得所需的結(jié)果,通過命令行運(yùn)行它。 為此,我們需要將路徑傳遞給模型,標(biāo)簽集,輸入值以及要運(yùn)行的組件的名稱。 為了該測試的目的,我們要計(jì)算的張量由[1, 2 , 3]給出。 確切的命令如下:

saved_model_cli run \--dir <path-to-model> \--tag_set serve \--input_exprs "number"="[1, 2, 3]" \--signature_def serving_default

以下是輸出:

Result for output key output_0:
[1\. 4\. 9.]

從上一階段的輸出中,我們可以觀察到以下內(nèi)容:

  • 輸出張量與輸入張量具有相同的形狀
  • 輸出張量中的值對(duì)應(yīng)于我們輸入張量中的值的平方

這些觀察結(jié)果都確認(rèn)SavedModel工作正常。

在隨后的部分中,我們將探討在各種硬件和軟件環(huán)境中服務(wù)于此模型的方法。

后端服務(wù)器上的推理

在當(dāng)今世界,分布式系統(tǒng)無處不在。 從我們?yōu)g覽的網(wǎng)站到我們?cè)谑謾C(jī)上使用的應(yīng)用范圍,當(dāng)我們不使用分布式系統(tǒng)時(shí)幾乎沒有一天。 鑒于這種無所不在的性質(zhì),將這種范例用于構(gòu)建機(jī)器學(xué)習(xí)系統(tǒng)顯然是一個(gè)選擇。 構(gòu)建分布式系統(tǒng)的典型模式是在后端服務(wù)器上執(zhí)行資源密集型(和數(shù)據(jù)敏感型)計(jì)算,同時(shí)將較輕(且相對(duì)獨(dú)立)的計(jì)算任務(wù)推向用戶設(shè)備。 機(jī)器學(xué)習(xí)應(yīng)用的很大一部分屬于資源密集型類別。 此外,機(jī)器學(xué)習(xí)模型是使用數(shù)據(jù)構(gòu)建的。 在現(xiàn)實(shí)世界中的很大一部分…

TensorFlow 服務(wù)

TensorFlow 服務(wù)TensorFlow 擴(kuò)展TFX)平臺(tái)的組成部分。 顧名思義,它旨在用于服務(wù)于機(jī)器學(xué)習(xí)模型。 簡而言之,它是專為生產(chǎn)環(huán)境設(shè)計(jì)的高性能服務(wù)系統(tǒng)。 TensorFlow 服務(wù)的一個(gè)重要特征是它向下游用戶公開了一致的 API,而與所服務(wù)模型的實(shí)際內(nèi)容無關(guān)。 這使得快速進(jìn)行實(shí)驗(yàn)和重新部署變得容易,而無需對(duì)其余軟件棧進(jìn)行任何其他更改。 它附帶對(duì) TensorFlow 模型的內(nèi)置支持,并且可以擴(kuò)展為服務(wù)于其他類型的模型。

在本節(jié)中,我們將詳細(xì)介紹 TensorFlow 服務(wù)。 從基本的安裝和設(shè)置開始,以下小節(jié)通過一系列動(dòng)手示例描述如何設(shè)置服務(wù)器來為SavedModel服務(wù)。 我們還將簡要介紹 TensorFlow 服務(wù)提供的一些關(guān)鍵 API。

設(shè)置 TensorFlow 服務(wù)

與 TensorFlow 平臺(tái)的大多數(shù)其他組件一樣,TensorFlow 服務(wù)也可以通過多種方式安裝。 這里推薦通過 Docker 鏡像使用它,因?yàn)樗鄬?duì)簡單。

如果容器鏡像對(duì)您不起作用,請(qǐng)?jiān)谶@個(gè)頁面上獲取其他安裝 TensorFlow 服務(wù)方法的摘要。

使用 Docker 設(shè)置 TensorFlow 服務(wù)涉及一個(gè)簡單的步驟。 但是,此步驟需要將 Docker 安裝在主機(jī)上。 有關(guān)設(shè)置 Docker 的說明,請(qǐng)參閱第 1 章, “TensorFlow 2.0 入門”或本章的“技術(shù)要求”部分。 您需要做的就是拉相關(guān)的 Docker 鏡像以…

設(shè)置并運(yùn)行推理服務(wù)器

現(xiàn)在我們已經(jīng)設(shè)置了 TensorFlow 服務(wù),讓我們使用它來執(zhí)行一些實(shí)際任務(wù)。 我們可以看看如何設(shè)置后端服務(wù)器以服務(wù)于前面幾節(jié)中構(gòu)建的SavedModel格式。 我們可以使用上一節(jié)中下載的 Docker 鏡像來運(yùn)行SavedModel格式。 為此,我們需要做兩件事:

  • 將本地主機(jī)上包含模型的位置綁定到容器內(nèi)的目錄(/models/<your-model_name>
  • 綁定網(wǎng)絡(luò)端口 TensorFlow 服務(wù)正在監(jiān)聽主機(jī)上的網(wǎng)絡(luò)端口

該命令的一般形式如下:

docker run -t --rm \-p <port-on-host>:8501 \-v <path-to-model-on-host>:/models/<model_name> \-e MODEL_NAME=<model_name> \tensorflow/serving&

現(xiàn)在,模型服務(wù)器應(yīng)該在您的主機(jī)上<port-on-host>中指定的端口上運(yùn)行。

現(xiàn)在讓我們通過發(fā)送一些推斷數(shù)據(jù)來測試我們的模型。 我們可以通過 RESTful API 與模型進(jìn)行交互。 我們應(yīng)該將帶有輸入值的 HTTP POST請(qǐng)求發(fā)送到服務(wù)器。 為此,請(qǐng)?jiān)凇敖K端”窗口中鍵入以下命令:

curl -X POST \http://localhost:<port-on-host>/v1/models/square:predict \-H 'Content-Type: application/json' \-d '{"instances": [1.0, 2.0, 3.0, 4.0]}'

您應(yīng)該看到以下輸出:

{"predictions": [1.0, 4.0, 9.0, 16.0]
}

現(xiàn)在我們已經(jīng)看到了如何使用 TensorFlow 服務(wù)在后端服務(wù)器上提供SavedModel。 可通過 gRPC 和 RESTful API 訪問此模型。 有關(guān)這些的詳細(xì)信息,請(qǐng)參見以下鏈接:

  • https://www.tensorflow.org/tfx/serving/api_rest
  • https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/prediction_service.proto

請(qǐng)記住,每次調(diào)用docker run時(shí),主機(jī)上都會(huì)啟動(dòng)一個(gè)新的 Docker 容器。 即使您已停止與該容器進(jìn)行交互甚至關(guān)閉了“終端”窗口,該容器也可能會(huì)在后臺(tái)繼續(xù)刷新并運(yùn)行。 這會(huì)導(dǎo)致大量的隱藏內(nèi)存消耗。 需要有意識(shí)地停止容器。 為此,請(qǐng)執(zhí)行以下步驟:

找出剛啟動(dòng)的容器的名稱或 ID。 在“終端”窗口中鍵入以下內(nèi)容:

docker ps

如您在前面的命令的輸出中看到的,每個(gè)容器都有一個(gè)名稱和 ID。 這些中的任何一個(gè)都可以用來唯一地標(biāo)識(shí)容器。 我們需要使用它來停止我們啟動(dòng)的容器。 可以按照以下步驟進(jìn)行:

docker stop <container-name>

您還可以使用以下內(nèi)容:

docker stop <container-id>

現(xiàn)在,您可以放心,容器已停止并且沒有占用計(jì)算機(jī)的任何內(nèi)存。

當(dāng) TensorFlow.js 與 Node.js 相遇時(shí)

TensorFlow.js 的引入使在 JavaScript 環(huán)境中運(yùn)行 TensorFlow 模型成為可能。 您可能已經(jīng)知道,Node.js 是一個(gè)跨平臺(tái)的運(yùn)行時(shí)環(huán)境,可以在瀏覽器外部執(zhí)行 JavaScript 代碼。 這樣就可以使用 JavaScript 代碼編寫后端服務(wù)。 將 Node.js 與 TensorFlow.js 集成在一起,就可以從 JavaScript 環(huán)境在后端服務(wù)器上提供機(jī)器學(xué)習(xí)服務(wù)。 請(qǐng)參閱這個(gè)頁面上有關(guān)如何執(zhí)行此操作的文檔。

瀏覽器中的推斷

您可能還記得,在前面的部分中,我們簡要討論了分布式系統(tǒng)。 在那里,我們討論了主要在主機(jī)服務(wù)器上執(zhí)行基于機(jī)器學(xué)習(xí)的計(jì)算的場景。 在這里,我們將研究在瀏覽器中在用戶端執(zhí)行這些計(jì)算的場景。 這樣做的兩個(gè)重要優(yōu)點(diǎn)如下:

  • 計(jì)算被推送到用戶端。 主機(jī)不必?fù)?dān)心為執(zhí)行計(jì)算而管理服務(wù)器。
  • 將模型推送到用戶端意味著不必將用戶數(shù)據(jù)發(fā)送到主機(jī)。 對(duì)于使用敏感或私有用戶數(shù)據(jù)的應(yīng)用來說,這是一個(gè)巨大的優(yōu)勢。 因此,瀏覽器中的推理成為對(duì)隱私至關(guān)重要的機(jī)器學(xué)習(xí)應(yīng)用的絕佳選擇:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-rhsf8SIv-1681704017944)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/ed83cc9d-b1bb-4e26-b251-f69247244b1b.png)]

上圖中描述的工作流說明了從頭構(gòu)建模型然后允許最終用戶在其 Web 瀏覽器中運(yùn)行它的端到端管道。 我們看到該過程分為兩個(gè)主要階段:訓(xùn)練和推理。 在訓(xùn)練階段,數(shù)據(jù)科學(xué)家和其他機(jī)器學(xué)習(xí)從業(yè)者聚在一起,建立和訓(xùn)練模型。 現(xiàn)在,該模型以SavedModel格式導(dǎo)出。 但是,TensorFlow.js 尚不直接支持SavedModel格式。 因此,有必要將模型轉(zhuǎn)換為 TensorFlow.js 支持的格式。

有關(guān)如何執(zhí)行轉(zhuǎn)換的詳細(xì)信息,請(qǐng)參見這里。

現(xiàn)在,通過任何其他 JavaScript 代碼,都可以通過 Web 服務(wù)器將轉(zhuǎn)換后的模型提供給用戶。 用戶為模型提供必要的輸入。 TensorFlow.js 模型在用戶瀏覽器中處理這些輸入并返回適當(dāng)?shù)妮敵觥?/p>

Detailed resources for getting started with TensorFlow.js are available at the following links:

  • https://www.tensorflow.org/js/guide
  • https://www.tensorflow.org/js/tutorials
  • https://www.tensorflow.org/js/demos

移動(dòng)和物聯(lián)網(wǎng)設(shè)備上的推理

在過去幾年中,智能手機(jī)的使用呈指數(shù)增長,并且以不減緩的方式持續(xù)增長。 其他物聯(lián)網(wǎng)設(shè)備在我們的日常生活中也變得越來越普遍。 使用率的這些上升趨勢對(duì)機(jī)器學(xué)習(xí)系統(tǒng)產(chǎn)生了有趣的影響。 與普通主機(jī)相比,這些平臺(tái)通常資源有限。 結(jié)果,需要其他優(yōu)化來在此類設(shè)備上進(jìn)行推理。 TensorFlow 平臺(tái)支持構(gòu)建機(jī)器學(xué)習(xí)和基于深度學(xué)習(xí)的應(yīng)用,這些應(yīng)用可以在不同類型的邊緣設(shè)備(例如手機(jī)和其他 IoT 設(shè)備)上運(yùn)行。 實(shí)現(xiàn)此目的的主要工具是…

總結(jié)

在本章中,我們?cè)敿?xì)介紹了推理階段。 首先,通過對(duì)端到端機(jī)器學(xué)習(xí)工作流的外觀有了基本了解,我們了解了每個(gè)階段涉及的主要步驟。 我們還了解了將模型從訓(xùn)練階段轉(zhuǎn)移到推理階段時(shí)所起作用的不同抽象。 詳細(xì)了解SavedModel格式和基礎(chǔ)數(shù)據(jù)流模型,我們了解了可用于構(gòu)建和導(dǎo)出模型的不同選項(xiàng)。 我們還了解了tf.functiontf.autograph等出色功能,使我們能夠使用本地 Python 代碼構(gòu)建 TensorFlow 圖。 在本章的后半部分,我們學(xué)習(xí)了如何構(gòu)建推理管道,以便在后端服務(wù)器,Web 瀏覽器甚至邊緣設(shè)備等不同環(huán)境中運(yùn)行 TensorFlow 模型。

在下一章中,我們將了解有關(guān) AIY 項(xiàng)目和 TensorFlow Lite 的更多信息。

六、AIY 項(xiàng)目和 TensorFlow Lite

本章詳細(xì)介紹如何在低功耗嵌入式系統(tǒng)(例如邊緣設(shè)備,移動(dòng)系統(tǒng)(例如 Android,iOS 和 Raspberry Pi),Edge TPU 和 NVIDIA Jetson Nano 上部署經(jīng)過訓(xùn)練的 TensorFlow 2.0TF2.0)模型。 本章還介紹了自己動(dòng)手工具包的訓(xùn)練和部署模型,例如 Google 自己做人工智能AIY)工具包。 本章涵蓋的其他主題是如何將經(jīng)過訓(xùn)練的 TensorFlowTF)模型轉(zhuǎn)換為 TensorFlow LiteTFLite)模型,他們之間的主要區(qū)別,以及兩者的優(yōu)勢。

本章與前幾章略有不同,從某種意義上說,它只是對(duì) TF2.0 的更廣泛關(guān)注的介紹。 也就是說,硬件領(lǐng)域…

TFLite 簡介

TFLite 是一組工具,可幫助開發(fā)人員在二進(jìn)制大小較小且延遲較低的設(shè)備上運(yùn)行 TF 模型。 TFLite 由兩個(gè)主要組件組成:TFLite 解釋器(tf.lite.Interpreter)和 TFLite 轉(zhuǎn)換器(tf.lite.TFLiteConverter)。 TFLite 解釋器實(shí)際上是在低功耗設(shè)備(例如手機(jī),嵌入式 Linux 設(shè)備和微控制器)上運(yùn)行 TFLite 模型的。 另一方面,TFLite 轉(zhuǎn)換器在可用于訓(xùn)練 TF 模型的強(qiáng)大設(shè)備上運(yùn)行,并將訓(xùn)練后的 TF 模型轉(zhuǎn)換為解釋器的有效形式。

TFLite 旨在簡化在設(shè)備上執(zhí)行機(jī)器學(xué)習(xí)的過程,而無需通過網(wǎng)絡(luò)連接發(fā)送任何數(shù)據(jù)。 這樣可以改善延遲時(shí)間(因?yàn)闆]有通過網(wǎng)絡(luò)傳輸數(shù)據(jù)),提高了隱私性(因?yàn)闆]有數(shù)據(jù)會(huì)離開設(shè)備)和脫機(jī)功能(因?yàn)椴恍枰ヂ?lián)網(wǎng)連接就可以在任何地方發(fā)送數(shù)據(jù))。

TFLite 的一些關(guān)鍵功能包括針對(duì)設(shè)備的經(jīng)過優(yōu)化的優(yōu)化解釋器(它支持在二進(jìn)制大小較小的設(shè)備上優(yōu)化的一組核心操作),針對(duì)多種語言(例如 Swift,C,C++,Java 和 Python 的 API),預(yù)訓(xùn)練的模型和教程(新手可以在低功耗設(shè)備上輕松部署機(jī)器學(xué)習(xí)模型)。 TFLite 旨在通過硬件加速以及預(yù)融合的激活和偏差進(jìn)行高效和優(yōu)化。

TFLite 的基本開發(fā)工作流程是選擇模型,轉(zhuǎn)換模型,將其部署到所需的設(shè)備并優(yōu)化模型。 該模型可以是任何東西,從tf.keras自定義訓(xùn)練模型到從 TF 本身獲取的預(yù)訓(xùn)練模型。

TFLite 入門

使用 TFLite 的第一步是選擇要轉(zhuǎn)換和使用的模型。 這包括使用預(yù)訓(xùn)練的模型,定制訓(xùn)練的模型或微調(diào)的模型。 TFLite 團(tuán)隊(duì)提供了一組預(yù)訓(xùn)練和預(yù)轉(zhuǎn)換的模型,可以解決各種機(jī)器學(xué)習(xí)問題。 這些包括圖像分類,對(duì)象檢測,智能回復(fù),姿勢估計(jì)和分割。 使用經(jīng)過微調(diào)的模型或經(jīng)過定制訓(xùn)練的模型需要另一步驟,將它們轉(zhuǎn)換為 TFLite 格式。

TFLite 旨在在設(shè)備上高效地執(zhí)行模型,而這種效率的某些內(nèi)在原因來自用于存儲(chǔ)模型的特殊格式。 TF 模型必須先轉(zhuǎn)換為這種格式,然后才能使用…

在移動(dòng)設(shè)備上運(yùn)行 TFLite

在本節(jié)中,我們將介紹如何在兩種主要的移動(dòng)操作系統(tǒng)(Android 和 iOS)上運(yùn)行 TFLite。

Android 上的 TFLite

在 Android 上使用 TFLite 就像在 Android Studio 的build.gradle文件中的dependencies字段中添加 TFLite 并將其導(dǎo)入 Android Studio 一樣容易:

dependencies {    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'}import org.tensorflow.lite.Interpreter;

一旦完成,下一步就是創(chuàng)建解釋器的實(shí)例并加載模型。 可以使用 GitHub 上 TFLite 示例中的getModelPath函數(shù)getModelPathloadModelFile加載轉(zhuǎn)換后的 TFLite 文件來實(shí)現(xiàn)。 現(xiàn)在,要運(yùn)行模型,只需使用解釋器類的.run方法并為其提供所需的輸入數(shù)據(jù),如本例所示:

tflite.run(inp,out);

inp參數(shù)是輸入數(shù)據(jù),它將…

iOS 上的 TFLite

在 iOS 上使用 TFLite 的過程與此類似,其中包括安裝 TFLite 解釋器,加載模型并運(yùn)行它。 再次按照“TFLite 入門”部分中的步驟操作,以創(chuàng)建和轉(zhuǎn)換機(jī)器學(xué)習(xí)模型以在智能手機(jī)上使用。 我們將使用以下步驟在 iOS 上實(shí)現(xiàn) TFLite:

  1. 通過將 TFLite 添加到項(xiàng)目的root目錄中的pod文件中來安裝它:
use_frameworks!
pod 'TensorFlowLiteSwift'

通過運(yùn)行pod install來安裝包,這將安裝pod文件中包括的所有包,包括新添加的TFLite包。 安裝后,可以通過在swift文件頂部附近添加import TensorFlowLite來導(dǎo)入包。

  1. 要運(yùn)行interpreter,首先為張量分配內(nèi)存:
let outputTensor: Tensor
do {try interpreter.allocateTensors()let inputTensor = try interpreter.input(at: 0)
  1. 然后,從圖像緩沖區(qū)中刪除alpha組件以獲取rgbData變量:
guard let rgbData = rgbDataFromBuffer(thumbnailPixelBuffer,byteCount: batchSize * inputWidth * inputHeight * inputChannels,isModelQuantized: inputTensor.dataType == .uInt8) else {print("Failed to convert the image buffer to RGB data.")return}
  1. 接下來,將rgbData變量復(fù)制到Tensor輸入模型中:
try interpreter.copy(rgbData, toInputAt: 0)
  1. 通過調(diào)用interpreter函數(shù)運(yùn)行推理:
try interpreter.invoke()
  1. 獲取outputTensor函數(shù)以處理推理結(jié)果:
outputTensor = try interpreter.output(at: 0)
} catch let error {print("Failed to invoke the interpreter with error: \(error.localizedDescription)")return
}

然后可以處理結(jié)果并將其顯示在應(yīng)用中。

在低功率機(jī)器上運(yùn)行 TFLite

TFLite 能夠在低功耗和低二進(jìn)制計(jì)算機(jī)上運(yùn)行的能力使其在嵌入式 Linux 計(jì)算機(jī)上運(yùn)行時(shí)非常強(qiáng)大。 TFLite 可以在許多流行的嵌入式 Linux 機(jī)器以及 Coral Dev Board 上運(yùn)行。 在本節(jié)中,我們將介紹在三個(gè)設(shè)備上 TFLite 的構(gòu)建,編譯和運(yùn)行。 涵蓋的第一個(gè)設(shè)備是帶有 Edge TPU 處理器的 Coral Dev Board,第二個(gè)設(shè)備是 NVIDIA Jetson Nano,最后一個(gè)是 Raspberry Pi。 NVIDIA Jetson Nano 是 NVIDIA 的小型而強(qiáng)大的計(jì)算機(jī),可在圖像分類,目標(biāo)檢測,分割和語音等應(yīng)用中并行運(yùn)行多個(gè)神經(jīng)網(wǎng)絡(luò)。

在 Edge TPU 處理器上運(yùn)行 TFLite

Edge TPU 是一種小型處理器,能夠執(zhí)行深度前饋網(wǎng)絡(luò),例如卷積神經(jīng)網(wǎng)絡(luò)。 但是,它僅支持量化的 TFLite 模型。 量化是一種優(yōu)化技術(shù),可將所有 32 位浮點(diǎn)數(shù)轉(zhuǎn)換為最接近的 8 位定點(diǎn)數(shù)。 這使模型更小,更快,盡管精度和準(zhǔn)確率有所降低。

TF 支持兩種類型的量化。 第一種量化方式是訓(xùn)練后量化。 通過將模型優(yōu)化屬性設(shè)置為帶有tf.lite.Optimize.OPTIMIZE_FOR_SIZE的列表,可以在將 TF 模型轉(zhuǎn)換為 TFLite 模型時(shí)完成此操作。 這導(dǎo)致權(quán)重被轉(zhuǎn)換為 8 位精度,從而將延遲增加了多達(dá) 3 倍。 網(wǎng)絡(luò)中其他更多計(jì)算密集型操作將轉(zhuǎn)換為具有定點(diǎn)操作但具有浮點(diǎn)內(nèi)存的混合操作。

另一種量化類型是量化感知訓(xùn)練,它使用偽造的量化節(jié)點(diǎn)來模擬前向和后向模型中量化的效果; 該量化是直接估計(jì)。 這是 Edge TPU 支持的唯一量化,并允許在其上運(yùn)行 TFLite 模型。

Edge TPU 有兩種可用方式:

  • Coral 開發(fā)板,其中包含 TPU 以及預(yù)安裝的所有必需軟件和 API
  • Edge TPU USB 擴(kuò)展器,可在所需計(jì)算機(jī)上添加另一個(gè)處理器

USB 加速器與任何具有運(yùn)行 Debian 的 USB 端口的 Linux 計(jì)算機(jī)兼容。 要設(shè)置 USB 加速器,請(qǐng)從這里下載.tar文件,然后解壓縮并運(yùn)行install.sh。

這里要注意的一點(diǎn)是,在安裝過程中,安裝程序?qū)⒁髥⒂米畲蠊ぷ黝l率,這將大大加快推理時(shí)間,但也會(huì)使 TPU 摸起來很燙。

下圖顯示了將 TF 模型轉(zhuǎn)換為 Edge TPU 模型并在其上運(yùn)行的過程:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-lCTiwxkG-1681704017945)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/ee7dff88-2f0b-4a1a-86b9-966f0c8ce1d7.png)]

但是,Edge TPU 有兩個(gè)約束。 如前所述,必須使用量化感知訓(xùn)練對(duì)Tensor參數(shù)進(jìn)行量化。 張量大小必須恒定(這樣就不能有動(dòng)態(tài)大小); 模型參數(shù)必須恒定; 張量必須是一維,二維或三維張量,或者是三個(gè)最里面的大小大于 3 維的張量,并且只能包含 Edge TPU 支持的那些操作。 如果不滿足這些要求,那么將僅編譯某些模型。 模型圖中發(fā)生不支持的操作的第一點(diǎn)是編譯器將圖分為兩部分:一部分包含 Edge TPU 可以計(jì)算的所有操作,另一部分包含它不能計(jì)算的操作,這些部分將運(yùn)行在 CPU 上:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-W4OjpxEr-1681704017945)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/aedc0f8e-e06f-4917-ad0a-41abe07ad00b.png)]

一旦 TFLite 模型已編譯并準(zhǔn)備好運(yùn)行,就可以使用 Edge TPU 運(yùn)行時(shí)和 API 庫執(zhí)行該模型。 Edge TPU API 具有三個(gè)用于推理的關(guān)鍵 API:

  • ClassificationEngine API,執(zhí)行圖像分類。 要使用它,請(qǐng)通過指定模型來創(chuàng)建實(shí)例,然后將圖像傳遞到該實(shí)例的ClassifyWithImage()方法,該方法返回標(biāo)簽和分?jǐn)?shù)列表。
  • DetectionEngine API,用于執(zhí)行對(duì)象檢測。 與先前的 API 一樣,通過指定模型文件來創(chuàng)建實(shí)例,然后運(yùn)行DetectWithImage()方法,該方法返回檢測候選對(duì)象的列表,每個(gè)候選對(duì)象包含一個(gè)標(biāo)簽,一個(gè)得分和該對(duì)象的坐標(biāo)。
  • 最終的關(guān)鍵 API 是允許壓印的 API:一種遷移學(xué)習(xí)算法,可以進(jìn)行模型重新訓(xùn)練而無需反向傳播,并且可以在 Edge TPU 上運(yùn)行。 要運(yùn)行此 API,必須遵循三個(gè)步驟:
    1. 首先,確定嵌入張量,它是最后一個(gè)分類層的輸入張量。
    2. 然后,切斷最后一個(gè)分類層。
    3. 最后,完成嵌入提取器。

Edge TPU 的性能遠(yuǎn)遠(yuǎn)優(yōu)于許多最強(qiáng)大的 CPU。 當(dāng)在帶或不帶 USB 加速器的 IntelXeon?3.60 GHz 處理器上測試模型時(shí),單個(gè) Edge TPU 能夠以每秒 2 瓦的功率每秒執(zhí)行 4 萬億次操作; 嵌入式 1.5 GHz CPU; 和珊瑚開發(fā)委員會(huì)。 在運(yùn)行 DeepLab 網(wǎng)絡(luò)時(shí),英特爾至強(qiáng)花費(fèi)了 301 毫秒,帶加速器的英特爾至強(qiáng)花費(fèi)了 35 毫秒,嵌入式 CPU 花費(fèi)了 1,210 毫秒,而珊瑚開發(fā)板花費(fèi)了 156 毫秒。 顯然,Edge TPU 對(duì)模型的延遲具有重大影響。

在 NVIDIA Jetson Nano 上運(yùn)行 TF

NVIDIA Jetson Nano 是另一種嵌入式設(shè)備,可為機(jī)器學(xué)習(xí)應(yīng)用提供強(qiáng)大的計(jì)算能力。 Jetson Nano 的前提與 Edge TPU 不同,因?yàn)?Jetson Nano 是一款小型而功能強(qiáng)大的 GPU 計(jì)算機(jī)。 Jetson Nano 可以像配置用于深度學(xué)習(xí)的任何機(jī)器一樣使用,并且可以輕松安裝 GPU 版本的 TF。 也不需要安裝 CUDA 和 cuDNN,因?yàn)樗杨A(yù)先安裝在系統(tǒng)上。

比較 TFLite 和 TF

如前所述,TFLite 模型與普通 TF 模型有很大不同。 TFLite 模型更快,更小且計(jì)算量更少。 這種區(qū)別來自 TFLite 模型的特殊存儲(chǔ)和解釋方式。

速度的首次提高來自模型存儲(chǔ)的基本格式。.tflite模型文件以FlatBuffer格式存儲(chǔ),其中包含模型的簡化形式和二進(jìn)制形式。 FlatBuffer是適用于多種流行語言的高效跨平臺(tái)序列化庫,由 Google 創(chuàng)建,用于游戲開發(fā)和其他對(duì)性能至關(guān)重要的應(yīng)用。 FlatBuffer格式在有效序列化模型數(shù)據(jù)并提供對(duì)這些數(shù)據(jù)的快速訪問,同時(shí)保持較小的二進(jìn)制大小方面起著至關(guān)重要的作用。 由于大量的數(shù)字?jǐn)?shù)據(jù),這對(duì)于模型存儲(chǔ)很有用,這通常會(huì)在讀取操作中產(chǎn)生很多延遲。 通過使用FlatBuffers,TFLite 可以繞過許多傳統(tǒng)的文件解析和非解析操作,這在計(jì)算上非常昂貴。

TFLite 模型優(yōu)化也一直延伸到設(shè)備上的硬件。 這是因?yàn)?#xff0c;由于電話處理器和嵌入式 CPU 的限制,必須以超高效標(biāo)準(zhǔn)使用所有處理器。 在 Android 上運(yùn)行 TFLite 時(shí),可訪問 Android 神經(jīng)??網(wǎng)絡(luò) API,該接口可訪問 Android 中的硬件加速推理操作,并且已接口,以利用有利的硬件加速來使用所使用的設(shè)備。 TFLite 還可以在電話和其他設(shè)備中使用內(nèi)置的 GPU,從而使具有過多可并行化操作和量化敏感精度的模型的速度提高了近 7 倍。

如前所述,量化是另一種非常有影響力的優(yōu)化技術(shù)。 量化被視為 TF 中的一種壓縮技術(shù)。 神經(jīng)網(wǎng)絡(luò)中的權(quán)重和激活趨向于具有分布在相對(duì)較小范圍內(nèi)的三個(gè)值,因此可以有效地使用量化來壓縮這些值。 由于神經(jīng)網(wǎng)絡(luò)往往對(duì)權(quán)重噪聲具有魯棒性,因此量化和舍入加到參數(shù)上的噪聲對(duì)模型的整體準(zhǔn)確率影響很小。 量化模型的好處在于,它可以有效地表示任意范圍的范圍,它們的線性擴(kuò)展使乘法簡單明了,而量化權(quán)重具有對(duì)稱范圍,可以實(shí)現(xiàn)下游硬件優(yōu)化,而 32 位浮點(diǎn)數(shù)則無法實(shí)現(xiàn)。

如下圖所示,將模型從 TF 轉(zhuǎn)換為量化的 TFLite 模型會(huì)大大減少模型的推理時(shí)間和延遲:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-hPM7g7vJ-1681704017945)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/6b0e98ac-64e7-4b03-ad69-abbde7fee70d.png)]

AIY

Google 為語音和視覺應(yīng)用發(fā)布了自己的制造商套件,稱為 AIY。 這些套件隨附了所有必需的零件和組件,以及在線易于理解的教程。 AIY 當(dāng)前提供兩種套件-語音套件和視覺套件。

語音套件

語音工具包提供了構(gòu)建自然語言處理器并將其連接到 Google Assistant 或 Cloud Speech-to-Text 服務(wù)的功能。 該套件隨附 Raspberry Pi Zero,以及定制設(shè)計(jì)的語音引擎蓋和用于音頻功能的揚(yáng)聲器。 該套件還隨附可插入 Pi 的 SD 卡,以及用于許多最常見應(yīng)用的大量演示,示例和摘要。 它還帶有一個(gè)在設(shè)備上運(yùn)行 Google Assistant 并將其轉(zhuǎn)變?yōu)橹悄芗揖釉O(shè)備的應(yīng)用。

要開始使用語音工具包,請(qǐng)按照這個(gè)頁面上的說明構(gòu)建設(shè)備。 該設(shè)備設(shè)計(jì)合理,易于組裝和設(shè)置。 要設(shè)置設(shè)備,可以使用計(jì)算機(jī)或手機(jī)。 該套件的設(shè)置非常簡單,可以通過安全外殼SSH)或 HDMI 連接來完成。 完成后,可以運(yùn)行許多演示來進(jìn)一步了解和探索該工具包,例如前面提到的 Google Assistant 應(yīng)用。

語音工具包可以完成的一些事情包括創(chuàng)建自定義語音用戶界面和使用助手控制 IoT 設(shè)備。

可以使用套件中demo文件夾中包含的 Google Cloud 語音轉(zhuǎn)文本 API 和 AIY API 在語音工具包上創(chuàng)建自定義語音用戶界面。 該 API 增加了使用 Cloud Speech API,語音轉(zhuǎn)文本以及控制 Vision Bonnet 上的 GPIO 引腳的功能。

要使用語音工具包和助手來控制 IoT 設(shè)備,您可以使用幾種強(qiáng)大的技術(shù)。 都使用了用于物聯(lián)網(wǎng)項(xiàng)目的 Wi-Fi 開發(fā)套件 Particle Photon 和用于創(chuàng)建對(duì)話界面的DialogFlow。 語音套件中包含的演示提供了打開和關(guān)閉連接到 Photon 的 LED 的代碼。

視覺套件

視覺套件提供了構(gòu)建智能相機(jī)的功能,該相機(jī)可以使用機(jī)器學(xué)習(xí)來查看和識(shí)別對(duì)象,甚至可以在其上運(yùn)行自定義 TF 模型。 與語音工具包一樣,該工具包還附帶 Raspberry Pi Zero,定制設(shè)計(jì)的 Vision Bonnet,壓電蜂鳴器和 Raspberry Pi Camera V2。 該套件隨附一個(gè)預(yù)先存儲(chǔ)有 AIY 系統(tǒng)圖像的 SD 卡,其中包括針對(duì)多種計(jì)算機(jī)視覺應(yīng)用的演示,例如圖像分類,物體檢測,人臉檢測,食物分類和自動(dòng)拍照。

和以前一樣,可以按照這里。 該設(shè)備有一個(gè)簡單的…

總結(jié)

TFLite 是 TF2.0 的一項(xiàng)功能,它采用 TF 模型并對(duì)其進(jìn)行壓縮和優(yōu)化,以在嵌入式 Linux 設(shè)備或低功耗和低二進(jìn)制設(shè)備上運(yùn)行。 可以通過三種方式將 TF 模型轉(zhuǎn)換為 TFLite 模型:從已保存的模型,tf.keras模型或具體函數(shù)。 轉(zhuǎn)換模型后,將創(chuàng)建一個(gè).tflite文件,然后可以將其傳輸?shù)剿璧脑O(shè)備并使用 TFLite 解釋器運(yùn)行。 該模型經(jīng)過優(yōu)化以使用硬件加速,并以FlatBuffer格式存儲(chǔ),以提高讀取速度。 可以將其他優(yōu)化技術(shù)應(yīng)用于該模型,例如量化,以最小的精度權(quán)衡將 32 位浮點(diǎn)數(shù)轉(zhuǎn)換為 8 位定點(diǎn)數(shù)。 可以在 TFLite 上運(yùn)行的某些設(shè)備是 Edge TPU,NVIDIA Jetson Nano 和 Raspberry Pi。 Google 還提供了兩個(gè)工具包,可為用戶提供創(chuàng)建與視覺和語音相關(guān)的機(jī)器學(xué)習(xí)應(yīng)用所需的硬件。

在下一章中,我們將學(xué)習(xí)如何從 TF1.x 遷移到 TF2.0。

第 4 部分:TensorFlow 2.0 - 遷移,總結(jié)

本書的本部分將以高級(jí)方式總結(jié) TensorFlow 2.0TF 2.0)的使用,以及與以前版本相比 TF 2.0 的兼容性差異。 如果您使用過 TensorFlow 1.xTF 1.x),則本書的這一部分將重點(diǎn)介紹如何遷移到 TF 2.0。 盡管有一個(gè)將 TF 1.x 代碼轉(zhuǎn)換為 TF 2.0 的遷移 API,但它只是進(jìn)行語法到語法的轉(zhuǎn)換。 本部分還將深入指導(dǎo)您完成從語義上將 TF 1.x 代碼轉(zhuǎn)換為 TF 2.0 所需的代碼級(jí)更改。

本節(jié)包含以下章節(jié):

  • 第 7 章“從 TensorFlow 1.x 遷移到 2.0”

七、從 TensorFlow 1.x 遷移到 2.0

本章將介紹如何將 TensorFlow 1.xTF 1.x)代碼轉(zhuǎn)換為 TensorFlow 2.0TF 2.0) 代碼有兩種方式。 第一種方法是使用更新腳本,該腳本會(huì)更改大多數(shù) TF 1.x 代碼,以便可以在 TF 2.0 中運(yùn)行。 但是,這僅將所有tf.x API 調(diào)用轉(zhuǎn)換為tf.compat.v1.x格式。 另一種方法是,考慮到對(duì)庫所做的核心更改,將 TF 1.x 代碼轉(zhuǎn)換為慣用的 TF2.0 代碼。 我們將討論 TF 1.x 和 TF 2.0 之間的概念差異,它們之間的兼容性標(biāo)準(zhǔn)以及我們?cè)谡Z法和語義上進(jìn)行遷移的方式。 我們還將展示從 TF 1.x 到 TF 2.0 的語法和語義遷移的幾個(gè)示例,我們將通過它們提供參考和將來的信息。

本章將涵蓋以下主題:

  • TF 2.0 的主要變化
  • 適用于 TF 2.0 的推薦技術(shù)
  • 使代碼 TF 2.0 原生
  • 常見問題
  • TF 2.0 的未來

TF 2.0 的主要變化

從 TF 1.x 遷移到 TF 2.0 時(shí),您將遇到的主要變化涉及 API 清理。

TF 2.0 中的許多 API 都已被刪除或移動(dòng)。 主要更改包括刪除tf.apptf.flagstf.logging,以支持其他 Python 模塊,例如absl-py和內(nèi)置的日志記錄系統(tǒng)。

TF 2.0 在代碼方面所做的最大更改之一就是急切執(zhí)行。 TF 1.x 要求用戶使用tf.*調(diào)用來手工拼接抽象語法樹,以構(gòu)建計(jì)算圖,該圖將與session.run()一起運(yùn)行。 這意味著 TF 2.0 代碼逐行運(yùn)行,因此不再需要tf.control_dependancies()

TF 1.x 中的session.run()調(diào)用與…非常相似。

適用于 TF 2.0 的推薦技術(shù)

第一條建議涉及在 TF 2.0 中處理常規(guī)代碼工作流。 TF 1.x 中常見的工作流程是使用瀑布策略,其中所有計(jì)算都布置在默認(rèn)圖上。 然后,使用session.run()運(yùn)行選定的張量。 在 TF 2.0 中,應(yīng)將代碼重構(gòu)為較小的函數(shù),這些函數(shù)將在需要時(shí)調(diào)用。 這些函數(shù)可以是普通的 Python 函數(shù),但如果在另一個(gè)以tf.function注解的函數(shù)中調(diào)用它們,則仍可以在圖模式下運(yùn)行。 這意味著tf.function僅應(yīng)用于注解高級(jí)計(jì)算,例如模型的前向傳遞或單個(gè)訓(xùn)練步驟。

以前,模型和訓(xùn)練循環(huán)所需的所有計(jì)算都將預(yù)先確定并編寫,并使用session.run()執(zhí)行。 這使得 TF 1.x 代碼對(duì)于大多數(shù)編碼人員來說很難遵循,因?yàn)槟P偷牧鞒炭赡芘c圖的編碼方式完全不同,因?yàn)樵搱D是在最后運(yùn)行的。 急切執(zhí)行和tf.function專門用于簡化 TensorFlow 代碼動(dòng)態(tài)過程,并使其他開發(fā)人員更容易理解預(yù)編寫的代碼。

管理和跟蹤變量是 TF 1.x 中另一個(gè)復(fù)雜的過程。 使用了許多方法來控制和訪問這些變量,這為線性代碼增加了更多的維度。 TF 2.0 更加強(qiáng)調(diào)使用tf.keras層和tf.estimator模型來管理模型中的變量。

這與手動(dòng)滾動(dòng)神經(jīng)網(wǎng)絡(luò)層和手動(dòng)創(chuàng)建變量形成對(duì)比。 在以下示例中,必須跟蹤權(quán)重和偏差變量,其形狀的定義應(yīng)遠(yuǎn)離模型的創(chuàng)建。 這使得難以更改模型并使模型適應(yīng)不同的架構(gòu)和數(shù)據(jù)集:

def dense(x, W, b):return tf.nn.sigmoid(tf.matmul(x, W) + b)@tf.function
def multilayer_perceptron(x, w0, b0, w1, b1, w2, b2 ...):x = dense(x, w0, b0)x = dense(x, w1, b1)x = dense(x, w2, b2)...

此代碼的tf.keras實(shí)現(xiàn)非常簡單明了,并確保開發(fā)人員不必?fù)?dān)心變量和變量名的組織和管理。 它還可以輕松訪問模型中的可訓(xùn)練變量:

layers = [tf.keras.layers.Dense(hidden_size, activation=tf.nn.sigmoid) for _ in range(n)]
perceptron = tf.keras.Sequential(layers)# layers[3].trainable_variables => returns [w3, b3]
# perceptron.trainable_variables => returns [w0, b0, ...]

tf.keras模型還繼承了tf.train.Checkpointable模型的方法,并與tf.function集成在一起,因此可以將它們直接保存到檢查點(diǎn)并導(dǎo)出到SavedModels。

以下是遷移學(xué)習(xí)實(shí)現(xiàn)的示例,并顯示tf.keras如何使收集相關(guān)值的子集,計(jì)算其梯度以及基于梯度對(duì)其進(jìn)行調(diào)整變得容易:

trunk = tf.keras.Sequential([...])
head1 = tf.keras.Sequential([...])
head2 = tf.keras.Sequential([...])path1 = tf.keras.Sequential([trunk, head1])
path2 = tf.keras.Sequential([trunk, head2])# Train on primary dataset
for x, y in main_dataset:with tf.GradientTape() as tape:prediction = path1(x)loss = loss_fn_head1(prediction, y)# Simultaneously optimize trunk and head1 weights.gradients = tape.gradient(loss, path1.trainable_variables)optimizer.apply_gradients(zip(gradients, path1.trainable_variables))# Fine-tune second head, reusing the trunk
for x, y in small_dataset:with tf.GradientTape() as tape:prediction = path2(x)loss = loss_fn_head2(prediction, y)# Only optimize head2 weights, not trunk weightsgradients = tape.gradient(loss, head2.trainable_variables)optimizer.apply_gradients(zip(gradients, head2.trainable_variables))# You can publish just the trunk computation for other people to reuse.
tf.saved_model.save(trunk, output_path)

所有尚未存儲(chǔ)在內(nèi)存中的數(shù)據(jù)集都應(yīng)使用tf.dataset進(jìn)行存儲(chǔ)和流傳輸。 數(shù)據(jù)集在 TF 2.0 中是可迭代的,因此在急切的執(zhí)行模式下,它們可以像任何其他 Python 可迭代的一樣使用,例如列表和元組。 您還可以通過使用tf.function包裝數(shù)據(jù)集迭代來利用數(shù)據(jù)集異步預(yù)取和流傳輸功能,該迭代將 Python 交互轉(zhuǎn)換為與 AutoGraph 等效的圖操作。 正如我們?cè)诒緯懊嫠岬降?#xff0c;AutoGraph 采用默認(rèn)的 Python 流并將其轉(zhuǎn)換為基于圖的代碼。 例如,諸如if...else塊之類的控制流將轉(zhuǎn)換為tf.condition語句。 以下代碼塊向您展示了如何使用for塊訓(xùn)練模型:

@tf.function
def train(model, dataset, optimizer):for x, y in dataset:with tf.GradientTape() as tape:prediction = model(x)loss = loss_fn(prediction, y)gradients = tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))

但是,如果您正在使用 Keras 的model.fit,則不必?fù)?dān)心。 要使用model.fit在數(shù)據(jù)集上訓(xùn)練模型,只需將數(shù)據(jù)集傳遞給方法。 它將處理其他所有事項(xiàng):

model.compile(optimizer=optimizer, loss=loss_fn)
model.fit(dataset)

使代碼 TF 2.0 原生

使 TF 1.x 代碼與 TF 2.0 代碼兼容的最簡單方法是運(yùn)行系統(tǒng)上安裝的更新腳本以及 TF 2.0 安裝。 更新腳本使用tf.compat.v1模塊。

為了向 TF 1.x 編寫的代碼提供向后兼容性,在 TF 2.0 中引入了tf.compat.v1模塊。 tf.compat.v1模塊替換了所有 TF 1.x 符號(hào),例如tf.footf.compat.v1.foo。 此模塊允許轉(zhuǎn)換為 TF 1.x 編寫的大多數(shù)代碼,以便可以在 TF 2.0 中運(yùn)行。

作為簡化此過程的一種方式,TensorFlow 提供了tf_upgrade_v2工具,該工具有助于盡可能簡化轉(zhuǎn)換。 該工具已預(yù)裝…

轉(zhuǎn)換 TF 1.x 模型

第一步是將所有tf.Session.run()調(diào)用替換為 Python 函數(shù)。 這意味著將tf.placeholderfeed_dict轉(zhuǎn)換為函數(shù)參數(shù)。 這些成為函數(shù)的返回值。 此更改意味著與 TF 1.x 不同,可以使用標(biāo)準(zhǔn)的 Python 工具(例如pdb)來逐步調(diào)試該功能。 構(gòu)建函數(shù)后,可以添加tf.function注解以在圖模式下運(yùn)行該函數(shù),以及 TF 1.x 中等效的tf.Session.run調(diào)用的效率。

使用tf.layers API 創(chuàng)建的 TF 1.x 模型可以相對(duì)容易地轉(zhuǎn)換為 TF 2.0。 tf.layers模塊用于包含依賴于tf.variable_scope定義和重用變量的層函數(shù)。

以下代碼塊是使用tf.layers API 編寫的 TF 1.x 中小型卷積神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn):

def model(x, training, scope='model'):with tf.variable_scope(scope, reuse=tf.AUTO_REUSE):x = tf.layers.conv2d(x, 32, 3, activation=tf.nn.relu,kernel_regularizer=tf.contrib.layers.l2_regularizer(0.04))x = tf.layers.max_pooling2d(x, (2, 2), 1)x = tf.layers.flatten(x)x = tf.layers.dropout(x, 0.1, training=training)x = tf.layers.dense(x, 64, activation=tf.nn.relu)x = tf.layers.batch_normalization(x, training=training)x = tf.layers.dense(x, 10, activation=tf.nn.softmax)return xtrain_out = model(train_data, training=True)
test_out = model(test_data, training=False)

將模型轉(zhuǎn)換為 TF 2.0 的最簡單方法是使用tf.keras.Sequential,因?yàn)樵撃P陀删€性層組成。 從tf.layerstf.keras.layers有一對(duì)一的轉(zhuǎn)換,但有一些區(qū)別。 在 TF 2.0 代碼中,訓(xùn)練參數(shù)不再傳遞給每個(gè)層,因?yàn)槟P蜁?huì)自動(dòng)處理該參數(shù)。

這是 TF 2.0 中的代碼:

model = tf.keras.Sequential([tf.keras.layers.Conv2D(32, 3, activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.04),input_shape=(28, 28, 1)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dropout(0.1),tf.keras.layers.Dense(64, activation='relu'),tf.keras.layers.BatchNormalization(),tf.keras.layers.Dense(10, activation='softmax')
])train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))train_out = model(train_data)test_out = model(test_data, training=False)

如我們所見,tf.variable_scope沒有用于組織為模型創(chuàng)建的變量。 在 TF 1.x 中,該范圍將用于從模型中恢復(fù)變量。 在 TF 2.0 中,可以使用model.trainable_variables列出模型變量。

盡管從tf.layerstf.keras.layers的轉(zhuǎn)換相對(duì)簡單,但是由于代碼流的差異,轉(zhuǎn)換變得更加復(fù)雜。

TF 1.x 中的低級(jí) API 的一些示例包括使用變量作用域來控制重用,使用tf.get_variable創(chuàng)建變量,使用tf.placeholdersession.run定期訪問集合以及手動(dòng)初始化變量。 由于引入了系統(tǒng)范圍內(nèi)的急切執(zhí)行,這些技術(shù)和策略中的許多現(xiàn)在已過時(shí),因此以低級(jí) API 編寫的代碼比以高級(jí) API 編寫的代碼(例如tf.kerastf.layers)需要更大的更改。 。

以下是使用 TF 1.x 的低級(jí) API 編寫的一些代碼的示例:

in_a = tf.placeholder(dtype=tf.float32, shape=(2))
in_b = tf.placeholder(dtype=tf.float32, shape=(2))def forward(x):with tf.variable_scope("matmul", reuse=tf.AUTO_REUSE):W = tf.get_variable("W", initializer=tf.ones(shape=(2,2)),regularizer=tf.contrib.layers.l2_regularizer(0.04))b = tf.get_variable("b", initializer=tf.zeros(shape=(2)))return W * x + bout_a = forward(in_a)
out_b = forward(in_b)reg_loss = tf.losses.get_regularization_loss(scope="matmul")with tf.Session() as sess:sess.run(tf.global_variables_initializer())outs = sess.run([out_a, out_b, reg_loss],feed_dict={in_a: [1, 0], in_b: [0, 1]})

可以通過將前向函數(shù)更改為用tf.function注解的函數(shù)進(jìn)行基于圖的計(jì)算,刪除session.run函數(shù)和變量范圍并添加簡單的函數(shù)調(diào)用來轉(zhuǎn)換此代碼。 將不會(huì)在W變量上全局調(diào)用正則化; 相反,它將被手動(dòng)調(diào)用,而無需引用全局集合:

W = tf.Variable(tf.ones(shape=(2,2)), name="W")
b = tf.Variable(tf.zeros(shape=(2)), name="b")@tf.function
def forward(x):return W * x + bout_a = forward([1,0])
out_b = forward([0,1])regularizer = tf.keras.regularizers.l2(0.04)
reg_loss = regularizer(W)

正如我們所看到的,TF 2.0 代碼比以前的 TF 1.x 代碼更加 Python 化和簡潔。

使用tf.placeholder的好處之一是可以控制圖輸入的形狀,如果輸入與預(yù)定形狀不匹配,則會(huì)返回錯(cuò)誤。 在 TF 2.0 中,仍然可以通過使用 Python 內(nèi)置的assert命令來完成此操作。 這可以用來斷言該函數(shù)的輸入自變量的形狀與輸入自變量所期望的形狀匹配。

現(xiàn)有的 TF 1.x 代碼通常同時(shí)包含較低級(jí)別的 TF 1.x 變量和具有較高級(jí)別tf.layers的操作。 這意味著上述示例都不足以轉(zhuǎn)換 TF 1.x 代碼,并且需要tf.keras編程的更復(fù)雜形式,稱為模型或?qū)幼宇悺?/p>

以下是在 TF 1.x 中使用tf.get_variabletf.layers編寫的原始代碼:

def model(x, training, scope='model'):with tf.variable_scope(scope, reuse=tf.AUTO_REUSE):W = tf.get_variable("W", dtype=tf.float32,initializer=tf.ones(shape=x.shape),regularizer=tf.contrib.layers.l2_regularizer(0.04),trainable=True)if training:x = x + Welse:x = x + W * 0.5x = tf.layers.conv2d(x, 32, 3, activation=tf.nn.relu)x = tf.layers.max_pooling2d(x, (2, 2), 1)x = tf.layers.flatten(x)return xtrain_out = model(train_data, training=True)
test_out = model(test_data, training=False)

通過將所有低層操作和變量包裝在自定義創(chuàng)建的 Keras 層中,可以轉(zhuǎn)換此代碼。 這可以通過創(chuàng)建一個(gè)從tf.keras.layers.Layer類繼承的類來完成:

# Create a custom layer for part of the model
class CustomLayer(tf.keras.layers.Layer):def __init__(self, *args, **kwargs):super(CustomLayer, self).__init__(*args, **kwargs)def build(self, input_shape):self.w = self.add_weight(shape=input_shape[1:],dtype=tf.float32,initializer=tf.keras.initializers.ones(),regularizer=tf.keras.regularizers.l2(0.02),trainable=True)# Call method will sometimes get used in graph mode,# training will get turned into a tensor@tf.functiondef call(self, inputs, training=None):if training:return inputs + self.welse:return inputs + self.w * 0.5

前面的代碼創(chuàng)建了一個(gè)名為CustomLayer的類,該類繼承了tf.keras.layers.Layer類的屬性。 此技術(shù)允許在tf.keras模型內(nèi)部使用任何類型的低級(jí)代碼,而不管它是使用Sequential API 還是functional API 的模型。 此類中有兩種方法:

  • build():此方法修改繼承的類的默認(rèn)生成方法。 在這種方法中,應(yīng)該創(chuàng)建模型所需的所有變量。 盡管可以在模型的the __init__()方法中完成此操作,但建議使用build(),以便在正確的最佳時(shí)間構(gòu)建變量。 可以使用self.add_weight函數(shù)完成此操作,以使 Keras 跟蹤變量和正則化損失。
  • call():在輸入張量上調(diào)用模型時(shí),將運(yùn)行此方法。 此方法通常采用兩個(gè)參數(shù):inputstraining。 盡管inputs參數(shù)是不言自明的,但training參數(shù)可能不會(huì)一直使用,但是對(duì)于在該層中使用批量規(guī)范化和丟棄的情況而言是必不可少的。 該功能由tf.function裝飾器注解,以實(shí)現(xiàn)簽名,基于圖的優(yōu)點(diǎn)以及自動(dòng)控件的依賴關(guān)系。

寫入此自定義層后,即可在tf.keras模塊中的任何位置使用它。 對(duì)于此轉(zhuǎn)換,將使用Sequential API:

train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))# Build the model including the custom layer
model = tf.keras.Sequential([CustomLayer(input_shape=(28, 28, 1)),tf.keras.layers.Conv2D(32, 3, activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),
])train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

升級(jí)訓(xùn)練循環(huán)

將 TF 1.x 代碼轉(zhuǎn)換為慣用的 TF 2.0 代碼的第二步是升級(jí)訓(xùn)練管道。 TF 1.x 訓(xùn)練管道涉及對(duì)優(yōu)化器,損失和預(yù)測的多個(gè)tf.Session.run()調(diào)用。 這樣的訓(xùn)練循環(huán)還涉及樣板代碼,該樣板代碼被編寫為將訓(xùn)練結(jié)果記錄到控制臺(tái)以方便監(jiān)督。

在 TF 2.0 中,可以使用三種類型的訓(xùn)練循環(huán)。 這些循環(huán)中的每一個(gè)都有不同的優(yōu)點(diǎn)和缺點(diǎn),并且難度,API 級(jí)別和復(fù)雜性各不相同。 它們?nèi)缦?#xff1a;

  • 第一種訓(xùn)練循環(huán)是tf.keras.Model.fit()。 這是一個(gè)內(nèi)置的訓(xùn)練循環(huán),可處理訓(xùn)練的所有方面,并為各種 Keras 提供統(tǒng)一的接口…

轉(zhuǎn)換時(shí)要注意的其他事項(xiàng)

從 TF 1.x 遷移到 TF 2.0 時(shí),還需要進(jìn)行其他幾個(gè)主要轉(zhuǎn)換。 比起我們先前描述的對(duì)話,要困難得多的對(duì)話是將以 TF-Slim 編寫的代碼轉(zhuǎn)換為 TF 2.0。

由于 TF-Slim 打包在tf.contrib.layers庫下,因此即使在兼容性模塊中,它也無法在 TF 2.0 中使用。 這意味著要將 TF-Slim 代碼轉(zhuǎn)換為 TF 2.0 格式,通常需要更改整個(gè)代碼動(dòng)態(tài)。

這包括從代碼中刪除參數(shù)范圍,因?yàn)樗袇?shù)在 TF 2.0 中都應(yīng)明確。 normalizer_fnactivation_fn函數(shù)應(yīng)分為各自的層。 請(qǐng)注意,TF-Slim 層的參數(shù)名稱和默認(rèn)值與tf.keras層不同。

將 TF-Slim 模型轉(zhuǎn)換為 TF 2.0 的最簡單方法是將其轉(zhuǎn)換為 TF 1.x 中的tf.layers API,然后將其轉(zhuǎn)換為tf.keras.layers。

另一個(gè)需要注意的轉(zhuǎn)換細(xì)節(jié)是,在 TF 2.0 中,所有指標(biāo)都是具有三種主要方法的對(duì)象:update_state()(添加新的觀察值),result()(獲取指標(biāo)的當(dāng)前結(jié)果)和reset_states()( 清除所有觀察結(jié)果。

度量對(duì)象也是可調(diào)用的,并且在新觀察值上調(diào)用時(shí),它們會(huì)累加值并返回最新結(jié)果。

以下示例向我們展示了如何在自定義訓(xùn)練循環(huán)中使用指標(biāo):

  1. 創(chuàng)建度量標(biāo)準(zhǔn)對(duì)象,該度量標(biāo)準(zhǔn)對(duì)象在每次調(diào)用時(shí)都會(huì)累積度量標(biāo)準(zhǔn)數(shù)據(jù):
loss_metric = tf.keras.metrics.Mean(name='train_loss')
accuracy_metric = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')@tf.function
def train_step(inputs, labels):with tf.GradientTape() as tape:predictions = model(inputs, training=True)regularization_loss = tf.math.add_n(model.losses)pred_loss = loss_fn(labels, predictions)total_loss = pred_loss + regularization_lossgradients = tape.gradient(total_loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))
  1. 更新指標(biāo):
loss_metric.update_state(total_loss)accuracy_metric.update_state(labels, predictions)for epoch in range(NUM_EPOCHS):
  1. 重置指標(biāo):
loss_metric.reset_states()accuracy_metric.reset_states()for inputs, labels in train_data:train_step(inputs, labels)
  1. 獲取度量結(jié)果:
mean_loss = loss_metric.result()
mean_accuracy = accuracy_metric.result()print('Epoch: ', epoch)
print(' loss: {:.3f}'.format(mean_loss))
print(' accuracy: {:.3f}'.format(mean_accuracy))

常見問題

在本節(jié)中,將解決有關(guān)從 TF 1.x 遷移到 TF 2.0 的一些常見問題。

用 TF 2.0 編寫的代碼的速度是否與基于圖的 TF 1.x 代碼相同?

是的,使用tf.functiontf.keras在 TF 2.0 中編寫的代碼將具有與 TF 1.x 相同的速度和最優(yōu)性。 正如我們?cè)诒菊虑懊嫣岬降哪菢?#xff0c;使用tf.function注解主要功能允許模型以圖模式運(yùn)行,并且該功能中的所有計(jì)算和邏輯都將編譯為一個(gè)計(jì)算圖。 使用tf.keras定義和訓(xùn)練 TensorFlow 模型也是如此。 使用model.fit方法還將在圖模式下訓(xùn)練模型,并具有所有優(yōu)點(diǎn)和優(yōu)化功能,這些優(yōu)點(diǎn)和優(yōu)點(diǎn)包括:

TF 2.0 的未來

TF 2.0 目前處于 beta 版本,因此仍在開發(fā)中。 即將出現(xiàn)的一些關(guān)鍵功能包括對(duì)包的修改,例如 TensorBoard,TensorFlow Lite,TensorFlow.js,用于 TensorFlow 的 Swift 和 TensorFlow Extended,以及對(duì)基本 API 的微小更改。 TensorBoard 將看到增強(qiáng)功能,例如改進(jìn)的超參數(shù)調(diào)優(yōu)功能,引入托管功能以使共享儀表板變得容易,并使插件能夠使用不同的前端技術(shù),例如 ReactJS。 TensorFlow Lite 將擴(kuò)大支持的操作范圍,將 TF 2.0 模型更輕松地轉(zhuǎn)換為 TFLite,并擴(kuò)展對(duì) Edge TPU 和 AIY 板的支持。 TensorFlow.js 和用于 TensorFlow 的 Swift 都將看到速度和性能方面的改進(jìn),并且很快將包含一組豐富的示例和帶有端到端教程的入門指南。 TF Extended 即將與 TF 2.0 基本 API 完全集成,并將包括完全協(xié)調(diào)的端到端工作流程和訓(xùn)練函數(shù)。

TF 2.0 基本 API 將包括針對(duì)任務(wù)的更多預(yù)制估計(jì)器,例如增強(qiáng)樹,隨機(jī)森林,最近鄰搜索和 k 均值聚類。 tf.distribute.Strategy模型將擴(kuò)展其對(duì) Keras 子模型,TPU 和多節(jié)點(diǎn)訓(xùn)練的支持,以在多個(gè)處理器上實(shí)現(xiàn)更優(yōu)化和更快的訓(xùn)練。

當(dāng)前正在開發(fā)的另一個(gè)主要附加功能是tf-agents模塊。 該模塊將核心強(qiáng)化學(xué)習(xí)算法實(shí)現(xiàn)為智能體,該算法定義了與環(huán)境進(jìn)行交互的策略并從集體經(jīng)驗(yàn)中訓(xùn)練了該策略。 TF-agents與 OpenAI Gym 框架一起實(shí)現(xiàn),并抽象了許多用于開發(fā)的關(guān)鍵強(qiáng)化學(xué)習(xí)算法。 該模塊當(dāng)前處于預(yù)發(fā)布狀態(tài),但將于今年晚些時(shí)候發(fā)布。

可看的更多資源

可以在 TensorFlow Beta 網(wǎng)站上找到教程和許多其他資源,其中包含有關(guān)創(chuàng)建和訓(xùn)練機(jī)器學(xué)習(xí)模型的關(guān)鍵因素的信息。 該頁面還為該領(lǐng)域的許多重要技術(shù)提供了許多有用的端到端教程。

可以在網(wǎng)站上找到 TF 2.0 的官方文檔,以及該模塊中每個(gè) API 的詳細(xì)文檔。 該站點(diǎn)還具有指向其他 TensorFlow 模塊和功能的鏈接。

TensorFlow Medium 博客還提供有關(guān) TensorFlow 庫和服務(wù)狀態(tài)的許多更新,并且源源不斷的有用新聞和…

總結(jié)

本章介紹了兩種將 TF 1.x 代碼轉(zhuǎn)換為 TF 2.0 代碼的方法。 第一種方法是使用隨附的升級(jí)腳本,該腳本會(huì)將所有 API 調(diào)用從tf.x更改為tf.compat.v1.x。 這允許 TF 1.x 代碼在 TF 2.0 中運(yùn)行,但不會(huì)從 TF 2.0 中帶來的升級(jí)中受益。 第二種方法是將 TF 1.x 更改為慣用的 TF 2.0 代碼,這涉及兩個(gè)步驟。 第一步是將所有模型創(chuàng)建代碼更改為 TF 2.0 代碼,這涉及使用對(duì)函數(shù)的sess.run調(diào)用,以及將占位符和字典饋入函數(shù)的參數(shù)來更改張量。 使用tf.layers API 創(chuàng)建的模型與tf.keras.layers具有一對(duì)一的比較。 第二步是通過使用tf.keras.Model.fit或帶有tf.GradientTape的自定義訓(xùn)練循環(huán)來升級(jí)訓(xùn)練管道。

TF 2.0 改變了 TensorFlow 代碼的編寫和組織方式。 TF 2.0 中的一些主要更改是對(duì)主模塊中 API 的重組和清理。 這包括刪除tf.contrib模塊。 其他更改包括增加了代碼范圍內(nèi)的急切執(zhí)行,以簡化調(diào)試和使用范圍。 由于急切執(zhí)行,因此在 TF 2.0 中創(chuàng)建的變量的行為類似于普通的 Python 變量。 這意味著用于處理全局變量的 TF 1.x API 已過時(shí),因此已在 TF 2.0 中刪除。 這使我們到書的結(jié)尾!

http://m.aloenet.com.cn/news/33181.html

相關(guān)文章:

  • 做網(wǎng)站的成本有多少網(wǎng)絡(luò)媒體軟文案例
  • 幫人做網(wǎng)站賺錢小程序開發(fā)制作
  • 南寧建站軟件小廣告公司如何起步
  • 網(wǎng)站備案信息查詢百度小說排行榜2020前十名
  • 怎么做用戶調(diào)研網(wǎng)站軟文
  • 大理網(wǎng)站設(shè)計(jì)如何讓百度收錄網(wǎng)址
  • 河南推廣網(wǎng)站的公司怎樣在網(wǎng)上推廣自己的產(chǎn)品
  • 打開汽車之家網(wǎng)頁版網(wǎng)絡(luò)seo外包
  • 怎么做素材網(wǎng)站上海最新政策
  • 2016年做網(wǎng)站好不好qq推廣鏈接生成
  • 網(wǎng)站舉報(bào)平臺(tái)12315怎樣制作網(wǎng)頁設(shè)計(jì)
  • 男人和女人晚上做污污的視頻大網(wǎng)站ip子域名大全
  • 企業(yè)查詢平臺(tái)免費(fèi)廣州網(wǎng)站優(yōu)化頁面
  • 七臺(tái)河新聞?lì)^條最新消息網(wǎng)站優(yōu)化排名易下拉穩(wěn)定
  • 俄羅斯外貿(mào)常用網(wǎng)站海淀區(qū)seo搜索引擎
  • 源代碼管理網(wǎng)站百度推廣優(yōu)化方案
  • 佛山外貿(mào)網(wǎng)站設(shè)計(jì)高手優(yōu)化網(wǎng)站
  • 四川高速公路建設(shè)集團(tuán)網(wǎng)站網(wǎng)站設(shè)計(jì)與開發(fā)
  • 淘寶裝修免費(fèi)模板有哪些網(wǎng)站網(wǎng)站制作公司咨詢
  • 凡科專屬網(wǎng)站免費(fèi)注冊(cè)外鏈生成工具
  • 哪個(gè)網(wǎng)站做推銷產(chǎn)品品牌seo主要做什么
  • 貴州網(wǎng)站建設(shè)360指數(shù)查詢工具
  • 做政府網(wǎng)站話術(shù)seo系統(tǒng)是什么意思
  • ps做網(wǎng)站需要幾個(gè)畫布lol今日賽事直播
  • 北京北京網(wǎng)站建設(shè)seo是什么意思啊
  • 網(wǎng)站客戶端制作鄭州網(wǎng)絡(luò)推廣培訓(xùn)
  • 網(wǎng)站建設(shè)制作 企業(yè)站開發(fā)哪家好制作網(wǎng)站需要多少費(fèi)用
  • 關(guān)鍵詞優(yōu)化排名首頁安徽網(wǎng)站優(yōu)化
  • 個(gè)人備案經(jīng)營網(wǎng)站優(yōu)化設(shè)計(jì)三要素
  • 做批手表批發(fā)發(fā)的網(wǎng)站站外推廣怎么做