南陽網(wǎng)站公司簡短的軟文范例
我們將深入理解卷積神經(jīng)網(wǎng)絡的原理,以及它為什么在計算機視覺任務上如此成功。我們先來看一個簡單的卷積神經(jīng)網(wǎng)絡示例,它用干對 MNIST數(shù)字進行分類。這個任務在第2章用密集連接網(wǎng)絡做過,當時的測試精度約為 97.8%。雖然這個卷積神經(jīng)網(wǎng)絡很簡單,但其精度會超過第2章的密集連接模型。
代碼 8-1給出了一個簡單的卷積神經(jīng)網(wǎng)絡。它是 conv2D層和 MaxPooling2D 層的堆疊,你很快就會知道這些層的作用。我們將使用第7章介紹過的函數(shù)式 API來構(gòu)建模型。
代碼8-1 實例化一個小型卷積神經(jīng)網(wǎng)絡
from tensorflow import kerasfrom tensorflow.keras import layersinputs = keras.Input(shape=(28, 28, 1))x = layers.Conv2D(filters=32, kernel_size=3, activation="relu")(inputs)x = layers.MaxPooling2D(pool_size=2)(x)x = layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x)x = layers.MaxPooling2D(pool_size=2)(x)x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x)x = layers.Flatten()(x)outputs = layers.Dense(10, activation="softmax")(x)model = keras.Model(inputs=inputs, outputs=outputs)
卷積神經(jīng)網(wǎng)絡接收的輸入張量的形狀為(image height,image width,image channels)(不包括批量維度)。本例中,我們設(shè)置卷積神經(jīng)網(wǎng)絡處理大小為(28,28,1)的輸入,這正是 MNIST 圖像的格式。
我們來看一下這個卷積神經(jīng)網(wǎng)絡的架構(gòu),如代碼 8-2所示。
代碼 8-2 顯示模型的概述信息
model.summary()
可以看到,每個 conv2D層和 MaxPooling2D層的輸出都是一個形狀為(height,width,channels)的3階張量。(張量的階數(shù)相同,形狀不同)寬度和高度這兩個維度的尺寸通常會隨著模型加深而減小。通道數(shù)對應傳入Conv2D層的第一個參數(shù)(32、64或 128)。在最后一個 conv2D層之后,我們得到了形狀為(3,3,128)的輸出,即通道數(shù)為 128的3x3特征圖。下一步是將這個輸出傳入密集連接分類器中,即 Dense 層的堆疊,你已經(jīng)很熟悉了。這些分類器可以處理1階的向量,而當前輸出是3階張量。為了讓二者匹配,我們先用 Flatten 層將三維輸出展平為一維,然后再添加 Dense 層。最后,我們進行十類別分類,所以最后一層使用帶有 10個輸出的 softmax 激活函數(shù)。下面我們在 MNIST數(shù)字上訓練這個卷積神經(jīng)網(wǎng)絡。我們將重復使用的MNIST 示例中的很多代碼。
由于我們要做的是帶有 softmax 輸出的十類別分類,因此要使用分類交叉熵損失,而且由于標簽是整數(shù),因此要使用稀疏分類交叉熵損失sparse categorical crossentropy,如代碼 8-3 所示。注意此處代碼執(zhí)行需要網(wǎng)絡才能執(zhí)行。
from tensorflow.keras.datasets import mnist(train_images, train_labels), (test_images, test_labels) = mnist.load_data()train_images = train_images.reshape((60000, 28, 28, 1))train_images = train_images.astype("float32") / 255test_images = test_images.reshape((10000, 28, 28, 1))test_images = test_images.astype("float32") / 255model.compile(optimizer="rmsprop",loss="sparse_categorical_crossentropy",metrics=["accuracy"])model.fit(train_images, train_labels, epochs=5, batch_size=64)
我們在測試數(shù)據(jù)上評估模型,如代碼 8-4所示。
代碼 8-4 評估卷積神經(jīng)網(wǎng)絡
密集連接模型的測試精度約為 97.8%,而這個簡單的卷積神經(jīng)網(wǎng)絡的測試精度達到99.1%,錯誤率降低了約 60%(相對比例)。這相當不錯!
但是,與密集連接模型相比,這個簡單卷積神經(jīng)網(wǎng)絡的效果為什么這么好?要回答這個問題,我們來深入了解 Conv2D 層和 MaxPooling2D層的作用。
總結(jié):在一定條件下,卷積神經(jīng)網(wǎng)絡在圖像識別上精度優(yōu)于密集鏈接模型。每個 conv2D層和 MaxPooling2D層的輸出都是一個形狀為(height,width,channels)的3階張量。寬度和高度這兩個維度的尺寸通常會隨著模型加深而減小。而通道數(shù)會模型加深而增加。我的理解就是通過懸系,模型對于特征的理解越來越豐富。