# 五、總結
在上一章中,我們了解了 TensorFlow 和 RNN 模型的另一個接口。 本章將對 TensorFlow 進行總結,探討我們已經走了多遠,以及從這里可以去哪里。 首先,我們將回顧字體分類問題的研究進展,然后簡要介紹除深度學習之外的 TensorFlow,并查看其將來的發展方向。 在本章的最后,您將熟悉以下概念:
* 研究回顧
* 快速瀏覽所有模型
* TensorFlow 的未來
* 其他一些 TensorFlow 項目
現在讓我們開始詳細研究和評估模型。
# 研究回顧
在本節中,我們將比較字體分類問題中的模型。 首先,我們應該提醒自己數據是什么樣的。 然后,我們將檢查簡單的邏輯密集神經網絡和卷積神經網絡模型。 使用 TensorFlow 建模已經走了很長一段路。
但是,在繼續進行深度學習之前,讓我們回頭看看模型如何比較字體分類問題。 首先,讓我們再次查看數據,這樣我們就不會忽略這個問題。 實際上,讓我們看一個包含每種字體的所有字母和數字的圖像,只是看看我們有什么形狀:
```py
# One look at a letter/digit from each font
# Best to reshape as one large array, then plot
all_letters = np.zeros([5*36,62*36])
for font in range(5):
for letter in range(62):
all_letters[font*36:(font+1)*36,
letter*36:(letter+1)*36] = \
train[9*(font*62 + letter)]
```
Matplotlib 需要處理很多子圖。 因此,我們將創建一個新數組,高 5 幅圖像,5 種字體乘以 36 像素,寬 62 幅圖像,62 個字母或數字乘以 36 像素。 分配零數組后,我們可以將訓練圖像堆疊到其中。 字體和字母充當索引,并且我們在大型數組中一次設置`36x36`的值。 注意,這里我們在`train`數組中有`9`,因為我們每個字母只采取一種抖動類型。
讓我們來看一下`pcolormesh`的快速調用:
```py
plt.pcolormesh(all_letters,
cmap=plt.cm.gray)
```

如您所見,我們擁有整個字母,大寫和小寫以及數字 0 到 9。某些字體看起來與其他字體相似,而無論如何`0`字體在其自身的世界中,無論如何對于人眼都是如此。 每種字體都有有趣的樣式屬性,我們希望我們的模型能夠繼續使用。
# 快速瀏覽所有模型
讓我們回顧一下我們構建的每個模型,以對這些字體及其優點和缺點進行建模:

乍一看,我們緩慢地建立了更復雜的模型,并考慮了數據的結構以提高準確率。
## 邏輯回歸模型
首先,我們從一個簡單的邏輯回歸模型開始:

它具有`36x36`像素外加 1 倍乘以 5 類總權重,即我們需要訓練的 6,485 個參數。 經過 1,000 次訓練后,此模型的驗證準確率達到了 40%。 您的結果可能會有所不同。 這相對較差,但是該模型具有一些優勢。
讓我們回頭看一下代碼:
```py
# These will be inputs
## Input pixels, flattened
x = tf.placeholder("float", [None, 1296])
## Known labels
y_ = tf.placeholder("float", [None,5])
# Variables
W = tf.Variable(tf.zeros([1296,5]))
b = tf.Variable(tf.zeros([5]))
# Just initialize
sess.run(tf.initialize_all_variables())
# Define model
y = tf.nn.softmax(tf.matmul(x,W) + b)
```
邏輯回歸的簡單性意味著我們可以直接看到并計算每個像素如何影響類概率。 這種簡單性也使模型在訓練中相對較快地收斂,并且當然也易于編程,因為它只需要幾行 TensorFlow 代碼。
## 單隱層神經網絡模型
我們的下一個模型是具有最終 Softmax 激活層的單個隱藏層密集連接的神經網絡,等效于邏輯回歸:

該模型具有`36x36`像素,外加 1 個偏移乘以 128 個節點,再加上 128 個隱藏節點加上 1 個偏移乘以 5 個類的總權重,即 166,661 個參數。 隱藏層使用`sigmoid`激活函數來實現非線性。 在經過 5,000 個周期后,參數的糾纏達到了約 60% 的驗證準確率,這是一個很大的改進。 但是,此改進的代價是大量增加了計算復雜性中的參數數量,您可以從代碼中大致了解一下:
```py
# These will be inputs
## Input pixels, flattened
x = tf.placeholder("float", [None, 1296])
## Known labels
y_ = tf.placeholder("float", [None,5])
# Hidden layer
num_hidden = 128
W1 = tf.Variable(tf.truncated_normal([1296, num_hidden],
stddev=1./math.sqrt(1296)))
b1 = tf.Variable(tf.constant(0.1,shape=[num_hidden]))
h1 = tf.sigmoid(tf.matmul(x,W1) + b1)
# Output Layer
W2 = tf.Variable(tf.truncated_normal([num_hidden, 5],
stddev=1./math.sqrt(5)))
b2 = tf.Variable(tf.constant(0.1,shape=[5]))
# Just initialize
sess.run(tf.initialize_all_variables())
# Define model
y = tf.nn.softmax(tf.matmul(h1,W2) + b2)
```
我們不再具有將單個像素分類到概率的簡單函數。 但這僅需要幾行編碼,并且表現會更好。
## 深度神經網絡
深度神經網絡更進一步,由第一層的 128 個節點組成,饋入下一層的 32 個節點,然后饋入 Softmax 以獲得 170,309 個參數; 真的沒有那么多:

經過 25,000 個周期后,我們的驗證準確率微幅提高了 63%:
```py
# These will be inputs
## Input pixels, flattened
x = tf.placeholder("float", [None, 1296])
## Known labels
y_ = tf.placeholder("float", [None,5])
# Hidden layer 1
num_hidden1 = 128
W1 = tf.Variable(tf.truncated_normal([1296,num_hidden1],
stddev=1./math.sqrt(1296)))
b1 = tf.Variable(tf.constant(0.1,shape=[num_hidden1]))
h1 = tf.sigmoid(tf.matmul(x,W1) + b1)
# Hidden Layer 2
num_hidden2 = 32
W2 = tf.Variable(tf.truncated_normal([num_hidden1,
num_hidden2],stddev=2./math.sqrt(num_hidden1)))
b2 = tf.Variable(tf.constant(0.2,shape=[num_hidden2]))
h2 = tf.sigmoid(tf.matmul(h1,W2) + b2)
# Output Layer
W3 = tf.Variable(tf.truncated_normal([num_hidden2, 5],
stddev=1./math.sqrt(5)))
b3 = tf.Variable(tf.constant(0.1,shape=[5]))
# Just initialize
sess.run(tf.initialize_all_variables())
# Define model
y = tf.nn.softmax(tf.matmul(h2,W3) + b3)
```
更深層次的靜態模型可能會做得更好,但這證明了深度學習的某些優勢,可以處理相當大的非線性,并且這再次花費了一些額外的編程精力。
## 卷積神經網絡
緊密連接的神經網絡工作得很好,但是字體是由它們的樣式而不是特定的像素定義的:

重復出現的局部特征應該是您模型的重要線索。 我們使用卷積神經網絡捕獲了其中一些局部特征。 我們從一個卷積層開始,一個`5x5`窗口,使用整流線性單元,通過四個額外的偏項計算四個特征,并提取了有趣的局部參數。 接下來,我們將`2x2`的最大池化層應用于每個特征,從而將中間值的數量減少到`18x18x4`加上 1 個偏差。 將其平整為 1,297 個數字,并放入一個密集的神經網絡的 32 個節點,然后進行 Softmax 激活,從而完成了具有 41,773 個參數的模型。
盡管實現和代碼比以前要花更多的精力,但是這可以很好地縮減模型的整體大小:
```py
# Conv layer 1
num_filters = 4
winx = 5
winy = 5
W1 = tf.Variable(tf.truncated_normal(
[winx, winy, 1 , num_filters],
stddev=1./math.sqrt(winx*winy)))
b1 = tf.Variable(tf.constant(0.1,
shape=[num_filters]))
# 5x5 convolution, pad with zeros on edges
xw = tf.nn.conv2d(x_im, W1,
strides=[1, 1, 1, 1],
padding='SAME')
h1 = tf.nn.relu(xw + b1)
# 2x2 Max pooling, no padding on edges
p1 = tf.nn.max_pool(h1, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='VALID')
# Need to flatten convolutional output for use in dense layer
p1_size = np.product(
[s.value for s in p1.get_shape()[1:]])
p1f = tf.reshape(p1, [-1, p1_size ])
# Dense layer
num_hidden = 32
W2 = tf.Variable(tf.truncated_normal(
[p1_size, num_hidden],
stddev=2./math.sqrt(p1_size)))
b2 = tf.Variable(tf.constant(0.2,
shape=[num_hidden]))
h2 = tf.nn.relu(tf.matmul(p1f,W2) + b2)
# Output Layer
W3 = tf.Variable(tf.truncated_normal(
[num_hidden, 5],
stddev=1./math.sqrt(num_hidden)))
b3 = tf.Variable(tf.constant(0.1,shape=[5]))
keep_prob = tf.placeholder("float")
h2_drop = tf.nn.dropout(h2, keep_prob)
```
僅訓練了 5000 個周期后,我們就清除了 68% 的準確率。 我們確實必須對卷積進行編碼,但這并不是那么困難。 通過對問題的結構應用一些知識,我們同時減小了模型大小,但提高了準確率。 干得好!
## 深度卷積神經網絡
結合了深度和卷積方法,我們最終創建了一個具有幾個卷積層的模型:

盡管我們使用了較小的`3x3`窗口,但我們在第一個卷積層上計算了 16 個濾鏡。 在進行最大`2x2`的池化之后,我們再次使用另一個`3x3`窗口和 4 個過濾器對池化值進行了處理。 另一個合并層再次饋入 32 個緊密連接的神經元和 Softmax 輸出。 因為在饋入密集神經網絡之前我們在池中有更多的卷積,所以在此模型中實際上我們具有較少的參數(準確地說是 10,765 個),幾乎與邏輯回歸模型一樣少。 但是,該模型以 6,000 個周期的速度達到了 80% 的驗證準確率,證明了您的新深度學習和 TensorFlow 技能。
```py
# Conv layer 1
num_filters1 = 16
winx1 = 3
winy1 = 3
W1 = tf.Variable(tf.truncated_normal(
[winx1, winy1, 1 , num_filters1],
stddev=1./math.sqrt(winx1*winy1)))
b1 = tf.Variable(tf.constant(0.1,
shape=[num_filters1]))
# 5x5 convolution, pad with zeros on edges
xw = tf.nn.conv2d(x_im, W1,
strides=[1, 1, 1, 1],
padding='SAME')
h1 = tf.nn.relu(xw + b1)
# 2x2 Max pooling, no padding on edges
p1 = tf.nn.max_pool(h1, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='VALID')
# Conv layer 2
num_filters2 = 4
winx2 = 3
winy2 = 3
W2 = tf.Variable(tf.truncated_normal(
[winx2, winy2, num_filters1, num_filters2],
stddev=1./math.sqrt(winx2*winy2)))
b2 = tf.Variable(tf.constant(0.1,
shape=[num_filters2]))
# 3x3 convolution, pad with zeros on edges
p1w2 = tf.nn.conv2d(p1, W2,
strides=[1, 1, 1, 1], padding='SAME')
h1 = tf.nn.relu(p1w2 + b2)
# 2x2 Max pooling, no padding on edges
p2 = tf.nn.max_pool(h1, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='VALID')
```
# TensorFlow 的未來
在本部分中,我們將觀察 TensorFlow 的變化方式,誰開始使用 TensorFlow 以及如何產生影響。
自 2015 年底發布以來,TensorFlow 已經看到更多發布版本:

TensorFlow 不斷更新。 盡管它不是 Google 的正式產品,但它還是開源的,并托管在 GitHub 上。 在撰寫本文時,TensorFlow 的版本為 1.2。 最新版本增加了分布式計算功能。 這些超出了本書的范圍,但總的來說,它們允許跨多臺機器上的多個 GPU 進行計算,以實現最大程度的并行化。 在繁重的開發過程中,更多功能總是指日可待。 TensorFlow 每天變得越來越流行。
幾家軟件公司最近發布了機器學習框架,但 TensorFlow 在采用方面表現突出。 在內部,Google 正在實踐他們的講道。 他們廣受贊譽的 DeepMind 團隊已改用 TensorFlow。

此外,許多擁有機器學習或數據科學程序的大學都將 TensorFlow 用于課程和研究項目。 當然,您已經在研究項目中使用過 TensorFlow,因此您處于領先地位。
## 其他一些 TensorFlow 項目
最后,無論大小,其他公司都在使用 TensorFlow。 現在您是 TensorFlow 的從業人員,唯一的限制就是您可能遇到的問題和您的計算資源。 以下是一些有關 TensorFlow 下一步可以解決的問題的想法:
* 圖像中的葉子分類:
像字體一樣,植物葉子在一個物種中具有相似的樣式。 您是否可以修改在本課程中建立的模型,以僅使用圖像識別物種?
* 使用行車記錄儀視頻的路標識別:
假設您從長途旅行中獲得了許多行車記錄儀鏡頭。 高速公路上的路標可以為您提供許多信息,例如您在哪里以及應該走多快。 您可以建立一系列 TensorFlow 模型來查找素材中的速度限制嗎?
* 預測出行時間的運輸研究:
此外,無論您的工作距離有多近,通勤時間都太長。 在交通和天氣等當前條件下,您應該能夠建立基于回歸的模型來預測您的旅行時間。
* 用于查找兼容日期的匹配算法:
最后,一家初創公司正在探索使用 TensorFlow 來尋找匹配算法。 如果將來算法會給您帶來一個約會,請不要感到驚訝。
基于 TensorFlow 的整潔項目太多,無法一一列舉。 但是,有機會,您會發現與自己的興趣有關的東西,如果沒有,那是貢獻自己的完美場所。 機器學習庫很多,但是 TensorFlow 仍然存在。
盡管本書側重于深度學習,但 TensorFlow 是一個通用的圖計算庫。

深度神經網絡確實是 TensorFlow 能夠很好處理的一小部分數據建模。 但是,正如您在第 1 章入門中的“簡單計算”部分所看到的那樣,在簡單計算中,可以為圖規定的任何操作都可以在 TensorFlow 中進行。 一個實際的例子是在 TensorFlow 中實現 K 均值聚類。
更一般而言,可以很好地向量化并且需要某種訓練的操作可能會受益于 TensorFlow 的使用。 這一切都說明您是 TensorFlow 的未來!
TensorFlow 是開源的,并且一直在變化。 因此,您可以在 GitHub 上輕松貢獻新功能。 這些可能是高度復雜的新模型類型或簡單的文檔更新。

所有更改都可以改善庫。 TensorFlow 的日益普及意味著您是最早掌握它的專業人士之一。 您在機器學習事業或研究中擁有優勢。 而且由于它不僅僅是深度學習,所以無論您處于哪個領域,TensorFlow 都可能適用于它的某些方面。
# 總結
在本章中,我們回顧了如何從謙虛的 Logistic 回歸模型爬升到使用深度卷積神經網絡對字體進行分類的高度。 我們還討論了 TensorFlow 的未來。 最后,我們回顧了用于字體分類的 TensorFlow 模型,并回顧了其準確率。 我們還花了一些時間來討論 TensorFlow 的發展方向。 恭喜! 您現在已經精通 TensorFlow。 您已將其應用于本系列中的多個研究問題和模型,并了解了其廣泛應用。
下一步是在您自己的項目中部署 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
- 六、自編碼器,變分自編碼器和生成對抗網絡
- 七、遷移學習
- 八、機器學習最佳實踐和故障排除
- 九、大規模訓練
- 十、參考文獻