手机网站404页面模板,中国建设部网站能查叉车证,光电网站建设,网站推广的常用方法有哪些GoogleNet网络详解与keras实现 GoogleNet网络详解与keras实现GoogleNet系列网络的概览Pascal_VOC数据集第一层目录第二层目录第三层目录 InceptionV1模块介绍Inception的架构GoogleNet的图片Keras代码实现为了搭建Inception网络我们使用了以下策略整个代码的流程如下 实验结果实…GoogleNet网络详解与keras实现 GoogleNet网络详解与keras实现GoogleNet系列网络的概览Pascal_VOC数据集第一层目录第二层目录第三层目录 InceptionV1模块介绍Inception的架构GoogleNet的图片Keras代码实现为了搭建Inception网络我们使用了以下策略整个代码的流程如下 实验结果实验结果分析本博客相关引用 本博客旨在给经典的GoogleNet网络进行详解与代码实现如有不足或者其他的见解请在本博客下面留言。 GoogleNet系列网络的概览
InceptionV1,通过把不同尺寸的卷积核如1x1,3x3,5x5进行堆叠增加了网络对不同尺度的适应性。并且通过在3x3的网络5x5的网络后加入1x1使得网络的计算复杂度降低而且提高网络的非线性的程度基于更强的表征能力。InceptionV2,加入了BatchNormalization层减少了Internal Variance Shift。使得每一程的输出的分布都满足指定的高斯分布可以防止训练集与测试集之间分布的不匹配还能加快网络收敛速度防止过拟合。InceptionV3,在InceptionV3中google将分解的思想用到了极致把二维卷积核(NxN)拆成两个方向上的一维卷积核(Nx1,1xN)。这样做不仅仅加快了网络的运算速度而且由于增加网络的层数使得网络的非线性增加提高网络的表征能力。InceptionV4,尝试着把Inception的结构与Resnet的结构进行结合并设计了一个更深更加优秀的网络InceptionV4。 在本篇博客中我们将实现一个类似于InceptionV2的结构并用VOC2012的数据集进行网络的训练验证与测试。为了快速开发本次我们把Keras作为代码的框架。 Pascal_VOC数据集
Pascal VOC为图像识别检测与分割提供了一整套标准化的优秀的数据集每一年都会举办一次图像识别竞赛。下面是VOC2012训练集(包括验证集)的下载地址。
VOC2012里面有20类物体的图片图片总共有1.7万张。我把数据集分成了3个部分训练集验证集测试集比例为8:1:1。 下面是部分截图
第一层目录 第二层目录 第三层目录 接着我们使用keras代码来使用这个数据集代码如下
IM_WIDTH224 #图片宽度
IM_HEIGHT224 #图片高度
batch_size32 #批的大小#train data
train_datagen ImageDataGenerator(rotation_range30, width_shift_range0.2,height_shift_range0.2,shear_range0.2,zoom_range0.2,horizontal_flipTrue,featurewise_centerTrue
)train_generator train_datagen.flow_from_directory(train_root,target_size(IM_WIDTH, IM_HEIGHT),batch_sizebatch_size,
)#vaild data
vaild_datagen ImageDataGenerator(rotation_range30,width_shift_range0.2,height_shift_range0.2,shear_range0.2,zoom_range0.2,horizontal_flipTrue,featurewise_centerTrue
)
vaild_generator train_datagen.flow_from_directory(vaildation_root,target_size(IM_WIDTH, IM_HEIGHT),batch_sizebatch_size,
)#test data
test_datagen ImageDataGenerator(rotation_range30,width_shift_range0.2,height_shift_range0.2,shear_range0.2,zoom_range0.2,horizontal_flipTrue,featurewise_centerTrue
)
test_generator train_datagen.flow_from_directory(test_root,target_size(IM_WIDTH, IM_HEIGHT),batch_sizebatch_size,
)我使用了3个ImageDataGenerator分别来使用训练集验证集与测试集的数据。使用ImageDataGenerator需要导入相应的模块from keras.preprocessing.image import ImageDataGenerator。ImageDataGenrator可以用来做数据增强提高模型的鲁棒性.它里面提供了许多变换包括图片旋转对称平移等等操作。里面的flow_from_directory方法可以从相应的目录里面批量获取图片这样就可以不用一次性读取所有图片(防止内存不足)。
InceptionV1模块介绍
要想理解Googlenet的结构第一步必须先知道Inception的结构因为它是由多个Inception的结构组合而成的。如下图Fig.2所示(a)表示朴素的版本的inception v1示意图(b)表示降维版本的Inception v1示意图。 Inception的主要思想基于——一个卷积网络里面的局部稀疏最优结构往往可以由简单可复用的密集组合来近似或者替代。就像(a)里面1x1,3x3,5x5的卷积层,与3x3的池化层的组合一个inception。这样做的几点说明
不同尺寸的卷积核可以提取不同尺度的信息。采用1x1,3x3,5x5可以方便对齐padding分别为0,1,2就可以对齐。由于池化层在CNN网络里面的成功运用也把池化层当做组合的一部分。由于Googlenet是好几个Inception模块的堆叠而且往往越后面的Inception模块提取的是更加高级抽象的特征而由于高级抽象的特征的时域联系会降低。(在这里加上一点个人理解当提取的特征比较简单比如边缘轮廓的时候往往只需要提取某个像素附近的几个像素就行了这时卷积核比较小没有问题。但是当提取的特征变得复杂的时候比如提取的是人的鼻子耳朵的时候需要的可能就是某个像素旁边几十或者几百个像素了。当然我说的这些像素指的是特征图里面的像素。)因此为了获取这些高级信息我们在后面的Inception模块里面需要增大3x3,5x5这些大卷积核的比例。
但是这么做问题又来了如果提高大卷积核的比例那么这会意味着计算复杂度的飙升。为此google的工程师们又提出(b)的这个Inception结构。
Inception的架构
下面的Table.1给出了Googlenet是怎么由Inception模块和一些传统的卷积层与池化层构成的。比较Inception(3a)和Inception(5b)我们可以看到大卷积核的滤波器的个数的比例已经提高了。最后需要注意两点该网络的使用了avg pool来替代第一层全连接层大大降低了参数的个数。后面在avg pool后面加入全连接层则是为了方便微调的操作。
GoogleNet的图片
根据上面的表格我们可以画出这样的一幅图。
Keras代码实现
#-*- coding: UTF-8 -*-from keras.layers import Conv2D, MaxPooling2D, AveragePooling2D, ZeroPadding2D
from keras.layers import Flatten, Dense, Dropout,BatchNormalization
from keras.layers import Input, concatenate
from keras.models import Model,load_model
from keras.preprocessing.image import ImageDataGenerator
from keras.utils import plot_model,np_utils
from keras import regularizers
import keras.metrics as metric
import os# Global Constants
NB_CLASS20
LEARNING_RATE0.01
MOMENTUM0.9
ALPHA0.0001
BETA0.75
GAMMA0.1
DROPOUT0.4
WEIGHT_DECAY0.0005
LRN2D_NORMTrue
DATA_FORMATchannels_last # Theano:channels_first Tensorflow:channels_last
USE_BNTrue
IM_WIDTH224
IM_HEIGHT224
EPOCH50train_root/home/faith/keras/dataset/traindata/
vaildation_root/home/faith/keras/dataset/vaildationdata/
test_root/home/faith/keras/dataset/testdata/IM_WIDTH224
IM_HEIGHT224
batch_size32#train data
train_datagen ImageDataGenerator(rotation_range30,width_shift_range0.2,height_shift_range0.2,shear_range0.2,zoom_range0.2,horizontal_flipTrue,featurewise_centerTrue
)
train_generator train_datagen.flow_from_directory(train_root,target_size(IM_WIDTH, IM_HEIGHT),batch_sizebatch_size,
)#vaild data
vaild_datagen ImageDataGenerator(rotation_range30,width_shift_range0.2,height_shift_range0.2,shear_range0.2,zoom_range0.2,horizontal_flipTrue,featurewise_centerTrue
)
vaild_generator train_datagen.flow_from_directory(vaildation_root,target_size(IM_WIDTH, IM_HEIGHT),batch_sizebatch_size,
)#test data
test_datagen ImageDataGenerator(rotation_range30,width_shift_range0.2,height_shift_range0.2,shear_range0.2,zoom_range0.2,horizontal_flipTrue,featurewise_centerTrue
)
test_generator train_datagen.flow_from_directory(test_root,target_size(IM_WIDTH, IM_HEIGHT),batch_sizebatch_size,
)#normalization
def conv2D_lrn2d(x,filters,kernel_size,strides(1,1),paddingsame,data_formatDATA_FORMAT,dilation_rate(1,1),activationrelu,use_biasTrue,kernel_initializerglorot_uniform,bias_initializerzeros,kernel_regularizerNone,bias_regularizerNone,activity_regularizerNone,kernel_constraintNone,bias_constraintNone,lrn2d_normLRN2D_NORM,weight_decayWEIGHT_DECAY):#l2 normalizationif weight_decay:kernel_regularizerregularizers.l2(weight_decay)bias_regularizerregularizers.l2(weight_decay)else:kernel_regularizerNonebias_regularizerNonexConv2D(filtersfilters,kernel_sizekernel_size,stridesstrides,paddingpadding,data_formatdata_format,dilation_ratedilation_rate,activationactivation,use_biasuse_bias,kernel_initializerkernel_initializer,bias_initializerbias_initializer,kernel_regularizerkernel_regularizer,bias_regularizerbias_regularizer,activity_regularizeractivity_regularizer,kernel_constraintkernel_constraint,bias_constraintbias_constraint)(x)if lrn2d_norm:#batch normalizationxBatchNormalization()(x)return xdef inception_module(x,params,concat_axis,paddingsame,data_formatDATA_FORMAT,dilation_rate(1,1),activationrelu,use_biasTrue,kernel_initializerglorot_uniform,bias_initializerzeros,kernel_regularizerNone,bias_regularizerNone,activity_regularizerNone,kernel_constraintNone,bias_constraintNone,lrn2d_normLRN2D_NORM,weight_decayNone):(branch1,branch2,branch3,branch4)paramsif weight_decay:kernel_regularizerregularizers.l2(weight_decay)bias_regularizerregularizers.l2(weight_decay)else:kernel_regularizerNonebias_regularizerNone#1x1pathway1Conv2D(filtersbranch1[0],kernel_size(1,1),strides1,paddingpadding,data_formatdata_format,dilation_ratedilation_rate,activationactivation,use_biasuse_bias,kernel_initializerkernel_initializer,bias_initializerbias_initializer,kernel_regularizerkernel_regularizer,bias_regularizerbias_regularizer,activity_regularizeractivity_regularizer,kernel_constraintkernel_constraint,bias_constraintbias_constraint)(x)#1x1-3x3pathway2Conv2D(filtersbranch2[0],kernel_size(1,1),strides1,paddingpadding,data_formatdata_format,dilation_ratedilation_rate,activationactivation,use_biasuse_bias,kernel_initializerkernel_initializer,bias_initializerbias_initializer,kernel_regularizerkernel_regularizer,bias_regularizerbias_regularizer,activity_regularizeractivity_regularizer,kernel_constraintkernel_constraint,bias_constraintbias_constraint)(x)pathway2Conv2D(filtersbranch2[1],kernel_size(3,3),strides1,paddingpadding,data_formatdata_format,dilation_ratedilation_rate,activationactivation,use_biasuse_bias,kernel_initializerkernel_initializer,bias_initializerbias_initializer,kernel_regularizerkernel_regularizer,bias_regularizerbias_regularizer,activity_regularizeractivity_regularizer,kernel_constraintkernel_constraint,bias_constraintbias_constraint)(pathway2)#1x1-5x5pathway3Conv2D(filtersbranch3[0],kernel_size(1,1),strides1,paddingpadding,data_formatdata_format,dilation_ratedilation_rate,activationactivation,use_biasuse_bias,kernel_initializerkernel_initializer,bias_initializerbias_initializer,kernel_regularizerkernel_regularizer,bias_regularizerbias_regularizer,activity_regularizeractivity_regularizer,kernel_constraintkernel_constraint,bias_constraintbias_constraint)(x)pathway3Conv2D(filtersbranch3[1],kernel_size(5,5),strides1,paddingpadding,data_formatdata_format,dilation_ratedilation_rate,activationactivation,use_biasuse_bias,kernel_initializerkernel_initializer,bias_initializerbias_initializer,kernel_regularizerkernel_regularizer,bias_regularizerbias_regularizer,activity_regularizeractivity_regularizer,kernel_constraintkernel_constraint,bias_constraintbias_constraint)(pathway3)#3x3-1x1pathway4MaxPooling2D(pool_size(3,3),strides1,paddingpadding,data_formatDATA_FORMAT)(x)pathway4Conv2D(filtersbranch4[0],kernel_size(1,1),strides1,paddingpadding,data_formatdata_format,dilation_ratedilation_rate,activationactivation,use_biasuse_bias,kernel_initializerkernel_initializer,bias_initializerbias_initializer,kernel_regularizerkernel_regularizer,bias_regularizerbias_regularizer,activity_regularizeractivity_regularizer,kernel_constraintkernel_constraint,bias_constraintbias_constraint)(pathway4)return concatenate([pathway1,pathway2,pathway3,pathway4],axisconcat_axis)def create_model():#Data format:tensorflow,channels_last;theano,channels_lastif DATA_FORMATchannels_first:INP_SHAPE(3,224,224)img_inputInput(shapeINP_SHAPE)CONCAT_AXIS1elif DATA_FORMATchannels_last:INP_SHAPE(224,224,3)img_inputInput(shapeINP_SHAPE)CONCAT_AXIS3else:raise Exception(Invalid Dim Ordering)xconv2D_lrn2d(img_input,64,(7,7),2,paddingsame,lrn2d_normFalse)xMaxPooling2D(pool_size(3,3),strides2,paddingsame,data_formatDATA_FORMAT)(x)xBatchNormalization()(x)xconv2D_lrn2d(x,64,(1,1),1,paddingsame,lrn2d_normFalse)xconv2D_lrn2d(x,192,(3,3),1,paddingsame,lrn2d_normTrue)xMaxPooling2D(pool_size(3,3),strides2,paddingsame,data_formatDATA_FORMAT)(x)xinception_module(x,params[(64,),(96,128),(16,32),(32,)],concat_axisCONCAT_AXIS) #3axinception_module(x,params[(128,),(128,192),(32,96),(64,)],concat_axisCONCAT_AXIS) #3bxMaxPooling2D(pool_size(3,3),strides2,paddingsame,data_formatDATA_FORMAT)(x)xinception_module(x,params[(192,),(96,208),(16,48),(64,)],concat_axisCONCAT_AXIS) #4axinception_module(x,params[(160,),(112,224),(24,64),(64,)],concat_axisCONCAT_AXIS) #4bxinception_module(x,params[(128,),(128,256),(24,64),(64,)],concat_axisCONCAT_AXIS) #4cxinception_module(x,params[(112,),(144,288),(32,64),(64,)],concat_axisCONCAT_AXIS) #4dxinception_module(x,params[(256,),(160,320),(32,128),(128,)],concat_axisCONCAT_AXIS) #4exMaxPooling2D(pool_size(3,3),strides2,paddingsame,data_formatDATA_FORMAT)(x)xinception_module(x,params[(256,),(160,320),(32,128),(128,)],concat_axisCONCAT_AXIS) #5axinception_module(x,params[(384,),(192,384),(48,128),(128,)],concat_axisCONCAT_AXIS) #5bxAveragePooling2D(pool_size(7,7),strides1,paddingvalid,data_formatDATA_FORMAT)(x)xFlatten()(x)xDropout(DROPOUT)(x)xDense(output_dimNB_CLASS,activationlinear)(x)xDense(output_dimNB_CLASS,activationsoftmax)(x)return x,img_input,CONCAT_AXIS,INP_SHAPE,DATA_FORMATdef check_print():# Create the Modelx,img_input,CONCAT_AXIS,INP_SHAPE,DATA_FORMATcreate_model()# Create a Keras ModelmodelModel(inputimg_input,output[x])model.summary()# Save a PNG of the Model Buildplot_model(model,to_fileGoogLeNet.png)model.compile(optimizeradam,losscategorical_crossentropy,metrics[acc,metric.top_k_categorical_accuracy])print Model Compiledreturn modelif __name____main__:if os.path.exists(inception_1.h5):modelload_model(inception_1.h5)else:modelcheck_print()model.fit_generator(train_generator,validation_datavaild_generator,epochsEPOCH,steps_per_epochtrain_generator.n/batch_size,validation_stepsvaild_generator.n/batch_size)model.save(inception_1.h5)model.metrics[acc,metric.top_k_categorical_accuracy]loss,acc,top_accmodel.evaluate_generator(test_generator,stepstest_generator.n/batch_size)print Test result:loss:%f,acc:%f,top_acc:%f%(loss,acc,top_acc)为了搭建Inception网络我们使用了以下策略
使用了inception_module这个函数构造每个inception模块里面有4路分别对应着1x1(1x1,3x3),(1x1,5x5),(3x3,1x1) 这四路。使用了3个正则化的手段分别是L2正则化,BatchNormalization,dropout来防止模型过拟合。create_model这个函数里面的网络搭建可以参考Tabel.1可以边看表里面的具体参数边搭网络。
整个代码的流程如下
导入相应库模型参数设置以及其它配置生成训练集,测试集,验证集的三个迭代器Inception module函数的编写create model函数编写,仿照Table.1模型编译,画出模型的图模型训练与验证模型保存模型在测试集上测试 实验结果
datasetlossacctop5-accTraining set1.8539.9%85.3%Vaildation set2.0136.6%82.0%Testing set2.0835.7%78.1%
实验结果分析 我们可以发现模型最后在测试集上的效果与训练集上的效果有一定程度上的差距模型出现了一点过拟合。以下是个人对此问题的一些分析由于采用了L2正则化BatchNormalization,Dropout等等方法但是还是出现了过拟合可能是由于VOC数据比较少20类物体才1.7万张相当于每个物体850张左右要想取得比较好的效果每个类别物体的图片至少得几千张。所以可以通过降低网络层数增加数据量增加训练次数等手段来提高网络的性能。 本博客相关引用
以下是本博客的引用再次本人对每个引用的作者表示感谢。读者如果对googlenet这个网络仍然存在一些疑虑或者想要有更深的理解可以参考以下的引用。
引用博客1
引用博客2
引用博客3
引用文献1:InceptionV1
引用文献2:InceptionV2
引用文献3:InceptionV3
引用文献4:InceptionV4!