VGGNet是牛津大学计算机视觉组(Visual Geometry Grouop)和Google DeepMind公司的研究员一起研发的深度卷积神经网络。该网络通过反复堆叠3*3的卷积核和2*2的最大池化层,构建了16~19层卷积神经网络(有多个版本)。VGGNet训练时使用了4块Geforce GTX Titan GPU并行计算,也要耗时2~3周才能训练完。因此,我们依然不训练数据,而是构造出VGGNet网络,并评测其forward耗时和backward耗时。
代码依然很简单,为了避免由于多个隐层致使程序臃肿,我们先定义卷积层函数和全连接层函数。
from datetime import datetime import math import time import tensorflow as tf #其中input_op是输入的tensor,name是这一层的名称,kh是kernel high即卷积核的高,kw是kernel width是卷积核的宽 #n_out是卷积核数量,即输出通道数,dh是步长的高,dw是步长的宽,p是参数列表,用于存入本层的参数 batch_size=32 num_batches=100 def conv_op(input_op,name,kh,kw,n_out,dh,dw,p): n_in=input_op.get_shape()[-1].value #n_in为输入的通道数 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,kh,kw,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
#再定义最大池化层函数,池化尺寸为kh*kw,步长为dh*dw,padding模式为SAME def mpool_op(input_op,name,kh,kw,dh,dw): return tf.nn.max_pool(input_op,ksize=[1,kh,kw,1],strides=[1,dh,dw,1],padding='SAME',name=name)