Tensorflow学习实战之VGG16猫狗大战迁移训练
继续跑深度学习Tensorflow的实战,今天的是VGG16的猫狗大战,整体结构框架由13层卷积和3层全连接层组成,对于对pthon不熟悉的我来说,整个搭建调试过程在于数据的写入处理,维度的变换,以及不同函数的灵活使用。
整个过程,在两个地方卡住,第一个是训练时中途进程中断,修改了不少参数,均没有效果,最终找到的问题是数据集出现了问题,最开始用的是微软官网下载的一个猫狗数据集,后来换数据集之后没有问题。第二个是最后测试的时候出现的问题,载入图片后,总提示维度有问题。
所谓迁移训练呢就是说,在别人训练好的权重基础上呢,进行自己的训练,从而获得适应自己所需任务的模型,结果如下:
整体的框架是这样的:
model.py是用来装载搭建的卷积层框架,test.py用来最终结果的预测,猫狗大战用来跑训练,首先来看看16层卷积的搭建吧:
定义卷积、池化、全连接层,然后是搭建一个13层的卷积,和一个三层的全连接层,微调训练过程中,因为最终结果,只需要预测猫狗,class为2,所以只修改了最终一层全连接层,trainable=Ture
import tensorflow as tf
import numpy as np
import os
#模型定义
class vgg16:
def __init__(self, imgs):
#加入全局列表,把所需参数加载进类里
self.parameters=[]
#初始化
self.imgs=imgs
self.convlayers()
self.fc_layers()
#输出类别的概率
self.probs=tf.nn.softmax(self.fc8)
def saver(self):
return tf.train.Saver()
#定义卷积层
def conv(self,name,input_data,out_channel,trainable=False):
#获取通道数
in_channel=input_data.get_shape()[-1]
with tf.variable_scope(name):
#初始化
kernel=tf.get_variable('weights',[3,3,in_channel,out_channel],dtype=tf.float32,trainable=False)
biases=tf.get_variable('baises',[out_channel],dtype=tf.float32,trainable=False)
conv_res=tf.nn.conv2d(input_data,kernel,[1,1,1,1],padding='SAME')
res=tf.nn.bias_add(conv_res,biases)
out=tf.nn.relu(res,name=name)
self.parameters+=[kernel,biases]
return out
#定义全连接层
def fc(self,name,input_data,out_channel,trainable=True):
#获取维度
shape=input_data.get_shape().as_list()
if len(shape)==4:
size=shape[-1]*shape[-2]*shape[-3]
else :size=shape[1]
#数据展开
input_data_flat=tf.reshape(input_data,[-1,size])
with tf.variable_scope(name):
#初始化
weights=tf.get_variable('weights',shape=[size,out_channel],dtype=tf.float32,trainable=trainable)
biases=tf.get_variable('baises',shape=[out_channel],dtype=tf.float32,trainable=trainable)
res=tf.matmul(input_data_flat,weights)
out=tf.nn.relu(tf.nn.bias_add(res,biases)