vgg网络结构以及keras实现

图像分类系列:

0、BP前反馈神经网络原理详解

1、Lenet详解

2、Alexnet详解

3、VGG网络结构

4、NIN网络结构

5、Googlenet inception v1 结构详解、inception v2 和 inception v3

VGG和GoogleNet同在2014年参赛,图像分类任务中GoogLeNet第一,VGG第二,它们都是重要的网络结构。VGG在AlexNet基础上做了改进,整个网络都使用了同样大小的3*3卷积核尺寸和2*2最大池化尺寸。VGG网络结构简单,是一个很好的特征提取器。

参考https://blog.csdn.net/weixin_40031404/article/details/80133583

一、网络结构

VGG可以设计成不同的深度,见下表:

vgg网络结构以及keras实现_第1张图片

拿出19层的vgg 19作分析见下表:

vgg网络结构以及keras实现_第2张图片

vgg网络结构以及keras实现_第3张图片

二、技术点

1、小卷积核

首先是两个3x3卷积核可以替代一个5x5卷积核,三个3x3卷积核可以替代一个7x7卷积核。作用是a、减少参数量以及计算量 b、增加激活函数以增加网络的非线性

其次是增加了1x1卷积层,作用是 a、通道之间的特征融合 b、 增加激活函数以增加网络的非线性表达能力。

2、小池化核

2x2池化核代替3x3池化核,相比平均池化,max-pooling更能捕捉图像的变化。

3、层数更深、特征图更宽

图像更深是小尺寸卷积核,更宽是由于更多的卷积核数。

4、全连接转卷积

在测试时采用卷积代替全连接测试,可以使得输入图片的尺寸不受限制,详细可以参考https://blog.csdn.net/fanzy1234/article/details/85216087。

5、Muti-Scale多尺度图片数据扩增

将原始图像进行不同尺度S的缩放,在缩放后的图片上随机裁剪成224x224的图片,这样就可以大大增加训练图片的数量

6、预训练

在训练深层网路时,可以用训练浅层网络得到的参数作为深层网络的初始化参数,增加深层网络的收敛速度。

作者把浅层网络A的前4个卷积层(感觉是每个阶段的以第一卷积层)和最后全连接层的权值当做其他网络的初始值,未赋值的中间层通过随机初始化。

三 keras实现


from utils import loaddata
from utils import loss_history
from utils import plot_loss
from keras.utils.vis_utils import plot_model

import os
import cv2
import numpy as np

from keras.models import Sequential
from keras.layers import Dense,Conv2D,MaxPooling2D,Flatten,BatchNormalization,Dropout
from keras.optimizers import SGD
from keras.utils import np_utils

path='/home/fanzy/data/catdog/train/'
size=224
x_train,x_test,y_train,y_test=loaddata.catdogimg(path,size,0.3)

model=Sequential()
model.add(Conv2D(64,(3,3),padding='same',input_shape=(size,size,3),activation='tanh'))
model.add(BatchNormalization())
model.add(Conv2D(64,(3,3),padding='same',activation='tanh'))
model.add(BatchNormalization())
model.add(MaxPooling2D((2,2),strides=2))

model.add(Conv2D(128,(3,3),padding='same',activation='tanh'))
model.add(Conv2D(128,(3,3),padding='same',activation='tanh'))
model.add(MaxPooling2D((2,2),strides=2))

model.add(Conv2D(256,(3,3),padding='same',activation='tanh'))
model.add(Conv2D(256,(3,3),padding='same',activation='tanh'))
model.add(MaxPooling2D((2,2),strides=2))

model.add(Conv2D(512,(3,3),padding='same',activation='tanh'))
model.add(Conv2D(512,(3,3),padding='same',activation='tanh'))
model.add(Conv2D(512,(3,3),padding='same',activation='tanh'))
model.add(Conv2D(512,(3,3),padding='same',activation='tanh'))
model.add(MaxPooling2D((2,2),strides=2))

model.add(Conv2D(512,(3,3),padding='same',activation='tanh'))
model.add(Conv2D(512,(3,3),padding='same',activation='tanh'))
model.add(Conv2D(512,(3,3),padding='same',activation='tanh'))
model.add(Conv2D(512,(3,3),padding='same',activation='tanh'))
model.add(MaxPooling2D((2,2),strides=2))

model.add(Flatten())
model.add(Dense(1024,activation='tanh'))
model.add(Dense(1024,activation='tanh'))
model.add(Dense(1024,activation='tanh'))
model.add(Dense(2,activation='softmax'))

plot_model(model,to_file='vgg.png',show_shapes=True,show_layer_names=False)

 

你可能感兴趣的:(CNN,卷积网络)