卷积神经网络(三)-ZF-Net和VGG-Nets
卷積神經網絡(一)-LeNet
卷積神經網絡(二)-AlexNet
?卷積神經網絡(三)-ZF-Net和VGG-Nets
卷積神經網絡(四)-GoogLeNet
卷積神經網絡(五)-ResNet
卷積神經網絡(六)-DenseNet
目錄
?
ZF-Net
VGG-Nets
ZF-Net
ZFNet是2013ImageNet分類任務的冠軍,其網絡結構沒什么改進,只是調了調參,性能較Alex提升了不少。ZF-Net只是將AlexNet第一層卷積核由11變成7,步長由4變為2,第3,4,5卷積層轉變為384,384,256。這一年的ImageNet還是比較平靜的一屆,其冠軍ZF-Net的名堂也沒其他屆的經典網絡架構響亮。
?ZF-Net的Keras實現
def ZF_Net():model = Sequential() model.add(Conv2D(96,(7,7),strides=(2,2),input_shape=(224,224,3),padding='valid',activation='relu',kernel_initializer='uniform')) model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2))) model.add(Conv2D(256,(5,5),strides=(2,2),padding='same',activation='relu',kernel_initializer='uniform')) model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2))) model.add(Conv2D(384,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform')) model.add(Conv2D(384,(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=(3,3),strides=(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 modelVGG-Nets
VGG-Nets是由牛津大學VGG(Visual Geometry Group)提出,是2014年ImageNet競賽定位任務的第一名和分類任務的第二名的中的基礎網絡。VGG可以看成是加深版本的AlexNet. 都是conv layer + FC layer,在當時看來這是一個非常深的網絡了,因為層數高達十多層,我們從其論文名字就知道了(《Very Deep Convolutional Networks for Large-Scale Visual Recognition》),當然以現在的目光看來VGG真的稱不上是一個very deep的網絡。
上面一個表格是描述的是VGG-Net的網絡結構以及誕生過程。為了解決初始化(權重初始化)等問題,VGG采用的是一種Pre-training的方式,這種方式在經典的神經網絡中經常見得到,就是先訓練一部分小網絡,然后再確保這部分網絡穩定之后,再在這基礎上逐漸加深。表1從左到右體現的就是這個過程,并且當網絡處于D階段的時候,效果是最優的,因此D階段的網絡也就是VGG-16了!E階段得到的網絡就是VGG-19了!VGG-16的16指的是conv+fc的總層數是16,是不包括max pool的層數!
下面這個圖就是VGG-16的網絡結構。
?
由上圖看出,VGG-16的結構非常整潔,深度較AlexNet深得多,里面包含多個conv->conv->max_pool這類的結構,VGG的卷積層都是same的卷積,即卷積過后的輸出圖像的尺寸與輸入是一致的,它的下采樣完全是由max pooling來實現。
VGG網絡后接3個全連接層,filter的個數(卷積后的輸出通道數)從64開始,然后沒接一個pooling后其成倍的增加,128、512,VGG的注意貢獻是使用小尺寸的filter,及有規則的卷積-池化操作。
?閃光點
- 卷積層使用更小的filter尺寸和間隔
與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的分解(中間層有非線性的分解)
1*1卷積核的優點:
- 作用是在不影響輸入輸出維數的情況下,對輸入進行線性形變,然后通過Relu進行非線性處理,增加網絡的非線性表達能力。
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?
總結
以上是生活随笔為你收集整理的卷积神经网络(三)-ZF-Net和VGG-Nets的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一周复习
- 下一篇: pms输变电状态监测_输变电设备状态监测