前面的博客介绍了如何把图像数据转换成tfrecords格式并读取,本篇博客介绍如何用自己的tfrecords格式的数据训练CNN模型,采用的模型是VGG-16。现有的教程都是在mnist或者cifar-10数据集上做的训练,如何用自己的数据集进行训练相关的资料比较少,即使有相关的也是不完整,所以做一个完成流程的学习笔记,以供以后查阅使用。首先要做的是把自己的数据转换成tfrecords文件。
tfrecords文件制作教程:https://blog.youkuaiyun.com/gybheroin/article/details/79800679
1、实现VGG-16
很久很久以前,有一个年轻小伙子觉得实现一个现成的网络结构是一件非常复杂的事情,直到有一天他发现在caffe平台下修改网络结构就是修改参数文件,他忽然发现,我天,原来这么随意,后来有一天他用了tensorflow,发现原来实现起来是那么任性。。。。。。主要参考代码是tensorflow的源码实现:
#定义卷积层函数
def conv_op(input_op,name,kh,kw,n_out,dh,dw,p): #分别表示输入张量,卷积层名字,
#卷积核高和宽,输出卷积核数量,步长以及步长的高和宽,以及参数列表p
n_in=input_op.get_shape()[-1].value #获取输入的通道数量,即输入的卷积核的数量或者图像通道
with tf.name_scope(name) as scope:
kernel=tf.get_variable(scope+"w",shape=[kh,kw,n_in,n_out],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer_conv2d())
conv=tf.nn.conv2d(input_op,kernel,(1,dh,dw,1),padding='SAME')
bias_init_val=tf.constant(0.0,shape=[n_out],dtype=tf.float32)
biases=tf.Variable(bias_init_val,trainable=True,name='b')
z=tf.nn.bias_add(conv,biases)
activation=tf.nn.relu(z,name=scope)
p+=[kernel,biases]
return activation
#定义全连接层函数
def fc_op(input_op,name,n_out,p):
n_in=input_op.get_shape()[-1].value
with tf.name_scope(name) as scope:
kernel=tf.get_variable(scope+"w",shape=[n_in,n_out],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer())
biases=tf.Variable(tf.constant(0.1,shape=[n_out],dtype=tf.float32),name='b')
activation=tf.nn.relu_layer(input_op,kernel,biases,name=scope)
p+=[kernel,biases]
return activation
#创建最大池