簡單介紹CNN體系結構-自己動手使用VGG-16進行評估


簡單介紹CNN體系結構-自己動手使用VGG-16進行評估

VGG16架構

在本文中我們將深入研究所有標準的CNN架構,使其像VGG-16一樣簡單,或者像Xception一樣複雜。在當今世界,卷積神經網絡在能力方面已經取得了長足的進步。它可以解決複雜的圖像分類任務,甚至是人類無法完成的任務,如對稀有物種狗的分類。在本文中我們將研究VGG-16體系結構。

簡單介紹CNN體系結構-自己動手使用VGG-16進行評估

VGG16架構

什麼是VGG-16?
VGG-16是一種卷積神經網絡體系結構,其名稱VGG-16來自於它具有16層的事實。它的層由卷積層,最大池化層,激活層,完全連接層組成。

簡單介紹CNN體系結構-自己動手使用VGG-16進行評估

VGG16架構

有13個卷積層,5個最大池化層和3個密集層,這些層總計為21個層,但只有16個權重層。Conv 1的濾波器數量為64,而Conv 2的濾波器為128,Conv 3的濾波器為256,而Conv 4和Conv 5的濾波器為512。VGG-16網絡在ImageNet數據集上進行了訓練,該數據集具有1400萬幅圖像和1000個類別,並且達到前5位準確性的92.7%。它通過用較小的3x3濾波器替換第一和第二卷積層中大小為11和5的大型濾波器來超越AlexNet網絡。現在,我們將在Keras中使用VGG-16訓練圖像數據集。

實例

接下來我們需要運行模型來可視化它,我們使用的是Kaggle中的貓和狗數據集。(https://www.kaggle.com/tongpython/cat-and-dog/data)

我們先導入我們需要的部分庫,其他部分的庫會在我們使用的時候再導入。

<code>import keras
import matplotlib.pyplot as plt
from keras import backend as K
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten, MaxPool2D
from keras.optimizers import Adam,SGD,Adagrad,Adadelta,RMSprop
from keras.utils import to_categorical
/<code>

我們需要使用keras,tensorflow來運行模型並進行可視化,需要使用matplotlib庫。

<code>from keras.preprocessing.image import ImageDataGenerator
import numpy as np
trdata = ImageDataGenerator()
traindata = trdata.flow_from_directory(directory="training_set/training_set",target_size=(227,227))
tsdata = ImageDataGenerator()
testdata = tsdata.flow_from_directory(directory="test_set/test_set", target_size=(227,227))/<code>

這是一個名為ImageDataGenerator的keras預處理庫,我們在其中預處理數據。在這裡,我們將所有圖像的大小設置為224x224,因為這是VGG-16網絡的標準輸入大小。

注意:請使用訓練和測試數據集的正確目錄。現在,我們將使用Keras Sequential API定義模型。我們將使用卷積層,最大池化層和密集層定義VGG-16網絡。

<code>model = Sequential()
model.add(Conv2D(input_shape=(224,224,3),filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(Conv2D(filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Flatten())
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=2, activation="softmax"))/<code>

現在我們需要定義優化器和損失函數。

<code>from keras.optimizers import Adam 
opt = Adam(lr=0.001) model.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])/<code>

現在,我們需要訓練我們的模型,我們已經使用了兩個回調函數(ModelCheckpoint和earlystop),在本文中這不是我們的重點,我不會深入這兩個的細節。

<code>from keras.callbacks import ModelCheckpoint, EarlyStopping
checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)
early = EarlyStopping(monitor='val_acc', min_delta=0, patience=20, verbose=1, mode='auto')
hist = model.fit_generator(steps_per_epoch=10,generator=traindata, validation_data= testdata, validation_steps=10,epochs=10,callbacks=[checkpoint,early])/<code>

所以我們經過了10個週期的模型訓練後已經可以做出我們想要的工作了,顯然還可以進行更多次的訓練週期以獲得更準確的結果。

<code>from keras.preprocessing import image
img = image.load_img("website-donate-mobile.jpg",target_size=(227,227))
img = np.asarray(img)
plt.imshow(img)
img = np.expand_dims(img, axis=0)
from keras.models import load_model
saved_model = load_model("alexnet_1.h5")
output = saved_model.predict(img)
if output[0][0] > output[0][1]:
    print("cat")
else:
/<code>
簡單介紹CNN體系結構-自己動手使用VGG-16進行評估

因此,該模型可以正確預測這是一隻狗。因此,最終構建了模型,接下來的步驟可能是將其部署到GCP或使用flask,我們最終將在以後的文章中進行介紹。


分享到:


相關文章: