图像分类系列:
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可以设计成不同的深度,见下表:
拿出19层的vgg 19作分析见下表:
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个卷积层(感觉是每个阶段的以第一卷积层)和最后全连接层的权值当做其他网络的初始值,未赋值的中间层通过随机初始化。
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)