前言
VGG 系列模型是十分优秀的模型,现在很多网络中都还能看见它的身影。本文重新整理了一下VGG16 Keras 版本的复现代码。用迁移学习的方式去加载权重,然后训练模型。
一、VGGNet
1.简介
随着深度学习的不断发展,加深的网络开始不断的出现了,VGGNet 验证了卷积网络的加深,的确能够提升网络的性能,但计算量也随之增大了。VGGNet 在2014年ILSVRC得到挑战赛中赢得了定位任务的冠军和分类任务的亚军。VGGNet的思想就是采用2个3x3的卷积核代替了5x5的卷积核,网络的结构也从传统的卷积池化相连,变成了多层卷积后再跟池化相连。有两种基本类型的VGGNet 就是我们常用的VGG16 和VGG19.
2. 网络结构
神经网络,通常都是上图比较直接。
- A模型: 拥有八个卷积层(卷积核核大小均为3×3),5个最大池化和3个全连接层。
- A-LRN模型:卷积核核大小均为3×3,与A模型几乎完全相同,唯一的区别就是第一个卷积后加入了LRN(局部响应归一化层,在前面的文章AlexNet中提出)。但是通过实验证明LRN不仅会增加计算时候和内存消耗,对网络性能,并没有很大的提升。所以在后续的网络中都取消了。
- B模型:拥有10个卷积层(核大小均为3×3)、 5个最大池化层和3个全连接层。
- C模型:拥有13个卷积层(10个核大小为3×3, 3个核大小为1×1)、 5个最大池 化层和 3 个全连接层。
- D模型:拥有13个卷积层(核大小均为3×3)、 5个最大池化层和3个全连接层。
- E模型:拥有16个卷积层(核大小均为3×3)、 5个最大池化层和3个全连接层。
D,E模型就是我们常说的VGG16和VGG19啦!!!!
2.Keras复现
Keras的复现就相对比较简单了,卷积池化的不断堆叠。但再这里我重点去介绍的是Keras中的ImageDataGenerator,它可以批量读取数据,并进行数据增强,不用一次把数据读入内存中。也是防止内存溢出的方法。参数含义再代码里都有注解,这里不再赘述。
先看一下VGG16的详细结构。
keras 中自带VGG16的结构 我们可以通过下面的操作方式来下载预训练权重:
from keras.applications.vgg16 import VGG16
moded2 = VGG16(weights='imagenet',include_top=True)
提示下载后的权重默认存放在 C:\Users\username\.keras\models目录下
首先先来定义VGG16的具体结构,并且加载与训练权重:
from keras import layers
from keras.layers import (Activation, AveragePooling2D,
BatchNormalization, Conv2D, Dense,
Flatten, Input, MaxPooling2D,
ZeroPadding2D)
from keras.models import Model
def vgg16(conv_arch,input_shape=(224,224,3),classes=1000):
#------------------------------------------------------------
# conv_arch = ((2, 64), (2, 128), (3, 256), (3, 512), (3, 512))
# 第一个数字表示重复次数,第二个数字表示卷积核的个数
# input_shape # 输入图片的大小
# classes # 分类数
# ----------------------------------------------------------
inputs = Input(shape=input_shape)
x = inputs
for (num_convs,num_filter) in conv_arch:
for _ in range(num_convs):
x = Conv2D(num_filter,kernel_size=3,padding='same',activation='relu')(x)
x=MaxPooling2D(pool_size=(2, 2), strides=2)(x)
x = Flatten(name='flatten')(x)
x = Dense(4096, activation='relu', name='fc1'