深度學習基礎系列 VGG

2021-09-25 20:58:18 字數 4086 閱讀 2239

深度學習基礎系列:vgg

visual geometry group是牛津大學的乙個科研團隊。他們推出的一系列深度模型,被稱作vgg模型。

**名:《very deep convolutional networks for large-scale visual recognition》

vgg模型是2023年ilsvrc競賽的第二名,第一名是googlenet。但是vgg模型在多個遷移學習任務中的表現要優於googlenet。而且,從影象中提取cnn特徵,vgg模型是首選演算法。它的缺點在於,參數量有140m之多,需要更大的儲存空間。但是這個模型很有研究價值。

vgg的結構圖如下:

該系列包括a/a-lrn/b/c/d/e等6個不同的型號。其中的d/e,根據其神經網路的層數,也被稱為vgg16/vgg19。

從原理角度,vgg相比alexnet並沒有太多的改進。其最主要的意義就是實踐了「神經網路越深越好」的理念。也是自那時起,神經網路逐漸有了「深度學習」這個別名。

vgg-16的網路結構如下圖所示:

vgg-16的結構非常整潔,深度較alexnet深得多,裡面包含多個conv->conv->max_pool這類的結構,vgg的卷積層都是same的卷積,即卷積過後的輸出影象的尺寸與輸入是一致的,它的下取樣完全是由max pooling來實現。

vgg網路後接3個全連線層,filter的個數(卷積後的輸出通道數)從64開始,然後沒接乙個pooling後其成倍的增加,128、512,vgg的注意貢獻是使用小尺寸的filter,及有規則的卷積-池化操作。

vgg特點:

1.小卷積核。作者將卷積核全部替換為3x3(極少用了1x1);

2.小池化核。相比alexnet的3x3的池化核,vgg全部為2x2的池化核;

3.層數更深特徵圖更寬。基於前兩點外,由於卷積核專注於擴大通道數、池化專注於縮小寬和高,使得模型架構上更深更寬的同時,計算量的增加放緩;

與alexnet相比,可以看出vgg-nets的卷積核尺寸還是很小的,比如alexnet第一層的卷積層用到的卷積核尺寸就是11*11,這是乙個很大卷積核了。而反觀vgg-nets,用到的卷積核的尺寸無非都是1×1和3×3的小卷積核,用來替代大的filter尺寸。

3×3卷積核的優點:

多個3×3的卷基層比乙個大尺寸filter卷基層有更多的非線性,使得判決函式更加具有判決性

多個3×3的卷積層比乙個大尺寸的filter有更少的引數,假設卷基層的輸入和輸出的特徵圖大小相同為c,那麼三個3×3的卷積層引數個數3×(3×3×c×c)=27cc;乙個7×7的卷積層引數為49cc;所以可以把三個3×3的filter看成是乙個7×7filter的分解(中間層有非線性的分解)

vgg-16的keras實現:

def vgg_16():   

model = sequential()

model.add(conv2d(64,(3,3),strides=(1,1),input_shape=(224,224,3),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(conv2d(64,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(maxpooling2d(pool_size=(2,2)))

model.add(conv2d(128,(3,2),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(conv2d(128,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(maxpooling2d(pool_size=(2,2)))

model.add(conv2d(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(conv2d(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(conv2d(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(maxpooling2d(pool_size=(2,2)))

model.add(conv2d(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(conv2d(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(conv2d(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(maxpooling2d(pool_size=(2,2)))

model.add(conv2d(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(conv2d(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(conv2d(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))

model.add(maxpooling2d(pool_size=(2,2)))

model.add(flatten())

model.add(dense(4096,activation='relu'))

model.add(dropout(0.5))

model.add(dense(4096,activation='relu'))

model.add(dropout(0.5))

model.add(dense(1000,activation='softmax'))

return model

使用上述模型訓練貓狗分類,5000張貓,5000張狗,batch_size=8,epochs=50

訓練了30分鐘左右,大概已經訓練了10幾個epochs,accuracy 大概0.5,幾乎沒變,loss到是在變小

停止訓練,分析原因:

個人覺得原因大概是vgg引數較多,這個從模型大小也可以看出,vgg權重模型比inception,resnet權重模型大很多,要訓練成功估計需要更多的資料,需要增加資料。

方法一:這個實驗沒有使用資料增強,資料是先載入到記憶體,增加資料需要增加記憶體,浪費錢,不試了

方法二:使用資料增強,增加資料量,增加訓練epochs,因為個人電腦,資源有限,batch_size不可能設很大,訓練太浪費時間,不試了

結論:vgg常用於cnn特徵提取,但是很少從頭開始訓練模型,不是沒有道理,從頭訓練太麻煩了,建議採用遷移學習的方式

vgg的正確使用方式

參考**github連線: 中的dogs_vs_cats_vgg16.py

深度學習基礎 PyTorch實現VGG親身實踐

vgg的思路就是利用多個小尺寸的卷積核串聯代替之前網路的大尺寸卷積核,在保持感受野不下降的前提下,減少網路的引數。雖然vgg提出較早,但它仍用在計算機視覺的各個領域內,常被作為骨架網路的一部分 vgg的利用小尺寸卷積核的思路也是後續很多優秀網路結構的原始啟發。閒話少敘,中,vgg復現的關鍵資訊是下面...

深度學習總結六 VGG

證明了網路的深度在一定程度上提公升了模型的效果。2個33的卷積核相當於1個55的卷積核,並且前者訓練引數更少。網路c比b多乙個1 1的卷積核,即增加乙個非線性函式,增加模型複雜度。網路d在c的基礎上將11卷積核修改為33卷積核,增大感受野,效果更好。使用帶有動量的mini batch梯度下降法,ba...

深度網路VGG理解

源鏈結 ilsvrc 2014的第二名是karen simonyan和 andrew zisserman實現的卷積神經網路,現在稱其為 vggnet 它主要的貢獻是展示出網路的深度是演算法優良效能的關鍵部分。他們最好的網路包含了16個卷積 全連線層。網路的結構非常一致,從頭到尾全部使用的是3x3的卷...