赞
踩
VGGNet 是牛津大学计算机视觉组(Visual Geometry Group)和谷歌 DeepMind 一起研究出来的深度卷积神经网络,因而冠名为 VGG。在2014年的 ILSVRC 中取得了第二名的成绩,可能你会问这么厉害的网络为什么不是第一名,因为当年实际提交 VGG 版本时作者并未作进一步的优化。
相较于之前的 Le-Net5 和 AlexNet,VGGNet 结构中大量使用 3x3 的卷积核和 2x2 的池化核,首次将卷积神经网络的卷积深度推向更深,最为典型的 VGGNet 是 VGG16 和 VGG19,其中的 16 的含义即网络中包含16个卷积层和全连接层, 19即即网络中包含19个卷积层和全连接层。
论文地址:
https://arxiv.org/abs/1409.1556
VGG的网络结构
在论文中,作者使用了 A-E 五个不同深度水平的卷积网络进行试验,从A到E网络深度不断加深:
其中 D 和 E 即我们常说的 VGG16 和 VGG19。可以看到 VGG16 网络需要训练的参数数量达到了 1.38 亿个,这个数量是巨大的。我们以 VGG16 为例简单探究一下它的网络结构。VGG16 各层的结构和参数如下:
C1-1层是个卷积层,其输入输出结构如下:
输入: 224 x 224 x 3 滤波器大小: 3 x 3 x 3 滤波器个数:64
输出: 224 x 224 x 64
C1-2层是个卷积层,其输入输出结构如下:
输入: 224 x 224 x 3 滤波器大小: 3 x 3 x 3 滤波器个数:64
输出: 224 x 224 x 64
P1层是C1-2后面的池化层,其输入输出结构如下:
输入: 224 x 224 x 64 滤波器大小: 2 x 2 滤波器个数:64
输出: 112 x 112 x 64
C2-1层是个卷积层,其输入输出结构如下:
输入: 112 x 112 x 64 滤波器大小: 3 x 3 x 64 滤波器个数:128
输出: 112 x 112 x 128
C2-2层是个卷积层,其输入输出结构如下:
输入: 112 x 112 x 64 滤波器大小: 3 x 3 x 64 滤波器个数:128
输出: 112 x 112 x 128
P2层是C2-2后面的池化层,其输入输出结构如下:
输入: 112 x 112 x 128 滤波器大小: 2 x 2 滤波器个数:128
输出: 56 x 56 x 128
C3-1层是个卷积层,其输入输出结构如下:
输入: 56 x 56 x 128 滤波器大小: 3 x 3 x 128 滤波器个数:256
输出: 56 x 56 x 256
C3-2层是个卷积层,其输入输出结构如下:
输入: 56 x 56 x 256 滤波器大小: 3 x 3 x 256 滤波器个数:256
输出: 56 x 56 x 256
C3-3层是个卷积层,其输入输出结构如下:
输入: 56 x 56 x 256 滤波器大小: 3 x 3 x 256 滤波器个数:256
输出: 56 x 56 x 256
P3层是C3-3后面的池化层,其输入输出结构如下:
输入: 56 x 56 x 256 滤波器大小: 2 x 2 滤波器个数:256
输出: 28 x 28 x 256
C4-1层是个卷积层,其输入输出结构如下:
输入: 28 x 28 x 256 滤波器大小: 3 x 3 x 256 滤波器个数:512
输出: 28 x 28 x 512
C4-2层是个卷积层,其输入输出结构如下:
输入: 28 x 28 x 512 滤波器大小: 3 x 3 x 256 滤波器个数:512
输出: 28 x 28 x 512
C4-3层是个卷积层,其输入输出结构如下:
输入: 28 x 28 x 512 滤波器大小: 3 x 3 x 256 滤波器个数:512
输出: 28 x 28 x 512
P4层是C4-3后面的池化层,其输入输出结构如下:
输入: 28 x 28 x 512 滤波器大小: 2 x 2 滤波器个数:512
输出: 14 x 14 x 512
C5-1层是个卷积层,其输入输出结构如下:
输入: 14 x 14 x 512 滤波器大小: 3 x 3 x 512 滤波器个数:512
输出: 14 x 14 x 512
C5-2层是个卷积层,其输入输出结构如下:
输入: 14 x 14 x 512 滤波器大小: 3 x 3 x 512 滤波器个数:512
输出: 14 x 14 x 512
C5-3层是个卷积层,其输入输出结构如下:
输入: 14 x 14 x 512 滤波器大小: 3 x 3 x 512 滤波器个数:512
输出: 14 x 14 x 512
P5层是C5-3后面的池化层,其输入输出结构如下:
输入: 14 x 14 x 512 滤波器大小: 2 x 2 滤波器个数:512
输出: 7 x 7 x 512
F6层是个全连接层,其输入输出结构如下:
输入:4096
输出:4096
F7层是个全连接层,其输入输出结构如下:
输入:4096
输出:4096
F8层也是个全连接层,即输出层,其输入输出结构如下:
输入:4096
输出:1000
# 导包 from keras.datasets import cifar10 from keras.models import Sequential from keras.layers import Dense,Dropout,Activation,Flatten,Conv2D,MaxPooling2D from keras.utils import to_categorical from keras.optimizers import SGD # 导入数据 (x_train,y_train),(x_test,y_test) = cifar10.load_data() x_train = x_train.astype("float32") x_test = x_test.astype("float32") y_train = to_categorical(y_train,10) y_test = to_categorical(y_test,10) # 定义VGG16模型 model = Sequential() # block1 model.add(Conv2D(filters=64,kernel_size=(3,3),activation="relu",padding="same",name="block1_conv1",input_shape=(32,32,3))) model.add(Conv2D(filters=64,kernel_size=(3,3),activation="relu",padding="same",name="block1_conv2")) model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),name="block1_pool")) # block2 model.add(Conv2D(filters=128,kernel_size=(3,3),activation="relu",padding="same",name="block2_conv1")) model.add(Conv2D(filters=128,kernel_size=(3,3),activation="relu",padding="same",name="block2_conv2")) model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),name="block2_pool")) # block3 model.add(Conv2D(filters=256,kernel_size=(3,3),activation="relu",padding="same",name="block3_conv1")) model.add(Conv2D(filters=256,kernel_size=(3,3),activation="relu",padding="same",name="block3_conv2")) model.add(Conv2D(filters=256,kernel_size=(3,3),activation="relu",padding="same",name="block3_conv3")) model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),name="block3_pool")) # block4 model.add(Conv2D(filters=512,kernel_size=(3,3),activation="relu",padding="same",name="block4_conv1")) model.add(Conv2D(filters=512,kernel_size=(3,3),activation="relu",padding="same",name="block4_conv2")) model.add(Conv2D(filters=512,kernel_size=(3,3),activation="relu",padding="same",name="block4_conv3")) model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),name="block4_pool")) # block5 model.add(Conv2D(filters=512,kernel_size=(3,3),activation="relu",padding="same",name="block5_conv1")) model.add(Conv2D(filters=512,kernel_size=(3,3),activation="relu",padding="same",name="block5_conv2")) model.add(Conv2D(filters=512,kernel_size=(3,3),activation="relu",padding="same",name="block5_conv3")) model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),name="block5_pool")) model.add(Flatten()) model.add(Dense(4096,activation="relu",name="fc1")) model.add(Dropout(0.5)) model.add(Dense(4096,activation="relu",name="fc2")) model.add(Dropout(0.5)) model.add(Dense(10,activation="softmax",name="prediction")) model.summary() sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # compile model.compile(loss="categorical_crossentropy",optimizer=sgd,metrics=['accuracy']) # train model.fit(x_train,y_train,epochs=8,batch_size=64,validation_split=0.3,verbose=1)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。