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