现在已经有很很多优秀的神经网络模型,这些模型大部分都是使用ImageNet数据集1000类训练得到的。然而我们在实际应用中1000类的模型并不完全适用我们自己的数据集,而使用自己的数据集训练需要花费大量的计算时间,而且有可能数据不够无法得到理想的模型。这时候我们可以保留训练好的模型的大部分参数,而仅仅对网络的最后几层全连接层进行Finetuning。这里我们将适用猫狗大战数据集中的1500张图对VGG16网络网络的最后三层全连接层进行训练,因为我们最后输出只有两类,所有将最后一层全连接层输出维度改为2。
猫狗大战数据集地址:
(1)下载并分类处理猫狗大战训练集和VGG16权重
猫狗大战数据集下载链接如下
https://pan.baidu.com/s/13hw4LK8ihR6-6-8mpjLKDA
密码:dmp4
VGG16权重链接如下
链接: https://pan.baidu.com/s/123VBgiXNikGTRkDv57lj5Q
密码: nih7
下载后得到数据的训练集和测试集

在这里我们只需要训练集,训练集中包括猫狗图像25000张,数据太多了而且猫狗的图像都在一个文件夹中,只于图像的名字区分,很不利于我们制作训练集啊,因此我们写了一个简单的程序从训练集中取1000张图像,并将猫狗分别保存到文件夹内,对了为了方便大家单独新建个文件夹用于保存分类后的图像,可以参考下面代码中的路径。
import os
import shutil
#下载得到的训练集图像
image_path='/home/cyy/python_code/tensorflow/kaggle/train'
#将猫狗分类保存的路径
train_path='/home/cyy/python_code/tensorflow/dog_cat_classification/data'
image_list=os.listdir(image_path)
#读取1000张猫狗图像,按照图像名字分别保存
for image_name in image_list[0:1000]:
class_name=image_name[0:3]
save_path=os.path.join(train_path,class_name)
if not(os.path.exists(save_path)):
os.mkdir(save_path)
file_name=os.path.join(image_path,image_name)
save_name=os.path.join(save_path,image_name)
shutil.copyfile(file_name,save_name)
这样就将1000张猫狗图像分别保存到了两个文件夹中,如下图所示

(2)搭建VGG16神经网络
VGG16 网络由ImageNet数据集训练1000类得到,所有最后一层全连接层输出为1000类,为了实现对猫狗的识别我们将最后一层输出改为2,并对最后的三层全连接层进行训练,所有在下面的VGG16_model.py文件中可以看到,只有最后三层全连接层我们选择了trainable=True。
import numpy as np
import tensorflow as tf
class vgg16:
def __init__(self, imgs):
self.parameters = []
self.imgs = imgs
self.convlayers()
self.fc_layers()
self.probs = self.fc8
def saver(self):
return tf.train.Saver()
def maxpool(self,name,input_data, trainable):
out = tf.nn.max_pool(input_data,[1

本文介绍了如何利用预训练的VGG16模型对猫狗大战数据集进行微调,通过修改最后三层全连接层以适应二分类任务,最后展示模型在训练后的良好分类效果。

1万+

被折叠的 条评论
为什么被折叠?



