# 七、從頭開始訓練 CNN
深度神經網絡徹底改變了計算機視覺。 實際上,我認為在最近幾年中計算機視覺的進步已經使深層神經網絡成為許多消費者每天使用的東西。 我們已經在第 5 章“使用 Keras 進行多分類”中使用計算機視覺分類器,其中我們使用了深度網絡對手寫數字進行分類。 現在,我想向您展示卷積層如何工作,如何使用它們以及如何在 Keras 中構建自己的卷積神經網絡以構建更好,功能更強大的深度神經網絡來解決計算機視覺問題。
我們將在本章介紹以下主題:
* 卷積介紹
* 在 Keras 中訓練卷積神經網絡
* 使用數據增強
# 卷積介紹
經過訓練的卷積層由稱為過濾器的許多特征檢測器組成,這些特征檢測器在輸入圖像上滑動作為移動窗口。 稍后我們將討論過濾器內部的內容,但現在它可能是一個黑匣子。 想象一個已經訓練過的過濾器。 也許該過濾器已經過訓練,可以檢測圖像中的邊緣,您可能會認為這是黑暗與明亮之間的過渡。 當它經過圖像時,其輸出表示它檢測到的特征的存在和位置,這對于第二層過濾器很有用。 稍微擴展一下我們的思想實驗,現在想象第二個卷積層中的一個過濾器,它也已經被訓練過了。 也許這個新層已經學會了檢測直角,其中存在由上一層找到的兩個邊緣。 不斷地我們去; 隨著我們添加層,可以了解更多復雜的特征。 特征層次結構的概念對于卷積神經網絡至關重要。 下圖來自 Honglak Lee 等人的《使用卷積深度信念網絡的無監督學習層次表示》[2011],非常好地說明了特征層次結構的概念:

這是一種非常強大的技術,它比我們先前在 MNIST 上使用的深度學習`flatten`和`classify`方法具有多個優勢。 我們將在短期內討論這些內容,但首先讓我們深入了解過濾器。
# 卷積層如何工作?
在上一節中,我說過卷積層是一組充當特征檢測器的過濾器。 在我們深入探討該架構之前,讓我們回顧一下卷積實際上是什么的數學。
讓我們首先手動將以下`4 x 4`矩陣與`3 x 3`矩陣卷積,我們將其稱為過濾器。 卷積過程的第一步是獲取過濾器與`4 x 4`矩陣的前九個框的按元素乘積:

完成此操作后,我們將過濾器滑到一行上并執行相同的操作。 最后,我們將過濾器向下滑動,然后再次滑動。 卷積過程一旦完成,將使我們剩下`2x2`矩陣,如下圖所示:

從技術上講,這不是卷積,而是互相關。 按照慣例,我們將其稱為卷積,并且就我們的目的而言,差異確實很小。
# 三維卷積
MNIST 是一個灰度示例,我們可以將每個圖像表示為二維矩陣中從 0 到 255 的像素強度值。 但是,大多數時候,我們將使用彩色圖像。 彩色圖像實際上是三維矩陣,其中維是圖像高度,圖像寬度和顏色。 這將為圖像中的每個像素生成一個矩陣,分別具有紅色,藍色和綠色值。
雖然我們先前展示的是二維過濾器,但我們可以通過在(高度,寬度,3(顏色))矩陣與`3 x 3 x 3`之間進行卷積來將其思想輕松轉換為三個維度。 過濾。 最后,當我們在矩陣的所有三個軸上進行逐元素乘積運算時,仍然剩下二維輸出。 提醒一下,這些高維矩陣通常稱為張量,而我們正在做的就是使它們流動。
# 卷積層
之前我們已經討論了由多個線性函數單元以及一些非線性(例如`relu`)組成的深度神經網絡層。 在卷積層中,每個單元都是一個過濾器,結合了非線性。 例如,可以在 Keras 中定義卷積層,如下所示:
```py
from keras.layers import Conv2D
Conv2D(64, kernel_size=(3,3), activation="relu", name="conv_1")
```
在此層中,有 64 個獨立的單元,每個單元都有`3 x 3 x 3`過濾器。 卷積操作完成后,每個單元都會像傳統的完全連接層中那樣為輸出添加偏置和非線性(稍后會詳細介紹該術語)。
在繼續之前,讓我們快速瀏覽一下示例的維度,以便確保我們都在同一頁面上。 想象一下,我們有一個`32 x 32 x 3`的輸入圖像。 現在,我們將其與上述卷積層進行卷積。 該層包含 64 個過濾器,因此輸出為`30 x 30 x 64`。 每個過濾器輸??出一個`30 x 30`矩陣。
# 卷積層的好處
因此,現在您希望對卷積層的工作原理有所了解,讓我們討論為什么我們要進行所有這些瘋狂的數學運算。 為什么我們要使用卷積層而不是以前使用的普通層?
假設我們確實使用了普通層,以得到與之前討論的相同的輸出形狀。 我們從`32 x 32 x 3`圖像開始,所以總共有 3,072 個值。 我們剩下一個`30 x 30 x 64`矩陣。 總共有 57,600 個值。 如果我們要使用完全連接的層來連接這兩個矩陣,則該層將具有 176,947,200 個可訓練參數。 那是 1.76 億。
但是,當我們使用上面的卷積層時,我們使用了 64 個`3 x 3 x 3`過濾器,這將導致 1,728 個可學習權重加 64 個偏差(總共 1,792 個參數)。
因此,顯然卷積層需要的參數要少得多,但是為什么這很重要呢?
# 參數共享
由于過濾器是在整個圖像中使用的,因此過濾器會學會檢測特征,而不管其在圖像中的位置如何。 事實證明,這非常有用,因為它為我們提供了平移不變性,這意味著我們可以檢測到重要的內容,而不管其在整個圖像中的朝向。
回想一下 MNIST,不難想象我們可能想檢測 9 的循環,而不管它在照片中的位置如何。 提前思考,想象一個將圖片分類為貓或汽車的分類器。 容易想象有一組過濾器可以檢測出像汽車輪胎一樣復雜的東西。 無論輪胎的方向在圖像中的什么位置,檢測該輪胎都是有用的,因為輪胎之類的東西強烈表明該圖像不是貓(除非圖像是駕駛汽車的貓)。
# 本地連接
過濾器由于其固定大小而著重于相鄰像素之間的連通性。 這意味著他們將最強烈地學習本地特征。 當與其他過濾器以及層和非線性結合使用時,這使我們逐漸關注更大,更復雜的特征。 確實需要這種局部化特征的堆疊,這也是卷積層如此之大的關鍵原因。
# 池化層
除了卷積層,卷積神經網絡通常使用另一種類型的層,稱為**池化層**。 當添加卷積層時,使用池化層來減少卷積網絡的維數,這會減少過擬合。 它們具有使特征檢測器更堅固的附加好處。
池化層將矩陣劃分為非重疊部分,然后通常在每個區域中采用最大值(在最大池化的情況下)。 可替代地,可以采用平均值。 但是,目前很少使用。 下圖說明了此技術:

如我們所料,池化層在 Keras 中很容易實現。 以下代碼可用于池化各層:
```py
from keras.layers import MaxPooling2D
pool1 = MaxPooling2D(pool_size=(2, 2), name="pool_1")
```
在這里,我們將池窗口定義為`2 x 2`。
盡管我們之前沒有討論過填充,但是在某些架構中,通常將卷積層或池化層的輸入填充為 0,以使輸出尺寸等于輸入。 Keras 的卷積層和池化層中的默認值都是有效填充,這意味著按慣例沒有填充。 如果需要,參數`padding="same"`將應用填充。
# 批量標準化
批量規范化有助于我們的網絡整體表現更好,學習速度更快。 批量規范化在應用中也很容易理解。 但是,為什么它起作用,仍然受到研究人員的爭議。
使用批量歸一化時,對于每個小批量,我們可以在每個非線性之后(或之前)對那個批量進行歸一化,使其平均值為 0,單位方差。 這使每一層都可以從中學習標準化輸入,從而使該層的學習效率更高。
批歸一化層很容易在 Keras 中實現,本章的示例將在每個卷積層之后使用它們。 以下代碼用于批量規范化:
```py
from keras.layers import BatchNormalization
x = BatchNormalization(name="batch_norm_1")
```
# 在 Keras 中訓練卷積神經網絡
現在我們已經介紹了卷積神經網絡的基礎知識,是時候構建一個了。 在本案例研究中,我們將面對一個眾所周知的問題,即 **CIFAR-10**。 該數據集由 Alex Krizhevsky,Vinod Nair 和 Geoffrey Hinton 創建。
# 輸入
CIFAR-10 數據集由屬于 10 類的 60,000 張`32 x 32`彩色圖像組成,每類 6,000 張圖像。 我將使用 50,000 張圖像作為訓練集,使用 5,000 張圖像作為驗證集,并使用 5,000 張圖像作為測試集。
卷積神經網絡的輸入張量層將為`(N, 32, 32, 3)`,我們將像以前一樣將其傳遞給`build_network`函數。 以下代碼用于構建網絡:
```py
def build_network(num_gpu=1, input_shape=None):
inputs = Input(shape=input_shape, name="input")
```
# 輸出
該模型的輸出將是 0-9 之間的類別預測。 我們將使用與 MNIST 相同的 10 節點`softmax`。 令人驚訝的是,我們的輸出層沒有任何變化。 我們將使用以下代碼來定義輸出:
```py
output = Dense(10, activation="softmax", name="softmax")(d2)
```
# 成本函數和指標
在第 5 章中,我們使用分類交叉熵作為多分類器的損失函數。 這只是另一個多分類器,我們可以繼續使用分類交叉熵作為我們的損失函數,并使用準確率作為度量。 我們已經開始使用圖像作為輸入,但是幸運的是我們的成本函數和指標保持不變。
# 卷積層
如果您開始懷疑此實現中是否會有任何不同之處,那就是這里。 我將使用兩個卷積層,分別進行批量規范化和最大池化。 這將要求我們做出很多選擇,當然我們以后可以選擇作為超參數進行搜索。 不過,最好先讓某些東西開始工作。 正如 Donald Knuth 所說,過早的優化是萬惡之源。 我們將使用以下代碼片段定義兩個卷積塊:
```py
# convolutional block 1
conv1 = Conv2D(64, kernel_size=(3,3), activation="relu", name="conv_1")(inputs)
batch1 = BatchNormalization(name="batch_norm_1")(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2), name="pool_1")(batch1)
# convolutional block 2
conv2 = Conv2D(32, kernel_size=(3,3), activation="relu", name="conv_2")(pool1)
batch2 = BatchNormalization(name="batch_norm_2")(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2), name="pool_2")(batch2)
```
因此,很明顯,我們在這里有兩個卷積塊,它們由一個卷積層,一個批量規范化層和一個池化層組成。
在第一塊中,我使用具有`relu`激活函數的 64 個`3 x 3`過濾器。 我使用的是有效(無)填充,跨度為 1。批量規范化不需要任何參數,并且實際上不是可訓練的。 池化層使用`2 x 2`池化窗口,有效填充和跨度為 2(窗口尺寸)。
第二個塊幾乎相同。 但是,我將過濾器數量減半為 32。
盡管在該架構中有許多旋鈕可以轉動,但我首先要調整的是卷積的內核大小。 內核大小往往是一個重要的選擇。 實際上,一些現代的神經網絡架構(例如 Google 的 **Inception**)使我們可以在同一卷積層中使用多個過濾器大小。
# 全連接層
經過兩輪卷積和合并后,我們的張量變得相對較小和較深。 在`pool_2`之后,輸出尺寸為`(n, 6, 6, 32)`。
我們希望在這些卷積層中提取此`6 x 6 x 32`張量表示的相關圖像特征。 為了使用這些特征對圖像進行分類,在進入最終輸出層之前,我們將將該張量連接到幾個完全連接的層。
在此示例中,我將使用 512 神經元完全連接層,256 神經元完全連接層以及最后的 10 神經元輸出層。 我還將使用丟棄法來幫助防止過擬合,但只有一點點! 該過程的代碼如下,供您參考:
```py
from keras.layers import Flatten, Dense, Dropout
# fully connected layers
flatten = Flatten()(pool2)
fc1 = Dense(512, activation="relu", name="fc1")(flatten)
d1 = Dropout(rate=0.2, name="dropout1")(fc1)
fc2 = Dense(256, activation="relu", name="fc2")(d1)
d2 = Dropout(rate=0.2, name="dropout2")(fc2)
```
我之前沒有提到上面的`flatten`層。 `flatten`層完全按照其名稱的含義執行。 將`flattens`,`n x 6 x 6 x 32`張量`flattens`轉換為`n x 1152`向量。 這將作為全連接層的輸入。
# Keras 中的多 GPU 模型
許多云計算平臺可以提供包含多個 GPU 的實例。 隨著我們模型的規模和復雜性的增長,您可能希望能夠跨多個 GPU 并行化工作負載。 這在本機 TensorFlow 中可能涉及到一些過程,但是在 Keras 中,這只是一個函數調用。
正常構建模型,如以下代碼所示:
```py
model = Model(inputs=inputs, outputs=output)
```
然后,我們借助以下代碼將該模型傳遞給`keras.utils.multi_gpu_model`:
```py
model = multi_gpu_model(model, num_gpu)
```
在此示例中,`num_gpu`是我們要使用的 GPU 的數量。
# 訓練
將模型放在一起,并結合我們新的 CUDA GPU 功能,我們提出了以下架構:
```py
def build_network(num_gpu=1, input_shape=None):
inputs = Input(shape=input_shape, name="input")
# convolutional block 1
conv1 = Conv2D(64, kernel_size=(3,3), activation="relu",
name="conv_1")(inputs)
batch1 = BatchNormalization(name="batch_norm_1")(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2), name="pool_1")(batch1)
# convolutional block 2
conv2 = Conv2D(32, kernel_size=(3,3), activation="relu",
name="conv_2")(pool1)
batch2 = BatchNormalization(name="batch_norm_2")(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2), name="pool_2")(batch2)
# fully connected layers
flatten = Flatten()(pool2)
fc1 = Dense(512, activation="relu", name="fc1")(flatten)
d1 = Dropout(rate=0.2, name="dropout1")(fc1)
fc2 = Dense(256, activation="relu", name="fc2")(d1)
d2 = Dropout(rate=0.2, name="dropout2")(fc2)
# output layer
output = Dense(10, activation="softmax", name="softmax")(d2)
# finalize and compile
model = Model(inputs=inputs, outputs=output)
if num_gpu > 1:
model = multi_gpu_model(model, num_gpu)
model.compile(optimizer='adam', loss='categorical_crossentropy',
metrics=["accuracy"])
return model
```
我們可以使用它來構建我們的模型:
```py
model = build_network(num_gpu=1, input_shape=(IMG_HEIGHT, IMG_WIDTH, CHANNELS))
```
然后,我們可以滿足您的期望:
```py
model.fit(x=data["train_X"], y=data["train_y"],
batch_size=32,
epochs=200,
validation_data=(data["val_X"], data["val_y"]),
verbose=1,
callbacks=callbacks)
```
在我們訓練該模型時,您會注意到過擬合是一個緊迫的問題。 即使只有相對較小的兩個卷積層,我們也已經有點過擬合了。
您可以從以下圖形中看到過擬合的影響:

不足為奇,50,000 次觀察不是很多數據,尤其是對于計算機視覺問題。 在實踐中,計算機視覺問題得益于非常大的數據集。 實際上,[Chen Sun 指出](https://arxiv.org/abs/1707.02968),附加數據傾向于以數據量的對數線性幫助計算機視覺模型。 不幸的是,在這種情況下,我們無法真正找到更多數據。 但是也許我們可以做些。 接下來讓我們討論數據增強。
# 使用數據增強
數據增強是一種將變換應用于圖像并使用原始圖像和變換后的圖像進行訓練的技術。 想象一下,我們有一個訓練類,里面有一只貓:

如果將水平翻轉應用于此圖像,我們將得到如下所示的內容:

當然,這是完全相同的圖像,但是我們可以將原始圖像和轉換圖像用作訓練示例。 這不像我們訓練中的兩只貓那么好。 但是,它的確使我們可以告訴計算機,無論貓面對什么方向,貓都是貓。
在實踐中,我們可以做的不僅僅是水平翻轉。 當有意義時,我們也可以垂直翻轉,移動和隨機旋轉圖像。 這使我們能夠人為地放大我們的數據集,并使它看起來比實際的更大。 當然,您只能將其推到目前為止,但這是在存在少量數據的情況下防止過擬合的一個非常強大的工具。
# Keras `ImageDataGenerator`
不久前,進行圖像增強的唯一方法是對轉換進行編碼,并將其隨機應用于訓練集,然后將轉換后的圖像保存在磁盤上(上下坡,在雪中)。 對我們來說幸運的是,Keras 現在提供了`ImageDataGenerator`類,可以在我們訓練時即時應用轉換,而無需手工編碼轉換。
我們可以通過實例化`ImageDataGenerator`來創建一個數據生成器對象,如下所示:
```py
def create_datagen(train_X):
data_generator = ImageDataGenerator(
rotation_range=20,
width_shift_range=0.02,
height_shift_range=0.02,
horizontal_flip=True)
data_generator.fit(train_X)
return data_generator
```
在此示例中,我同時使用了移位,旋轉和水平翻轉。 我只使用很小的移位。 通過實驗,我發現更大的變化太多了,而且我的網絡實際上無法學到任何東西。 您的經驗會隨著您的問題而變化,但是我希望較大的圖像更能容忍移動。 在這種情況下,我們使用 32 個像素的圖像,這些圖像非常小。
# 用生成器訓練
如果您以前沒有使用過生成器,則它就像迭代器一樣工作。 每次調用`ImageDataGenerator` `.flow()`方法時,它都會產生一個新的訓練小批量,并將隨機變換應用于所饋送的圖像。
Keras `Model`類帶有`.fit_generator()`方法,該方法使我們可以使用生成器而不是給定的數據集:
```py
model.fit_generator(data_generator.flow(data["train_X"], data["train_y"], batch_size=32),
steps_per_epoch=len(data["train_X"]) // 32,
epochs=200,
validation_data=(data["val_X"], data["val_y"]),
verbose=1,
callbacks=callbacks)
```
在這里,我們用生成器替換了傳統的`x`和`y`參數。 最重要的是,請注意`steps_per_epoch`參數。 您可以從訓練集中任意采樣替換次數,并且每次都可以應用隨機變換。 這意味著我們每個周期可以使用的迷你批數比數據還多。 在這里,我將僅根據觀察得到的樣本數量進行采樣,但這不是必需的。 如果可以,我們可以并且應該將這個數字提高。
在總結之前,讓我們看一下這種情況下圖像增強的好處:

如您所見,僅一點點圖像增強確實幫助了我們。 不僅我們的整體精度更高,而且我們的網絡過擬合的速度也慢得多。 如果您的計算機視覺問題只包含少量數據,那么圖像增強就是您想要做的事情。
# 總結
在本章中,我們快速介紹了許多基礎知識。 我們討論了卷積層及其如何用于神經網絡。 我們還介紹了批量規范化,池化層和數據增強。 最后,我們使用 Keras 從零開始訓練卷積神經網絡,然后使用數據增強對該網絡進行改進。
我們還討論了如何基于數據的渴望計算機視覺的深度神經網絡問題。 在下一章中,我將向您展示**遷移學習**,這是我最喜歡的技術之一。 這將幫助您快速解決計算機視覺問題,并獲得驚人的結果并且數據量更少。
- 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
- 六、自編碼器,變分自編碼器和生成對抗網絡
- 七、遷移學習
- 八、機器學習最佳實踐和故障排除
- 九、大規模訓練
- 十、參考文獻