# 一、入門
計算機視覺是理解或操縱圖像和視頻的科學。 計算機視覺具有許多應用,包括自動駕駛,工業檢查和增強現實。 深度學習在計算機視覺中的使用可以分為多個類別:圖像和視頻中的分類,檢測,分割和生成。 在本書中,您將學習如何為計算機視覺應用訓練深度學習模型并將其部署在多個平臺上。 我們將在本書中使用 **TensorFlow**,這是一個用于深入學習的流行 python 庫,用于示例。 在本章中,我們將介紹以下主題:
* 深度學習的基礎知識和詞匯
* 深度學習如何滿足計算機視覺?
* 設置將用于本書所涵蓋示例的開發環境
* 體驗 TensorFlow 及其強大的工具,例如 TensorBoard 和 TensorFlow Serving
# 了解深度學習
計算機視覺作為一個領域有著悠久的歷史。 隨著深度學習的出現,計算機視覺已被證明可用于各種應用。 深度學習是來自**人工神經網絡**(**ANN**)的技術的集合,這是機器學習的一個分支。 人工神經網絡以人腦為模型。 有彼此鏈接的節點,它們彼此傳遞信息。 在以下各節中,我們將通過了解常用的基本術語來詳細討論深度學習的工作原理。
# 感知機
人工神經元或感知機接受多個輸入并執行加權求和以產生輸出。 感知機的權重是在訓練過程中確定的,并基于訓練數據。 以下是感知機的圖:

如上圖所示,對輸入進行加權和求和。 然后,對于二分類問題,該總和然后通過單位步長函數傳遞。 感知機只能通過從示例中學習權重來學習簡單函數。 學習權重的過程稱為訓練。 可以通過基于梯度的方法對感知機進行訓練,這將在后面的部分中進行介紹。 感知機的輸出可以通過 `activation` 函數或 `transfer` 函數傳遞,這將在下一部分中進行說明。
# 激活函數
`activation`函數使**神經網絡**成為非線性。 激活函數決定是否應觸發感知機。 在訓練激活期間,函數在調整梯度中起著重要作用。 下一節所示的`activation`函數(如 Sigmoid)會衰減較大幅度的值。 `activation`函數的這種非線性行為為學習復雜函數提供了深層網絡。 `activation`的大多數函數是連續和微分函數,但整流單元為 0 除外。輸入的每一個小變化,連函數能的輸出都會有很小的變化。 微分函數在域中的每個點都有一個導數。
為了訓練神經網絡,函數必須是可微的。 以下是一些`activation`函數。
如果您不了解諸如連續性和可微分性之類的術語,請不要擔心。 在各章中將變得更加清楚。
# Sigmoid
Sigmoid 可以看作是平滑的階躍函數,因此可以微分。 Sigmoid 可用于將任何值轉換為概率,并可用于二分類。 Sigmoid 映射將輸入映射到 0 到 1 范圍內的值,如下圖所示:

相對于`X`的`Y`值的變化將很小,因此,梯度將消失。 經過一番學習之后,變化可能很小。 在下一節中介紹的另一個稱為`tanh`的激活函數是 Sigmoid 曲線的縮放比例版本,避免了梯度消失的問題。
# 雙曲正切函數
雙曲正切函數或 `tanh` 是 Sigmoid 曲線的縮放形式。 像 Sigmoid 一樣,它是光滑且可微分的。 `tanh`將輸入映射到 -1 到 1 的值,如下圖所示:

梯度比 S 形更穩定,因此減少了消失的梯度問題。 Sigmoid 和`tanh`一直在發射,這使 ANN 變得很沉重。 下一節中介紹的**整流線性單元**(**ReLU**)激活函數通過不觸發而避免了這種陷阱。
# 整流線性單元(ReLU)
ReLu 可以讓大量數字通過。 這會使一些神經元陳舊,并且它們不會發射。 這增加了稀疏性,因此很好。 `ReLU`將輸入`x`映射到`max(0, x)`,即,它們將負輸入映射為 0,而正輸入無任何變化,如下圖所示:

由于 ReLU 不會一直觸發,因此可以更快地進行訓練。 由于功能簡單,因此在計算上最便宜。 選擇`activation`函數在很大程度上取決于應用。 盡管如此,ReLU 在許多問題上都運行良好。 在下一節中,您將學習如何將幾個感知機堆疊在一起,這些感知機可以學習比感知機更復雜的函數。
# 人工神經網絡(ANN)
ANN 是感知機函數的集合。 感知機連接形成隱藏的層或單元。 隱藏的單元形成了將低層空間中的輸入層映射到輸出層的非線性基礎,這也稱為人工神經網絡。 ANN 是從輸入到輸出的映射。 該圖是通過將輸入與偏差進行加權相加來計算的。 權重和偏置值以及架構稱為`model`。
訓練過程確定這些權重和偏置的值。 在訓練開始時,使用隨機值初始化模型值。 通過使用損失函數將誤差與基本事實進行對比來計算誤差。 根據計算出的損耗,在每一步調整權重。 如果無法進一步減少誤差,則停止訓練。 訓練過程會在訓練過程中學習特征。 這些特征比原始圖像更好地表示。 以下是人工神經網絡或多層感知機的示意圖:

*x* 的多個輸入通過感知機的隱藏層傳遞并求和。 通用逼近定理表明,這樣的神經網絡可以逼近任何函數。 隱藏層也可以稱為密集層。 每個層都可以具有上一節中描述的`activation`函數之一。 可以根據問題選擇隱藏層和感知機的數量。 還有更多的事情可以使此多層感知機適用于多類分類問題。 一個多類別的分類問題試圖區分十多個類別。 我們將在以下各節中探討這些術語。
# 單熱編碼
單熱編碼是在出現分類問題時表示目標變量或類的一種方式。 目標變量可以從字符串標簽轉換為一鍵編碼的向量。 單熱向量在目標類別的索引處填充有`1`,但在其他所有地方填充有`0`。 例如,如果目標類別是貓和狗,則可以分別用`[1, 0]`和`[0, 1]`。 對于 1,000 個類別,單熱向量的大小為 1,000 整數,全為零,但有一個`1`。 它不假設目標變量的相似性。 通過在下一節中說明的一鍵編碼和 softmax 的組合,可以在 ANN 中實現多類分類。
# Softmax
Softmax 是一種強制神經網絡輸出 1 之和的方法。因此,`softmax`函數的輸出值可以視為概率分布的一部分。 這在多類分類問題中很有用。 Softmax 是一種`activation`函數,其特征是輸出求和為 1。通過將輸出除以所有其他值的總和,可以將輸出轉換為概率。 歐幾里德距離可以在 softmax 概率和一鍵編碼之間進行計算,以進行優化。 但是下一部分將說明的交叉熵是一個更好的成本函數,可以進行優化。
# 交叉熵
交叉熵比較 softmax 和一鍵編碼輸出之間的距離。 交叉熵是一種損失函數,必須將其誤差降至最低。 神經網絡估計每個類別給定數據的概率。 必須將概率最大化到正確的目標標簽。 交叉熵是負對數概率的總和。 對數值用于數值穩定性。 最大化一個函數等同于最小化相同函數的負數。 在下一節中,我們將看到以下正則化方法,以避免 ANN 的過擬合:
* 丟棄法
* 批量規范化
* L1 和 L2 歸一化
# 丟棄法
丟棄法是規整神經網絡以避免 ANN 過擬合的有效方法。 在訓練期間,丟棄層通過隨機刪除隱藏的單元來破壞神經網絡,如下圖所示:

請注意如何隨機訓練神經元。 丟棄也是組合多個神經網絡的有效方法。 對于每個訓練案例,我們隨機選擇一些隱藏的單元,以便最終為每個案例使用不同的架構。 這是裝袋和模型平均的極端情況。 推斷期間不應使用丟棄層,因為沒有必要。
# 批量規范化
批量規范化或批量規范可提高神經網絡訓練的穩定性和表現。 它將平均值為零且標準差為 1 的層的輸出歸一化。這減少了過擬合,并使網絡訓練更快。 這對于訓練復雜的神經網絡非常有用。
# L1 和 L2 正則化
L1 懲罰權重的絕對值,并趨于使權重為零。 L2 懲罰權重的平方值,并且在訓練過程中傾向于使權重更小。 兩個正則化均假設權重較小的模型更好。
# 訓練神經網絡
訓練 ANN 非常棘手,因為它包含多個要優化的參數。 權重的更新過程稱為反向傳播。 最小化誤差的過程稱為優化。 我們將在下一節中詳細介紹這兩個方面。
# 反向傳播
反向傳播算法通常用于訓練人工神經網絡。 權重根據計算的誤差從后向更新,如下圖所示:

在計算了誤差之后,可以使用梯度下降來計算權重更新,如下一節中所述。
# 梯度下降
梯度下降算法執行多維優化。 目標是達到全局最高水平。 梯度下降是許多機器學習模型中使用的一種流行的優化技術。 它用于改善或優化模型預測。 梯度下降的一種實現稱為**隨機梯度下降**(**SGD**),在神經網絡中正變得越來越流行(在下一節中說明)。 優化涉及計算誤差值并更改權重以實現最小誤差。 找到最小值的方向是`loss`函數的梯度的負值。 下圖定性顯示了梯度下降過程:

學習速度決定了每個步驟應該多大。 注意,具有非線性激活的 ANN 將具有局部最小值。 SGD 在實踐中更好地用于優化非凸成本函數。
# 隨機梯度下降
SGD 與梯度下降相同,區別在于 SGD 每次僅用于部分數據訓練。 該參數稱為小批量大小。 從理論上講,甚至可以使用一個示例進行訓練。 在實踐中,最好嘗試各種數字。 在下一部分中,我們將討論比標準 ANN 在圖像數據上更有效的卷積神經網絡。
訪問[這里](https://yihui.name/animation/example/grad-desc/),可以很好地看到凸面和非凸面的梯度下降情況。
# 玩轉 TensorFlow 游樂場
TensorFlow 游樂場是神經網絡的交互式可視化。 訪問[這里](http://playground.tensorflow.org/),方法是通過更改參數來查看前面提到的項如何協同工作。 這是操場的屏幕截圖:

TensorFlow 游樂場中的儀表板
如前所示,讀者可以更改學習率,激活,正則化,隱藏單元和層,以了解其如何影響訓練過程。 您可以花費一些時間來調整參數,以直觀了解神經網絡如何處理各種數據。
# 卷積神經網絡
**卷積神經網絡**(**CNN**)與前面各節中描述的神經網絡相似。 CNN 具有權重,偏差和通過非線性激活產生的輸出。 規則的神經網絡接受輸入,并且神經元完全連接到下一層。 同一層中的神經元不共享任何連接。 如果我們對圖像使用常規的神經網絡,由于神經元數量眾多,它們的大小將非常大,從而導致過擬合。 我們不能將其用于圖像,因為圖像尺寸較大。 增加模型大小,因為它需要大量的神經元。 可以將圖像視為具有高度,寬度和深度尺寸的體積。 深度是圖像的通道,它是紅色,藍色和綠色。 CNN 的神經元以體積方式排列,以利用體積。 每個層都將輸入體積轉換為輸出體積,如下圖所示:

卷積神經網絡過濾器通過變換進行編碼。 學到的濾鏡可以檢測圖像中的特征或圖案。 層越深,圖案越抽象。 一些分析表明,這些層具有檢測邊緣,角和圖案的能力。 CNN 層中的可學習參數小于上一節中描述的密集層。
# 核
內核是用于對圖像進行卷積的參數卷積層。 卷積操作如下圖所示:

內核有兩個參數,稱為步幅和大小。 大小可以是矩形的任何尺寸。 步幅是每次移動的像素數。 長度為 1 的步幅產生幾乎相同大小的圖像,長度為 2 的步幅產生一半大小。 填充圖像將有助于獲得相同的輸入大小。
# 最大池
池化層位于卷積層之間。 合并層通過采樣減小了跨層圖像的大小。 通過在窗口中選擇最大值來完成采樣。 窗口中的平均池平均值。 池化還可以作為一種正則化技術來避免過擬合。 在特征的所有通道上進行池化。 合并也可以進行各種步驟。
窗口的大小是 CNN 接收場的量度。 下圖顯示了最大池化的示例:

CNN 是任何計算機視覺深度學習模型中最重要的組成部分。 毫不夸張地說,沒有 CNN,任何計算機都不可能擁有視覺。 在下一部分中,我們將討論幾個可用于一些應用的高級層。
訪問[這里](https://www.youtube.com/watch?v=jajksuQW4mc),以獲取有關 CNN 和最大池操作的出色可視化。
# 循環神經網絡(RNN)
**循環神經網絡**(**RNN**)可以對順序信息進行建模。 他們不假定數據點密集。 它們從一系列序列數據的先前數據的輸出執行相同的任務。 這也可以被視為記憶。 RNN 無法記住更長的序列或更長的時間。 在訓練過程中將其展開,如下圖所示:

如上圖所示,該步驟每次都展開和訓練。 在反向傳播期間,梯度會隨著時間消失。 為了克服此問題,可以使用較長的短期記憶來記憶較長的時間。
# 長短期記憶(LSTM)
**長短期記憶**(**LSTM**)可以存儲較長時間的信息,因此,它可以有效地捕獲長期效率。 下圖說明了如何設計 LSTM 單元:

LSTM 有幾個門:忘記,輸入和輸出。 忘記門保持信息先前的狀態。 輸入門使用輸入更新當前狀態。 輸出門決定將信息傳遞到下一個狀態。 忘記和保留重要內容的能力使 LSTM 可以在更長的時間內記住。 您已經學習了將在整本書中使用的深度學習詞匯。 在下一節中,我們將了解如何在計算機視覺的背景下使用深度學習。
# 用于計算機視覺的深度學習
計算機視覺在計算機上實現了人類視覺的特性。 計算機可以是智能手機,無人機,閉路電視,MRI 掃描儀等形式,并帶有各種感知傳感器。 傳感器產生數字形式的圖像,必須由計算機解釋。 下一部分將說明這種解釋或智能的基本構成部分。 使用深度學習技術可以有效解決計算機視覺中出現的各種問題。
# 分類
圖像分類是充滿信心地用對象或概念標記整個圖像的任務。 這些應用包括給定人臉圖像的性別分類,識別寵物的類型,為照片添加標簽等。 以下是此類分類任務的輸出:

第 2 章, “圖像分類”詳細介紹了可用于分類任務的方法,在第 3 章“圖像檢索”,我們使用分類模型對深度學習模型進行可視化并檢索相似的圖像。
# 檢測或定位和分割
檢測或定位是一項在圖像中找到對象并使用邊界框定位該對象的任務。 這項任務有許多應用,例如為自動駕駛汽車尋找行人和招牌。 下圖是檢測的示意圖:

分割是進行像素分類的任務。 這樣可以很好地分離對象。 這對于處理醫學圖像和衛星圖像很有用。 更多示例和說明可以在第 4 章,對象檢測和第 5 章,“圖像分割”中找到。
# 相似性學習
相似性學習是學習兩個圖像如何相似的過程。 可以基于語義含義在兩個圖像之間計算分數,如下圖所示:

從發現相似產品到執行人臉識別,此方法有多種應用。 第 6 章,“相似性學習”處理相似性學習技術。
# 圖片字幕
圖像標題是用文本描述圖像的任務,如下所示:

經 Vinyals 等人許可復制。
第 8 章,“圖像字幕生成”詳細介紹了圖像字幕生成。 這是將**自然語言處理**(**NLP**)和計算機視覺技術相結合的獨特情況。
# 生成模型
生成模型在生成圖像時非常有趣。 以下是樣式轉換應用的示例,其中使用該圖像的內容和其他圖像的樣式生成圖像:

經 Gatys 等人許可復制。
可以出于其他目的生成圖像,例如新的訓練示例,超分辨率圖像等。 第 7 章“生成模型”詳細介紹了生成模型。
# 視頻分析
與以前的情況相比,視頻分析處理的是整個視頻,而不是圖像。 它具有多種應用,例如運動跟蹤,入侵檢測和監視攝像機。 第 9 章“視頻分類”處理特定于視頻的應用。 時間數據的新維度帶來了許多有趣的應用。 在下一節中,我們將看到如何設置開發環境。
# 開發環境設置
在本節中,我們將設置編程環境,該環境對于遵循本書其余部分中的示例非常有用。 讀者可以選擇以下操作系統:
* **開發操作系統**(**OS**),例如 Mac,Ubuntu 或 Windows
* **部署操作系統**(例如 Mac,Windows,Android,iO 或 Ubuntu)安裝在云平臺(例如 **Amazon Web Services**(**AWS**), **谷歌云平臺**(**GCP**),Azure,Tegra,Raspberry Pi
無論使用哪種平臺,本書中開發的所有代碼均應運行無任何問題。 在本章中,我們將介紹開發環境的安裝過程。 在第 10 章“部署”中,我們將介紹在各種其他環境(例如 AWS,GCP,Azure,Tegra 和 Raspberry Pi)中的部署安裝。
# 硬件和操作系統 - OS
對于開發環境,您需要具有很多計算能力,因為訓練在計算上非常昂貴。 Mac 用戶相當受限于計算能力。 Windows 和 Ubuntu 用戶可以使用更多處理器和**通用圖形處理單元**(**GP-GPU**),來增強其開發環境。 下一節將對此進行說明。
# 通用圖形處理單元 - GP-GPU
GP-GPU 是一種特殊的硬件,可加快訓練深度學習模型的訓練過程。 NVIDIA 公司提供的 GP-GPU 由于具有完善的軟件和社區支持,因此在深度學習訓練和部署中非常受歡迎。 讀者可以設置帶有此類 GP-GPU 的機器以進行更快的訓練。 有很多選擇,讀者可以根據預算選擇一個。 選擇與 GP-GPU 功率相對應的 RAM,CPU 和硬盤也很重要。 安裝硬件后,必須安裝以下驅動程序和庫。 使用 Mac 或不使用 GP-GPU 的 Windows/Ubuntu 的讀者可以跳過安裝。
以下是設置環境所需的庫:
* **計算機統一設備架構**(**CUDA**)
* **CUDA 深度神經網絡**(**CUDNN**)
# 計算機統一設備架構 - CUDA
CUDA 是 NVIDIA 使用 GPU 的并行特性提供的 API 層。 安裝此驅動程序后,還將安裝硬件驅動程序。 首先,[從 NVIDIA 門戶網站下載`CUDA`庫](https://developer.nvidia.com/cuda-downloads)。
按照頁面上的說明進行操作,下載驅動程序,然后按照安裝說明進行操作。 這是 Ubuntu CUDA 的屏幕截圖和安裝說明:

這些命令將安裝所需的`cuda-drivers`和其他 CUDA API。
您可以通過在命令提示符下鍵入`nvidia-smi`來檢查驅動程序是否正確安裝。
# CUDA 深度神經網絡 - CUDNN
`CUDNN`庫為深度學習算法提供了原語。 由于此包由 NVIDIA 提供,因此對其硬件進行了高度優化,并且運行速度更快。 該包提供了幾種用于深度學習的標準例程。 著名的深度學習庫(例如`tensorflow`,`caffe`等)使用這些包。 在下一節中,將提供安裝`CUDNN`的說明。 您可以從 [NVIDIA 門戶網站](https://developer.nvidia.com/rdp/cudnn-download)下載`CUDNN`。
用戶帳戶是必需的(免費注冊)。
將相關文件復制到`CUDA`文件夾,使其更快地在 GPU 上運行。 我們不會直接使用`CUDA`和`CUDNN`庫。 Tensorflow 使用這些來優化例程在 GP-GPU 上工作。
# 安裝包
訓練有素的深度學習模型需要幾個庫。 我們將安裝以下庫,并查看在競爭包中選擇以下包的原因:
* Python 和其他依賴項
* OpenCV
* TensorFlow
* Keras
# Python
Python 是任何數據科學應用的實際選擇。 它擁有最大的社區和庫支持生態系統。 用于 Python 的 TensorFlow API 是最完整的,因此,Python 是首選的自然語言。 Python 有兩個版本-Python2.x 和 Python3.x。 在本書中,我們將討論 Python3.x。 這種選擇有幾個原因:
* 到 2020 年,Python 2.x 的開發將停止,因此,Python3.x 是 Python 的未來
* Python 3.x 避免了原始實現中的許多設計缺陷
* 與普遍的看法相反,Python3.x 具有與 Python 2.x 一樣多的數據科學支持庫。
在本書中,我們將使用 Python 版本 3。 轉到[這里](https://www.python.org/downloads/),然后根據操作系統下載版本 3。 按照下載鏈接中給出的步驟安裝 Python。 安裝 Python 后,必須安裝 **PIP3**,以方便安裝 Python 包。 然后通過輸入以下命令安裝幾個 Python 包,以便以后可以安裝`OpenCV`和`tensorflow`:
```py
sudo pip3 install numpy scipy scikit-learn pillow h5py
```
先前安裝的包的說明如下:
* `numpy` 是高度優化的數值計算包。 它具有強大的 N 維封裝數組對象,并且`numpy`庫的矩陣運算針對速度進行了高度優化。 圖像可以存儲為 3 維`numpy`對象。
* `scipy` 有一些用于科學和工程計算的例程。 在本書的后面,我們將使用一些優化包。
* `scikit-learn` 是一個機器學習庫,我們將使用其中的許多輔助函數。
* `Ppillow`對于圖像加載和基本操作很有用。
* `H5py`包是 HDF5 二進制數據格式的 Pythonic 接口。 這是存儲使用 Keras 訓練的模型的格式。
# 開放式計算機視覺 - OpenCV
`OpenCV`是著名的計算機視覺庫。 該庫中有許多可用的圖像處理例程,這些例程很有用。 以下是在 Ubuntu 中安裝 OpenCV 的步驟。
```py
sudo apt-get install python-opencv
```
對于其他操作系統,可以在[這里](https://opencv.org/)找到類似的步驟。 它是跨平臺的,針對 CPU 密集型應用進行了優化。 它具有多種編程語言的接口,并且受 Windows,Ubuntu 和 Mac 支持。
# TensorFlow 庫
`tensorflow`是一個用于開發和部署深度學習模型的開源庫。 TensorFlow 使用計算圖進行數據流和數值計算。 換句話說,數據或張量流經圖,因此名稱為`tensorflow`。 該圖具有可進行任何數值計算的節點,因此適用于深度學習操作。 它為各種平臺和硬件提供了一個 API。 TensorFlow 在后端處理擴展和優化的所有復雜性。 它最初是為在 Google 上進行研究而開發的。 它是最著名的深度學習庫,擁有大型社區,并提供用于生產中的可視化和部署的工具。
# 安裝 TensorFlow
使用以下命令,使用 PIP3 為 CPU 安裝`tensorflow`:
```py
sudo pip3 install tensorflow
```
如果您使用的是 GPU 硬件,并且已安裝`CUDA`和`CUDNN`,請使用以下命令安裝`tensorflow`的 GPU 版本:
```py
sudo pip3 install tensorflow-gpu
```
現在`tensorflow`已安裝并可以使用。 我們將嘗試一些示例以了解 TensorFlow 的工作原理。
# 打印 Hello,TensorFlow 的 TensorFlow 示例
我們將直接在 Python Shell 中使用 TensorFlow 進行示例。 在此示例中,我們將使用 TensorFlow 打印您好,TensorFlow 。
1. 通過在命令提示符下鍵入以下命令,從 shell 調用 Python:
```py
python3
```
2. 通過輸入以下命令導入`tensorflow`庫:
```py
>>> import tensorflow as tf
```
3. 接下來,使用字符串`Hello, TensorFlow`定義一個常量。 這與通常的 Python 賦值操作不同,因為該值尚未初始化:
```py
>>> hello = tf.constant('Hello, TensorFlow!')
```
4. 創建一個會話以初始化計算圖,并為該會話命名:
```py
>>> session = tf.Session()
```
可以使用變量`hello`作為參數運行會話。
5. 現在,該圖執行并返回打印的特定變量:
```py
>>> print(session.run(hello))
```
它應該打印以下內容:
```py
Hello, TensorFlow!
```
讓我們再看一個示例,以了解會話和圖的工作方式。
訪問[這里](https://github.com/rajacheers/DeepLearningForComputerVision)獲取本書中所有示例的代碼。 該代碼將根據章節進行組織。 您可以提出問題并在存儲庫中獲得幫助。
# 將兩個數字相加 的 TensorFlow 示例
這是如何使用 TensorFlow 將兩個數字相加的另一個簡單示例。
1. 創建一個 Python 文件并使用以下代碼導入`tensorflow`:
```py
import tensorflow as tf
```
對于所有后面的示例,前面的導入都是必需的。 假定讀者已經為所有示例導入了庫。 可以通過以下方式定義`placeholder`。 占位符在分配時不會加載。 在此,將變量定義為類型為`float32`的`placeholder`。 `placeholder`是一個空聲明,并且在運行會話時可以采用值。
2. 現在我們定義一個`placeholder`,如以下代碼所示:
```py
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
```
3. 現在,可以將占位符的求和運算定義為通常的加法運算。 在這里,不執行操作,而只是使用以下代碼定義:
```py
z = x + y
```
4. 可以如前面的示例所示創建會話。 如下所示定義時,該圖即可執行計算:
```py
session = tf.Session()
```
5. 以字典格式定義`placeholder`的值:
```py
values = {x: 5.0, y: 4.0}
```
6. 使用變量`c`和值運行會話。 該圖將值提供給適當的占位符,并為變量`c`取回值:
```py
result = session.run([z], values) print(result)
```
作為添加結果,該程序應打印[ 9.0 ]。
可以理解,這不是將兩個數字相加的最佳方法。 該示例旨在了解 TensorFlow 中如何定義張量和操作。 想象一下使用一萬億個數字并將它們相加會多么困難。 TensorFlow 可以使用相同的 API 輕松實現這種擴展。 在下一節中,我們將看到如何安裝和使用 TensorBoard 和 TensorFlow 服務。
# TensorBoard
TensorBoard 是一套可視化工具,用于使用 TensorFlow 訓練基于深度學習的模型。 可以在 TensorBoard 中可視化以下數據:
* **圖**:計算圖,設備位置和張量詳細信息
* **標量**:指標,例如損失,迭代精度
* **圖像**:用于查看帶有相應標簽的圖像
* **音頻**:用于收聽訓練或生成的音頻
* **分布**:用于查看某些標量的分布
* **直方圖**:包括權重和偏置的直方圖
* **投影器**:幫助可視化 3 維空間中的數據
* **文本**:打印訓練文本數據
* **配置文件**:查看用于訓練的硬件資源
Tensorboard 與 TensorFlow 一起安裝。 轉到 python3 提示符并輸入以下命令(類似于上一個示例)以開始使用 Tensorboard:
```py
x = tf.placeholder(tf.float32, name='x')
y = tf.placeholder(tf.float32, name='y')
z = tf.add(x, y, name='sum')
```
請注意,已將參數名稱作為占位符和操作的附加參數提供。 這些是我們可視化圖時可以看到的名稱。 現在我們可以在 TensorBoard 中使用以下命令將圖寫入特定的文件夾:
```py
session = tf.Session()
summary_writer = tf.summary.FileWriter('/tmp/1', session.graph)
```
此命令將圖寫入磁盤到參數中給定的特定文件夾中。 現在可以使用以下命令調用 Tensorboard:
```py
tensorboard --logdir=/tmp/1
```
可以將任何目錄作為`logdir`選項的參數傳遞,該選項用于存儲文件。 轉到瀏覽器并粘貼以下 URL 以開始可視化以訪問 TensorBoard:
```py
http://localhost:6006/
```
瀏覽器應顯示如下內容:

瀏覽器窗口中的 TensorBoard 可視化
顯示加法圖,并為占位符指定名稱。 單擊它們時,我們可以在右側看到該操作的所有張量細節。 使自己熟悉選項卡和選項。 此窗口有幾個部分。 我們將在不同的章節中了解它們。 TensorBoard 是 TensorFlow 中最好的區分工具之一,這使其比其他任何深度學習框架都更好。
# TensorFlow Serving 工具
TensorFlow Serving 是 TensorFlow 中的工具,專為靈活的部署環境而開發,可提供高延遲和吞吐量的環境。 使用 TensorFlow 訓練的任何深度學習模型都可以與服務一起部署。 通過運行以下命令來安裝 Serving:
```py
sudo apt-get install tensorflow-model-server
```
有關如何使用服務的逐步說明,將在第 3 章,“圖像檢索”中進行介紹。 請注意,僅在 Ubuntu 中即可輕松安裝 Serving; 對于其他操作系統,請參考[這里](https://www.tensorflow.org/serving/setup)。 下圖說明了 TensorFlow Serving 和 TensorFlow 在生產環境中如何交互:

訓練過程可以產生許多模型,Serving 會無縫切換它們,而不會造成任何停機。 除了第 3 章,“圖像檢索”和第 10 章,“部署”之外,以下各章均不需要 TensorFlow Serving。
# Keras
`Keras`是一個用 Python 編寫的用于深度學習的開源庫。 它提供了一個簡單的接口來使用 TensorFlow 作為后端。 Keras 還可以與 Theano,深度學習 4j 或 CNTK 一起用作后端。 Keras 通過專注于友好性,模塊化和可擴展性而設計用于輕松快速地進行實驗。 它是一個獨立的框架,可以在 CPU 和 GPU 之間無縫運行。 Keras 可以單獨安裝,也可以使用`tf.keras` API 在 TensorFlow 本身中使用。 在本書中,我們將使用`tf.keras` API。 我們已經看到了安裝開發環境所需的庫的步驟。 順利安裝 CUDA,CUDNN,OpenCV,TensorFlow 和 Keras 并對以下章節至關重要。
# 總結
本章涵蓋了深度學習的基礎知識。 本章介紹的詞匯將在整本書中使用,因此,您可以經常參考本章。 示例還顯示了計算機視覺的應用。 還介紹了用于開發環境的各種平臺的所有包的安裝。
在下一章中,我們將討論如何在數據集上使用 Keras 和 TensorFlow 訓練分類模型。 我們將研究如何使用更大的模型和其他技術(例如增強和微調)來提高準確率。 然后,我們將看到由世界各地的幾個人提出的幾種先進模型,它們在比賽中達到了最佳準確率。
- TensorFlow 1.x 深度學習秘籍
- 零、前言
- 一、TensorFlow 簡介
- 二、回歸
- 三、神經網絡:感知器
- 四、卷積神經網絡
- 五、高級卷積神經網絡
- 六、循環神經網絡
- 七、無監督學習
- 八、自編碼器
- 九、強化學習
- 十、移動計算
- 十一、生成模型和 CapsNet
- 十二、分布式 TensorFlow 和云深度學習
- 十三、AutoML 和學習如何學習(元學習)
- 十四、TensorFlow 處理單元
- 使用 TensorFlow 構建機器學習項目中文版
- 一、探索和轉換數據
- 二、聚類
- 三、線性回歸
- 四、邏輯回歸
- 五、簡單的前饋神經網絡
- 六、卷積神經網絡
- 七、循環神經網絡和 LSTM
- 八、深度神經網絡
- 九、大規模運行模型 -- GPU 和服務
- 十、庫安裝和其他提示
- TensorFlow 深度學習中文第二版
- 一、人工神經網絡
- 二、TensorFlow v1.6 的新功能是什么?
- 三、實現前饋神經網絡
- 四、CNN 實戰
- 五、使用 TensorFlow 實現自編碼器
- 六、RNN 和梯度消失或爆炸問題
- 七、TensorFlow GPU 配置
- 八、TFLearn
- 九、使用協同過濾的電影推薦
- 十、OpenAI Gym
- TensorFlow 深度學習實戰指南中文版
- 一、入門
- 二、深度神經網絡
- 三、卷積神經網絡
- 四、循環神經網絡介紹
- 五、總結
- 精通 TensorFlow 1.x
- 一、TensorFlow 101
- 二、TensorFlow 的高級庫
- 三、Keras 101
- 四、TensorFlow 中的經典機器學習
- 五、TensorFlow 和 Keras 中的神經網絡和 MLP
- 六、TensorFlow 和 Keras 中的 RNN
- 七、TensorFlow 和 Keras 中的用于時間序列數據的 RNN
- 八、TensorFlow 和 Keras 中的用于文本數據的 RNN
- 九、TensorFlow 和 Keras 中的 CNN
- 十、TensorFlow 和 Keras 中的自編碼器
- 十一、TF 服務:生產中的 TensorFlow 模型
- 十二、遷移學習和預訓練模型
- 十三、深度強化學習
- 十四、生成對抗網絡
- 十五、TensorFlow 集群的分布式模型
- 十六、移動和嵌入式平臺上的 TensorFlow 模型
- 十七、R 中的 TensorFlow 和 Keras
- 十八、調試 TensorFlow 模型
- 十九、張量處理單元
- TensorFlow 機器學習秘籍中文第二版
- 一、TensorFlow 入門
- 二、TensorFlow 的方式
- 三、線性回歸
- 四、支持向量機
- 五、最近鄰方法
- 六、神經網絡
- 七、自然語言處理
- 八、卷積神經網絡
- 九、循環神經網絡
- 十、將 TensorFlow 投入生產
- 十一、更多 TensorFlow
- 與 TensorFlow 的初次接觸
- 前言
- 1.?TensorFlow 基礎知識
- 2. TensorFlow 中的線性回歸
- 3. TensorFlow 中的聚類
- 4. TensorFlow 中的單層神經網絡
- 5. TensorFlow 中的多層神經網絡
- 6. 并行
- 后記
- TensorFlow 學習指南
- 一、基礎
- 二、線性模型
- 三、學習
- 四、分布式
- TensorFlow Rager 教程
- 一、如何使用 TensorFlow Eager 構建簡單的神經網絡
- 二、在 Eager 模式中使用指標
- 三、如何保存和恢復訓練模型
- 四、文本序列到 TFRecords
- 五、如何將原始圖片數據轉換為 TFRecords
- 六、如何使用 TensorFlow Eager 從 TFRecords 批量讀取數據
- 七、使用 TensorFlow Eager 構建用于情感識別的卷積神經網絡(CNN)
- 八、用于 TensorFlow Eager 序列分類的動態循壞神經網絡
- 九、用于 TensorFlow Eager 時間序列回歸的遞歸神經網絡
- TensorFlow 高效編程
- 圖嵌入綜述:問題,技術與應用
- 一、引言
- 三、圖嵌入的問題設定
- 四、圖嵌入技術
- 基于邊重構的優化問題
- 應用
- 基于深度學習的推薦系統:綜述和新視角
- 引言
- 基于深度學習的推薦:最先進的技術
- 基于卷積神經網絡的推薦
- 關于卷積神經網絡我們理解了什么
- 第1章概論
- 第2章多層網絡
- 2.1.4生成對抗網絡
- 2.2.1最近ConvNets演變中的關鍵架構
- 2.2.2走向ConvNet不變性
- 2.3時空卷積網絡
- 第3章了解ConvNets構建塊
- 3.2整改
- 3.3規范化
- 3.4匯集
- 第四章現狀
- 4.2打開問題
- 參考
- 機器學習超級復習筆記
- Python 遷移學習實用指南
- 零、前言
- 一、機器學習基礎
- 二、深度學習基礎
- 三、了解深度學習架構
- 四、遷移學習基礎
- 五、釋放遷移學習的力量
- 六、圖像識別與分類
- 七、文本文件分類
- 八、音頻事件識別與分類
- 九、DeepDream
- 十、自動圖像字幕生成器
- 十一、圖像著色
- 面向計算機視覺的深度學習
- 零、前言
- 一、入門
- 二、圖像分類
- 三、圖像檢索
- 四、對象檢測
- 五、語義分割
- 六、相似性學習
- 七、圖像字幕
- 八、生成模型
- 九、視頻分類
- 十、部署
- 深度學習快速參考
- 零、前言
- 一、深度學習的基礎
- 二、使用深度學習解決回歸問題
- 三、使用 TensorBoard 監控網絡訓練
- 四、使用深度學習解決二分類問題
- 五、使用 Keras 解決多分類問題
- 六、超參數優化
- 七、從頭開始訓練 CNN
- 八、將預訓練的 CNN 用于遷移學習
- 九、從頭開始訓練 RNN
- 十、使用詞嵌入從頭開始訓練 LSTM
- 十一、訓練 Seq2Seq 模型
- 十二、深度強化學習
- 十三、生成對抗網絡
- TensorFlow 2.0 快速入門指南
- 零、前言
- 第 1 部分:TensorFlow 2.00 Alpha 簡介
- 一、TensorFlow 2 簡介
- 二、Keras:TensorFlow 2 的高級 API
- 三、TensorFlow 2 和 ANN 技術
- 第 2 部分:TensorFlow 2.00 Alpha 中的監督和無監督學習
- 四、TensorFlow 2 和監督機器學習
- 五、TensorFlow 2 和無監督學習
- 第 3 部分:TensorFlow 2.00 Alpha 的神經網絡應用
- 六、使用 TensorFlow 2 識別圖像
- 七、TensorFlow 2 和神經風格遷移
- 八、TensorFlow 2 和循環神經網絡
- 九、TensorFlow 估計器和 TensorFlow HUB
- 十、從 tf1.12 轉換為 tf2
- TensorFlow 入門
- 零、前言
- 一、TensorFlow 基本概念
- 二、TensorFlow 數學運算
- 三、機器學習入門
- 四、神經網絡簡介
- 五、深度學習
- 六、TensorFlow GPU 編程和服務
- TensorFlow 卷積神經網絡實用指南
- 零、前言
- 一、TensorFlow 的設置和介紹
- 二、深度學習和卷積神經網絡
- 三、TensorFlow 中的圖像分類
- 四、目標檢測與分割
- 五、VGG,Inception,ResNet 和 MobileNets
- 六、自編碼器,變分自編碼器和生成對抗網絡
- 七、遷移學習
- 八、機器學習最佳實踐和故障排除
- 九、大規模訓練
- 十、參考文獻