利用vgg预训练模型提取图像特征

VGG卷积神经网络是牛津大学在2014年提出来的模型。当这个模型被提出时,由于它的简洁性和实用性,马上成为了当时最流行的卷积神经网络模型。它在图像分类和目标检测任务中都表现出非常好的结果。在2014年的ILSVRC比赛中,VGG 在Top-5中取得了92.3%的正确率。有VGG16和VGG19,模型的权重由ImageNet训练而来
1、VGG结构
利用vgg预训练模型提取图像特征_第1张图片
下面以VGG16为例来说明:
利用vgg预训练模型提取图像特征_第2张图片
看出VGG16由13个卷积层+3个全连接层=16层构成,过程为:
经过的卷积核大小为333,stride=1,padding=1,pooling为采用2x2的max pooling方式。
(1) 输入:输入224 * 224 * 3的图片。
(2) Conv1_1+conv1_2+pool1:经过64个卷积核的两次卷积后,采用一次max pooling。经过第一次卷积后,有(3 * 3 * 3) * 64=1728个训练参数;第二次卷积后,有(3 * 3 * 64) * 64=36864个训练参数,大小变为112 * 112 * 64.
(3) Conv2_1+conv2_2+pool2:经过两次128个的卷积核卷积之后,采用一次max pooling,有(3 * 3 * 128) * 128=147456个训练参数,大小变为56 * 56 * 128.
(4) Conv3_1+conv3_2+con3_3+pool3: 经过三次256个的卷积核卷积之后,采用一次max pooling,有(3 * 3 * 256) * 256=589824个训练参数,大小变为28 * 28 * 256.
(5) Conv4_1+conv4_2+con4_3+pool4: 经过三次512个的卷积核卷积之后,采用一次max pooling,有(3 * 3 * 512) * 512=2359296个训练参数,大小变为14 * 14 * 512.
(6) Conv5_1+conv5_2+con5_3+pool5: 再经过三次512个的卷积核卷积之后,采用一次max pooling,有(3 * 3 * 512) * 512=2359296个训练参数,大小变为7 * 7 * 512.
(7) Fc6+Fc7+Fc8:经过三次全连接,最终得到1000维的向量。

2、利用tensorflow搭建网络并提取指定层特征
包括定义网络参数,定义卷积层、池化层、全连接层操作,定义网络结构,等操作,然后根据是分类任务或是其他任务定义损失函数开始训练等。代码较长,在此就不列出,会附在附件中,需要的同事可查看。因为我只需要利用预训练好的vgg提取图像的特征,所以会去掉最后一层softmax,这里需要提前下载在大的图像数据集ImageNet上训练好的网络权重文件vgg16.npy。加载方法如下:vgg16_npy_path为vgg16.npy文件的存放路径,
在这里插入图片描述
提取图像特征的代码如下,需要提取哪一层的特征,就把名字修改一下即可,如:我提取的是fc7层,下面就写vgg.fc7,每层名字的定义在vgg16.py文件中,到此操作完毕。
利用vgg预训练模型提取图像特征_第3张图片
3、遇到的问题
在调用vgg16.py函数时,一直报下面这个错误:
在这里插入图片描述
查找原因发现是因为split()这个函数在不同版本的tensorflow中参数位置发生了改变,在tensorflow<0.12.0版本中的用法是:
tf.split(axis, num_or_size_splits, value)
在tensorflow>0.12.0版本中的用法是:
tf.split(value, num_or_size_splits, axis)
在vgg16.py对应位置上修改即可,
利用vgg预训练模型提取图像特征_第4张图片

完整代码:https://github.com/2281123066/vgg-tensorflow.git
vgg16,vgg19模型下载:
链接:https://pan.baidu.com/s/1S0hBs3ioP-TUgd3IS82syQ 密码:s4po

你可能感兴趣的:(vgg,tensorflow,特征提取,深度学习)