0. 前言
深度學習 (Deep Learning
, DL
) 是貫穿所有生成模型 (Generative Model
) 的共同特征,幾乎所有復雜的生成模型都以深度神經(jīng)網(wǎng)絡為核心,深度神經(jīng)網(wǎng)絡能夠?qū)W習數(shù)據(jù)結(jié)構(gòu)中的復雜關(guān)系,而不需要預先提取數(shù)據(jù)特征。在本節(jié)中,我們將介紹深度學習基本概念,并利用 Keras
構(gòu)建深度神經(jīng)網(wǎng)絡。
1. 深度學習基本概念
1.1 基本定義
深度學習 (Deep Learning
, DL
) 是一類機器學習算法,使用多個堆疊的處理單元層從非結(jié)構(gòu)化數(shù)據(jù)中學習高級表示。
為了充分理解深度學習,尤其是理解深度學習在生成建模中的重要性,我們將首先介紹深度學習中常見的非結(jié)構(gòu)化數(shù)據(jù),然后探討如何構(gòu)建多個堆疊的處理單元層解決分類任務。
1.2 非結(jié)構(gòu)化數(shù)據(jù)
多數(shù)類型的機器學習算法需要結(jié)構(gòu)化的表格數(shù)據(jù)作為輸入,表格數(shù)據(jù)中的每一列都用于描述觀測數(shù)據(jù)的特征。例如,一個人的年齡、收入和上個月購物網(wǎng)站訪問等特征有助于預測此人在下個月網(wǎng)絡購物的金額,可以使用這些特征的結(jié)構(gòu)化表格來訓練邏輯回歸、隨機森林或 XGBoost
等模型,并使用這些模型預測連續(xù)空間的響應變量(模型預測輸出結(jié)果),即此人的網(wǎng)購消費金額。在此示例中,每個特征都包含觀測數(shù)據(jù)的一部分信息,模型將學習這些特征如何相互作用以影響響應變量。
非結(jié)構(gòu)化數(shù)據(jù)指的是不能自然地將特征組織成列形式的數(shù)據(jù),例如圖像、音頻、文本和視頻等。其中,圖像具有空間結(jié)構(gòu),音頻或文本具有時間結(jié)構(gòu),而視頻數(shù)據(jù)兼具空間和時間結(jié)構(gòu),但由于數(shù)據(jù)不是以特征列的形式組織,因此稱為是非結(jié)構(gòu)化數(shù)據(jù),如下圖所示。
在非結(jié)構(gòu)化數(shù)據(jù)中,單個像素、頻率或字符幾乎不含任何信息。例如,知道一張圖像的第 3
行、第 4
列的像素是白色并不能幫助我們確定這張圖像是一只狗還是一只貓,知道一個句子的第 5
個單詞是字母 that
也不能幫助我們預測這段文本是關(guān)于電影還是體育的。
實際上,像素或字符只是嵌入到更高級信息特征(例如小狗圖像或 “football
” 單詞)的一部分。無論圖像中的小狗被放置屋子里或馬路邊,圖像仍然包含小狗,只不過該信息將由不同的像素傳遞;無論文本中的 “football
” 稍早或稍晚出現(xiàn),該文本仍然是關(guān)于足球的,只是該信息將由不同的字符位置提供。數(shù)據(jù)的細粒度和高度的空間依賴性破壞了像素或字符作為獨立信息特征的意義。
因此,如果我們對原始像素值訓練邏輯回歸、隨機森林或 XGBoost
模型,則訓練后的模型通常只能處理最簡單的分類任務,而在其他較復雜的任務中通常表現(xiàn)不佳。這些模型依賴于輸入特征具有的信息量且不具有空間依賴性。而深度學習模型可以直接從非結(jié)構(gòu)化數(shù)據(jù)中自行學習如何構(gòu)建高級信息特征。
深度學習也可以應用于結(jié)構(gòu)化數(shù)據(jù),但其真正的作用(尤其在生成模型領(lǐng)域)來自于其處理非結(jié)構(gòu)化數(shù)據(jù)的能力。通常,我們希望生成非結(jié)構(gòu)化數(shù)據(jù),比如新的圖像或文本,這就是為什么深度學習對于生成模型領(lǐng)域有如此深遠的影響的原因。
2. 深度神經(jīng)網(wǎng)絡
目前,大部分深度學習系統(tǒng)通過堆疊多個隱藏層構(gòu)建人工神經(jīng)網(wǎng)絡 (Artificial Neural Networks
, ANNs
)。因此,深度學習現(xiàn)在幾乎已經(jīng)成為了深度神經(jīng)網(wǎng)絡的同義詞。但需要注意的是,任何使用多個層來學習輸入數(shù)據(jù)的高級表示的系統(tǒng)都是深度學習(例如深度信念網(wǎng)絡和深度玻爾茲曼機)。
首先,我們詳細介紹神經(jīng)網(wǎng)絡的基本概念,然后了解它們?nèi)绾斡糜趶姆墙Y(jié)構(gòu)化數(shù)據(jù)中學習高級特征。
2.1 神經(jīng)網(wǎng)絡
神經(jīng)網(wǎng)絡是由一系列堆疊的層組成的,每一層包含多個單位,這些單元通過一組權(quán)重與前一層的單位相連接。有多種不同類型的層,其中最常見的是全連接層 (fully connected layer
),也稱密集層 (dense layer
),它將該層的所有單位直接連接到前一層的每個單位。所有相鄰層都是全連接層的神經(jīng)網(wǎng)絡被稱為多層感知器 (Multilayer Perceptron
, MLP
)。
輸入(例如圖像)依次通過網(wǎng)絡的每一層進行傳遞直到達到輸出層,這一過程稱為網(wǎng)絡的前向傳播過程。具體而言,每個單元對其輸入的加權(quán)求和結(jié)果應用非線性變換,并將輸出傳遞到下一層。前向傳播過程的最終輸出層是該過程的最終結(jié)果,其中每個單元輸出原始輸入屬于特定類別(例如微笑)的概率。
深度神經(jīng)網(wǎng)絡通過尋找每個層的權(quán)重集,以產(chǎn)生最準確的預測,尋找最優(yōu)權(quán)重的過程就是網(wǎng)絡訓練 (training
)。
在訓練過程中,圖像會按批 (batch
) 傳遞給神經(jīng)網(wǎng)絡,然后將預測輸出與實際結(jié)果進行比較。例如,網(wǎng)絡可能對一個微笑的人臉圖像輸出 80%
的概率,對一個不微笑的人臉的圖像輸出 23%
的概率,而實際結(jié)果應輸出 100%
和 0%
,因此預測輸出和實際結(jié)果存在誤差。預測中的誤差會向后傳播到整個神經(jīng)網(wǎng)絡中,并沿著能夠最顯著改善預測的方向微調(diào)網(wǎng)絡權(quán)重,這個過程稱為反向傳播 (backpropagation
)。每個神經(jīng)網(wǎng)絡單元都能夠逐漸識別出一個特定的特征,最終幫助神經(jīng)網(wǎng)絡做出更準確的預測。
2.2 學習高級特征
神經(jīng)網(wǎng)絡的關(guān)鍵特性是能夠在沒有人工指導的情況下從輸入數(shù)據(jù)中學習特征。換句話說,我們不需要進行任何特征工程,僅僅通過最小化預測誤差的指導,模型就可以自動學習最優(yōu)權(quán)重。
例如,在上一小節(jié)介紹的神經(jīng)網(wǎng)絡中,假設它已經(jīng)完成訓練能夠準確地預測給定輸入面部是否微笑:
- 單元
A
接收輸入像素值 - 單元
B
將其輸入值組合起來,當某個低級特征(如邊緣)存在時,它會被激活 - 單元
C
與單元D
等將低級特征組合在一起,當圖像中出現(xiàn)更高級別的特征(如眼睛)時,它會被激活 - 單元
E
將高級特征組合在一起,當圖像中的人物出現(xiàn)微笑時,它會被激活
每個網(wǎng)絡層中的單元能夠通過組合前一層的低級特征表示學習到原始輸入的復雜特征,這是在網(wǎng)絡訓練過程自動學習的,我們不需要告訴每個單元要學習什么,或者它要學習高級特征還是低級特征。
輸入層和輸出層之間的層被稱為隱藏層 (hidden layers
),深度神經(jīng)網(wǎng)絡可以擁有任意數(shù)量的隱藏層。通過堆疊大量的網(wǎng)絡層,神經(jīng)網(wǎng)絡可以逐漸從淺層的低級特征中捕捉信息,學習越來越高級別的特征。例如,ResNet
是設計用于圖像識別的深度神經(jīng)網(wǎng)絡,包含 152
層。
接下來,我們將深入介紹深度學習中的常用技術(shù),并使用 TensorFlow
和 Keras
庫構(gòu)建深度神經(jīng)網(wǎng)絡。
3. TensorFlow 和 Keras
TensorFlow
是由 Google
開發(fā)的用于機器學習的開源 Python
庫。TensorFlow
是構(gòu)建機器學習解決方案最常用的框架之一,其因張量 (tensor
) 操作而得名。在深度學習中,張量只是存儲流經(jīng)神經(jīng)網(wǎng)絡的數(shù)據(jù)的多維數(shù)組。它提供了訓練神經(jīng)網(wǎng)絡所需的底層功能,例如高效計算任意可微表達式的梯度和執(zhí)行張量操作。Keras
是建立在 TensorFlow
上的高級 API
,它非常靈活且擁有非常易于使用的 API
,是入門深度學習的理想選擇。此外,Keras
通過其函數(shù)式 API
提供了許多有用的構(gòu)建模塊,可以通過將它們連接在一起來創(chuàng)建復雜的深度學習架構(gòu)。
使用 TensorFlow
和 Keras
組合能夠在生產(chǎn)環(huán)境中構(gòu)建復雜網(wǎng)絡,可以快速實現(xiàn)所設計的網(wǎng)絡模型。接下來,我們使用 Keras
構(gòu)建多層感知器(Multilayer Perceptron
,MLP
)。
4. 多層感知器 (MLP)
在本節(jié)中,我們將使用監(jiān)督學習訓練一個 MLP
來對指定圖像進行分類。監(jiān)督學習是一種機器學習算法,通過帶有標記的數(shù)據(jù)集進行訓練,監(jiān)督學習仍然在許多類型的生成模型中扮演重要角色。換句話說,用于訓練的數(shù)據(jù)集包括帶有輸入數(shù)據(jù)相應的輸出標簽。算法的目標是學習輸入數(shù)據(jù)和輸出標簽之間的映射關(guān)系,以便它可以對新的、未見過的數(shù)據(jù)進行預測。
4.1 準備數(shù)據(jù)
在本節(jié)中,我們將使用 CIFAR-10
數(shù)據(jù)集,這是一個 Keras
內(nèi)置的數(shù)據(jù)集,其包含 60,000
張 32×32
像素的彩色圖像,每張圖片都被分類到其所屬的類別(共有 10
個類別)。
默認情況下,圖像數(shù)據(jù)中每個像素的默認值為在 0
到 255
之間的整數(shù)。我們首先需要通過將這些值縮放到 0
到 1
之間來預處理圖像,因為神經(jīng)網(wǎng)絡在每個輸入的絕對值小于 1
時效果最好。
我們還需要將圖像的整數(shù)標簽轉(zhuǎn)換為獨熱編碼 (one-hot
) 向量,因為神經(jīng)網(wǎng)絡的輸出是圖像屬于每個類別的概率。如果圖像的類別整數(shù)標簽是 i
,則它的獨熱編碼是長度為 10
(類別數(shù)量)的向量,除第 i
個元素值為 1
外,其他所有位置上元素值都為 0
。
(1) 導入所需庫:
import numpy as np
import matplotlib.pyplot as plt
from keras import layers, models, optimizers, utils, datasets
NUM_CLASSES = 10
(2) 加載 CIFAR-10
數(shù)據(jù)集,其中 x_train
和 x_test
分別是形狀為 [50000, 32, 32, 3]
和 [10000, 32, 32, 3]
的 numpy
數(shù)組,y_train
和 y_test
分別是形狀為 [50000, 1]
和 [10000, 1]
的 numpy
數(shù)組,包含每個圖像的類別標簽,范圍在 0
到 9
之間:
(x_train, y_train), (x_test, y_test) = datasets.cifar10.load_data()
(3) 對每張圖像進行縮放,使得像素值介于 0
和 1
之間:
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
(4) 對標簽進行獨熱編碼,修改后的 y_train
和 y_test
的形狀分別為 [50000, 10]
和 [10000, 10]
:
y_train = utils.to_categorical(y_train, NUM_CLASSES)
y_test = utils.to_categorical(y_test, NUM_CLASSES)
訓練圖像數(shù)據(jù) (x_train
) 存儲在形狀為 [50000, 32, 32, 3]
的張量中。這個數(shù)據(jù)集沒有列或行的概念,而是一個具有四個維度的張量,張量只是一個多維數(shù)組,它是矩陣超過兩個維度的擴展。這個張量的第一個維度引用了數(shù)據(jù)集中圖像的索引,第二和第三個維度與圖像的尺寸相關(guān),最后一個維度是通道(對于 RGB
圖像而言是紅色、綠色或藍色通道)。使用以下方式可以獲取圖像中指定像素的通道值:
# 獲取第100個圖像中像素 (10,10) 的綠色通道值
print(x_train[100, 10, 10, 1])
4.2 構(gòu)建模型
在 Keras
中,可以使用 Sequential
模型或函數(shù) API
來定義神經(jīng)網(wǎng)絡的結(jié)構(gòu)。Sequential
模型用于快速定義一系列線性堆疊層(即一層直接緊隨著下一層,沒有任何分支)。我們可以使用 Sequential
類來定義 MLP
模型:
model = models.Sequential([
layers.Flatten(input_shape=(32,32,3)),
layers.Dense(200, activation='relu'),
layers.Dense(150, activation='relu'),
layers.Dense(10, activation='softmax'),
])
但許多模型需要從一個層傳遞輸出到多個后續(xù)層,或者一個層接收其上多個層的輸入。對于這些模型,Sequential
類就不再適用,我們需要使用更加靈活的函數(shù) API
。隨著神經(jīng)網(wǎng)絡的架構(gòu)變得越來越復雜,函數(shù) API
將能夠更好的滿足需求,給予我們隨心所欲設計深度神經(jīng)網(wǎng)絡的自由。
接下來,我們使用使用函數(shù) API
構(gòu)建相同 MLP
,在使用函數(shù) API
時,使用 Model
類來定義模型的整體輸入和輸出層:
input_layer = layers.Input((32, 32, 3))
x = layers.Flatten()(input_layer)
x = layers.Dense(200, activation="relu")(x)
x = layers.Dense(150, activation="relu")(x)
output_layer = layers.Dense(NUM_CLASSES, activation="softmax")(x)
model = models.Model(input_layer, output_layer)
使用以上兩種方法可以得到相同的模型:
神經(jīng)網(wǎng)絡層
為了構(gòu)建 MLP
,我們使用了三種不同類型的層:Input
、Flatten
和 Dense
。接下來,我們詳細地介紹在 MLP
中使用的不同層和激活函數(shù)。Input
層是神經(jīng)網(wǎng)絡的入口,以元組形式告訴網(wǎng)絡每個數(shù)據(jù)元素的形狀,不需要顯式地指定批大小,因為我們可以同時傳遞任意數(shù)量的圖像到 Input
層。
接下來,使用 Flatten
層將輸入展平成一個向量,得到一個長度為 32 × 32 × 3=3,072
的向量。這是由于后續(xù)的 Dense
層要求其輸入是一維的,而不是多維數(shù)組。而有些類型的層需要多維數(shù)組作為輸入,因此需要了解每種類型的層所需的輸入和輸出形狀,以理解何時需要使用 Flatten
。Dense
層是神經(jīng)網(wǎng)絡中最基本的層類型之一。它包含給定數(shù)量的單元,該層中的每個單元與前一層中的每個單元通過一個權(quán)重連接。給定單元的輸出是它從前一層接收到的輸入的加權(quán)和,然后通過非線性激活函數(shù)傳遞給下一層。激活函數(shù)用于確保神經(jīng)網(wǎng)絡能夠?qū)W習復雜函數(shù),而不僅僅輸出其輸入的線性組合。
激活函數(shù)
有多種類型的激活函數(shù),我們主要介紹以下三種激活函數(shù):ReLU
、sigmoid
和 softmax
。ReLU
(Rectified Linear Unit
) 激活函數(shù)在輸入為負時定義為 0
,否則等于輸入值。LeakyReLU
激活函數(shù)與 ReLU
非常相似,關(guān)鍵區(qū)別在于:ReLU
激活函數(shù)對于小于 0
的輸入值返回 0
,而 LeakyReLU
函數(shù)返回與輸入成比例的一個小的負數(shù)。如果 ReLU
單元始終輸出 0
,則梯度同樣為 0
,因此誤差無法通過該單元反向傳播。LeakyReLU
激活通過始終確保梯度非零來解決此問題?;?ReLU
的函數(shù)是在深度網(wǎng)絡的層之間使用的最可靠的激活函數(shù)之一,可以確保模型穩(wěn)定的訓練。
如果我們希望某一層的輸出介于 0
到 1
之間,則可以使用 sigmoid
激活函數(shù),例如用于具有一個輸出單元的二分類問題。下圖為 ReLU
、LeakyReLU
和 sigmoid
激活函數(shù)的函數(shù)圖像:
如果我們希望某一網(wǎng)絡層的輸出總和等于 1
,則可以使用 softmax
激活函數(shù),例如在多類別分類問題中,每個觀測樣本只屬于一個類別,函數(shù)定義如下:
y
i
=
e
x
i
∑
j
=
1
J
e
x
j
y_i = \frac {e^{x_i}}{∑_{j=1}^J e^{x_j}}
yi?=∑j=1J?exj?exi??
其中,
J
J
J 是層中的單元總數(shù)。在上述構(gòu)建的神經(jīng)網(wǎng)絡中,我們在最后一層使用 softmax
激活函數(shù),以確保輸出包含 10
個概率值,這些概率值相加為 1
,可表示圖像屬于每個類別的可能性。
在 Keras
中,可以在層內(nèi)定義激活函數(shù)或?qū)⑵渥鳛閱为毜膶佣x:
# 方法1
x = layers.Dense(units=200, activation = 'relu')(x)
# 方法2
x = layers.Dense(units=200)(x)
x = layers.Activation('relu')(x)
在以上代碼中,我們將輸入通過兩個 Dense
層,第一層有 200
個單元,第二層有 150
個單元,兩層均使用 ReLU
激活函數(shù)。
4.3 檢查模型
我們可以使用 model.summary()
方法來檢查神經(jīng)網(wǎng)絡每一層的形狀:
print(model.summary())
可以看到,輸入層 Input
的形狀與 x_train
的形狀相匹配,而輸出層的形狀與 y_train
的形狀匹配。Keras
使用 None
作為標記,表示它尚不明確將傳遞給網(wǎng)絡的觀測樣本數(shù)量。實際上,它也不需要知道,因為一次只傳遞 1
個觀測樣本對象或 1000
個觀測樣本對象給網(wǎng)絡是一樣的。這是由于張量操作使用線性代數(shù)在所有觀測樣本對象上同時進行。這也是為什么在 GPU
上訓練深度神經(jīng)網(wǎng)絡比 CPU
上訓練可以提高效率的原因之一,因為 GPU
針對大型張量操作進行了優(yōu)化。summary
方法還會給出每個層中需要進行訓練的參數(shù)(權(quán)重)數(shù)量。如果模型訓練速度過慢,可以使用 summary
查看是否有包含大量權(quán)重的層。如果有此類層,可以考慮減少層中的單元數(shù)量以加速訓練。
最后,我們介紹如何計算每個層中的參數(shù)數(shù)量。默認情況下,給定層中的每個單元會連接到一個額外的偏置單元,用于確保即使來自前一層的所有輸入為 0
,單元的輸出仍然可以是非零值。因此,在一個包含 200
個單元的 Dense
層中(假設輸入像素數(shù)為 3072
),參數(shù)數(shù)量為 200 * (3072 + 1) = 614,600
。
4.4 編譯模型
使用優(yōu)化器和損失函數(shù)編譯模型:
opt = optimizers.Adam(learning_rate=0.0005)
model.compile(
loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]
)
接下來,我們詳細介紹損失函數(shù)和優(yōu)化器。
損失函數(shù)
損失函數(shù) (loss function
) 用于神經(jīng)網(wǎng)絡將其預測輸出與真實值進行比較。它為每個觀測樣本對象返回一個值,值越大,表明神經(jīng)網(wǎng)絡針對該觀測樣本對象所得出的輸出結(jié)果就越差。Keras
提供了許多內(nèi)置的損失函數(shù)可供選擇,我們也可以創(chuàng)建自定義損失函數(shù)。常用的損失函數(shù)包括均方誤差 (mean squared error
)、分類交叉熵 (categorical cross-entropy
) 和二元交叉熵 (binary cross-entropy
)。我們需要根據(jù)實際問題選擇合適的損失函數(shù)。
如果神經(jīng)網(wǎng)絡旨在解決回歸問題(即輸出是連續(xù)值),那么可以使用均方誤差損失。均方誤差是每個輸出單元的實際值
y
i
y_i
yi? 與預測值
p
i
p_i
pi? 之差的平方的均值,其中均值是在所有
n
n
n 個輸出單元上進行計算:
M
S
E
=
1
n
Σ
i
=
1
n
(
y
i
?
p
i
)
2
MSE = \frac1 n Σ_{i=1}^n {(y_i - p_i)^2}
MSE=n1?Σi=1n?(yi??pi?)2
如果需要處理分類問題,其中每個觀測樣本對象只屬于一個類別,那么可以使用分類交叉熵是作為損失函數(shù)。其定義如下:
?
Σ
i
=
1
n
y
i
l
o
g
(
p
i
)
-Σ_{i=1}^n{y_ilog(p_i)}
?Σi=1n?yi?log(pi?)
如果需要處理具有一個輸出單元的二分類問題,或者每個觀測樣本可以同時屬干多個類別的多分類問題,則應該使用二元交叉熵:
?
1
n
Σ
i
=
1
n
(
y
i
l
o
g
(
p
i
)
+
(
1
?
y
i
)
l
o
g
(
1
?
p
i
)
)
-\frac 1 n Σ_{i=1}^n {(y_ilog(p_i) + (1-y_i)log(1-p_i))}
?n1?Σi=1n?(yi?log(pi?)+(1?yi?)log(1?pi?))
優(yōu)化器
優(yōu)化器 (optimizer
) 是根據(jù)損失函數(shù)的梯度來更新神經(jīng)網(wǎng)絡權(quán)重的算法。Adam
是最常用且穩(wěn)定的優(yōu)化器之一,在大多數(shù)情況下,除了學習率 (learning rate
) 外,我們不需要調(diào)整 Adam
優(yōu)化器的默認參數(shù)。學習率越大,每個訓練步驟中權(quán)重的改變就越大。雖然使用較大的學習率在初始時訓練速度更快,但缺點是可能導致訓練不穩(wěn)定,并且可能無法找到損失函數(shù)的全局最小值。因此需要在訓練過程中調(diào)整該參數(shù)。
另一個常見的優(yōu)化器是 RMSProp
,同樣,我們不需要過多調(diào)整此優(yōu)化器的默認參數(shù)。
我們將損失函數(shù)和優(yōu)化器都傳遞給模型的 compile
方法,并通過 metrics
參數(shù)指定我們在訓練期間希望監(jiān)測的其他指標,例如準確率。
4.5 訓練模型
到目前為止,我們還沒有向模型傳遞任何數(shù)據(jù),只是構(gòu)建了模型架構(gòu),并使用損失函數(shù)和優(yōu)化器編譯了模型。要傳遞數(shù)據(jù)訓練模型,只需調(diào)用 fit
方法:
model.fit(x_train, y_train, batch_size=32, epochs=20, shuffle=True)
其中,x_train
表示原始圖像數(shù)據(jù),y_train
表示 one-hot
編碼的類別標簽,batch_size
決定每個訓練步驟中將傳遞給網(wǎng)絡的觀測樣本數(shù)量,epochs
決定將完整的訓練數(shù)據(jù)展示給網(wǎng)絡的次數(shù),shuffle = True
表示每個訓練步驟中都會以無放回的方式從訓練數(shù)據(jù)中隨機抽取批數(shù)據(jù)。
訓練深度神經(jīng)網(wǎng)絡,用于預測 CIFAR-10
數(shù)據(jù)集中的圖像類別。訓練過程如下:
首先,將神經(jīng)網(wǎng)絡的權(quán)重初始化為很小的隨機值。然后,網(wǎng)絡執(zhí)行一系列的訓練步驟。在每個訓練步驟中,通過網(wǎng)絡傳遞一批圖像,并進行誤差反向傳播以更新權(quán)重。batch_size
決定每個訓練步驟的批數(shù)據(jù)中包含多少圖像。批大小越大,梯度計算越穩(wěn)定,但每個訓練步驟速度越慢。如果在每個訓練步驟中都使用整個數(shù)據(jù)集計算梯度,將非常耗時且計算量過大,因此通常將批大小設置在 32
到 256
之間。
這個過程一直持續(xù)到數(shù)據(jù)集中的所有觀測樣本都被處理過 1
次為止,這樣就完成了第一個 epoch
。然后在第二個 epoch
中,數(shù)據(jù)再次以批的形式通過網(wǎng)絡進行傳遞。重復以上過程,直到完整指定的 epoch
次數(shù)。
在訓練過程中,Keras
輸出訓練過程的進展情況,如下圖所示。可以看到訓練數(shù)據(jù)集被分成 1,563
個批(每批包含 32
個圖像),并且它已經(jīng)在網(wǎng)絡中展示了 10
次(即經(jīng)歷了 10
個 epoch
),每批的處理速率約為 2
毫秒。分類交叉熵損失從 1.8534
下降到 1.2557
,準確率從 33.20%
增加到 55.20%
。
4.6 評估模型
該模型在訓練集上的準確率為 55.50%
,為了評估模型在從未見過的數(shù)據(jù)上表現(xiàn),可以使用 Keras
提供的 evaluate
方法:
model.evaluate(x_test, y_test)
# 313/313 [==============================] - 0s 826us/step - loss: 1.3732 - accuracy: 0.5118
輸出是我們監(jiān)測的指標列表:分類交叉熵和準確率??梢钥吹?,即使對于從未見過的圖像,該模型的準確率仍然為 51.18%
,考慮到我們僅僅使用了一個非?;镜纳窠?jīng)網(wǎng)絡,49.0%
可以說是一個很好的結(jié)果。
可以使用 predict
方法查看測試集上的預測結(jié)果:
CLASSES = np.array(
[
"airplane",
"automobile",
"bird",
"cat",
"deer",
"dog",
"frog",
"horse",
"ship",
"truck",
]
)
preds = model.predict(x_test)
preds_single = CLASSES[np.argmax(preds, axis=-1)]
actual_single = CLASSES[np.argmax(y_test, axis=-1)]
preds
是一個形狀為 [10000, 10]
的數(shù)組,即每個觀測樣本對應一個包含 10
個類別概率的向量。
使用 numpy
的 argmax
函數(shù)將這個概率數(shù)組轉(zhuǎn)換回單個預測結(jié)果。其中,使用 axis = -1
指定數(shù)組在最后一個維度(即類別維度)上壓縮,因此 preds_single
的形狀為 [10000, 1]
。
我們可以使用以下代碼查看圖片以及它們的標簽和預測結(jié)果:
n_to_show = 10
indices = np.random.choice(range(len(x_test)), n_to_show)
fig = plt.figure(figsize=(15, 3))
fig.subplots_adjust(hspace=0.4, wspace=0.4)
for i, idx in enumerate(indices):
img = x_test[idx]
ax = fig.add_subplot(1, n_to_show, i + 1)
ax.axis("off")
ax.text(
0.5,
-0.35,
"pred = " + str(preds_single[idx]),
fontsize=10,
ha="center",
transform=ax.transAxes,
)
ax.text(
0.5,
-0.7,
"act = " + str(actual_single[idx]),
fontsize=10,
ha="center",
transform=ax.transAxes,
)
ax.imshow(img)
plt.show()
下圖展示了模型的對隨機選擇數(shù)據(jù)的預測結(jié)果及其真實標簽:
小結(jié)
深度學習是一種機器學習算法,它通過構(gòu)建多層神經(jīng)網(wǎng)絡模型,自動地從輸入數(shù)據(jù)中進行特征學習,并輸出對應的預測結(jié)果。深度神經(jīng)網(wǎng)絡是構(gòu)建生成模型的基礎(chǔ),幾乎所有復雜的生成模型都以深度神經(jīng)網(wǎng)絡為核心。構(gòu)建生成模型時,其核心思想在于正確組合損失函數(shù)、激活函數(shù)和層形狀等。在本節(jié)中,介紹了生成模型與深度學習之間的聯(lián)系,以及深度神經(jīng)網(wǎng)絡模型中的各種基本組件,并使用 Keras
構(gòu)建了一個簡單的多層感知器。文章來源:http://www.zghlxwxcb.cn/news/detail-712975.html
系列鏈接
AIGC實戰(zhàn)——生成模型簡介
AIGC實戰(zhàn)——卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network, CNN)
AIGC實戰(zhàn)——自編碼器(Autoencoder)
AIGC實戰(zhàn)——變分自編碼器(Variational Autoencoder, VAE)
AIGC實戰(zhàn)——使用變分自編碼器生成面部圖像
AIGC實戰(zhàn)——生成對抗網(wǎng)絡(Generative Adversarial Network, GAN)
AIGC實戰(zhàn)——WGAN(Wasserstein GAN)文章來源地址http://www.zghlxwxcb.cn/news/detail-712975.html
到了這里,關(guān)于AIGC實戰(zhàn)——深度學習 (Deep Learning, DL)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!