【经典卷积神经网络】之VGGNet分析及实现CIFAR-10分类

【经典卷积神经网络】之VGGNet分析及实现CIFAR-10分类

一、内容

VGGNet牛津大学计算机视觉组(Visual Geometry Group)和谷歌 DeepMind 一起研究出来的深度卷积神经网络,因而冠名为 VGG。在2014年的 ILSVRC 中取得了第二名的成绩,可能你会问这么厉害的网络为什么不是第一名,因为当年实际提交 VGG 版本时作者并未作进一步的优化。
【经典卷积神经网络】之VGGNet分析及实现CIFAR-10分类_第1张图片
相较于之前的 Le-Net5AlexNetVGGNet 结构中大量使用 3x3 的卷积核和 2x2 的池化核,首次将卷积神经网络的卷积深度推向更深,最为典型的 VGGNet 是 VGG16VGG19,其中的 16 的含义即网络中包含16个卷积层和全连接层, 19即即网络中包含19个卷积层和全连接层。

论文地址:
https://arxiv.org/abs/1409.1556

VGG的网络结构
在论文中,作者使用了 A-E 五个不同深度水平的卷积网络进行试验,从A到E网络深度不断加深:
【经典卷积神经网络】之VGGNet分析及实现CIFAR-10分类_第2张图片
其中 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)

三、结果

1.模型结构

【经典卷积神经网络】之VGGNet分析及实现CIFAR-10分类_第3张图片

2.训练集、验证集

【经典卷积神经网络】之VGGNet分析及实现CIFAR-10分类_第4张图片

你可能感兴趣的:(【经典卷积神经网络】之VGGNet分析及实现CIFAR-10分类)