当前位置:   article > 正文

【经典卷积神经网络】之VGGNet分析及实现CIFAR-10分类_1.利用vggnet实现cifar的图像分类

1.利用vggnet实现cifar的图像分类

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

一、内容

VGGNet牛津大学计算机视觉组(Visual Geometry Group)和谷歌 DeepMind 一起研究出来的深度卷积神经网络,因而冠名为 VGG。在2014年的 ILSVRC 中取得了第二名的成绩,可能你会问这么厉害的网络为什么不是第一名,因为当年实际提交 VGG 版本时作者并未作进一步的优化。
在这里插入图片描述
相较于之前的 Le-Net5AlexNetVGGNet 结构中大量使用 3x3 的卷积核和 2x2 的池化核,首次将卷积神经网络的卷积深度推向更深,最为典型的 VGGNet 是 VGG16VGG19,其中的 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

三、结果

1.模型结构

在这里插入图片描述

2.训练集、验证集

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/957502
推荐阅读
相关标签
  

闽ICP备14008679号