在学习TensorFlow这个Google公司的神器一年之后,因为课题的需求,需要提取卷积神经网络的某一层的特征,也就是我们所说的中层特征,似乎中文网站没有关于这方面的介绍,在经过摸索之后,终于搞清楚了流程,给大家分享一下。
我的GitHub地址是https://github.com/zhuzhuxia1994/midfeature-tensorflow,具体的代码陆续都会放到里面,大家如果方便的话可以点个星,嘿嘿额
首先我默认读者已经具有一定的TensorFlow的基础,因为没有基础的同学应该也不会上来就需要提取中层特征。如果有同学对使用TensorFlow训练自己的数据库还不熟悉的话,可以在下面留言,我会考虑写一下。
众所周知,卷积神经网络中的卷积层的目的其实就是特征提取,当卷积层堆叠的越多,获得的特征就越抽象。
下面先贴上一段卷积神经网络VGG16的代码
def conv_op(input_op, name, kh, kw, n_out, dh, dw, p):
Args:
input_op:输入的tensor
name:这一层的名称
kh:kernel height即卷积核的高
kw:kernel weight即卷积核的宽
n_out:卷积核数量即输出通道数
dh:步长的高
dw:步长的宽
p:参数列表
'''
n_in = input_op.get_shape()[-1].value # 获取input_op的通道数
with tf.name_scope(name) as scope: # 设置scope,生成的Variable使用默认的命名
kernel = tf.get_variable(scope+"w", # kernel(即卷积核参数)使用tf.get_variable创建
shape=[kh, kw, n_in, n_out], # 【卷积核的高,卷积核的宽、输入通道数,输出通道数】
dtype=tf.float32,
initializer=tf.contrib.layers.xavier_initializer_conv2d()) # 参数初始化
# 使用tf.nn.conv2d对input_op进行卷积处理,卷积核kernel,步长dh*dw,padding模式为SAME
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.constant赋值为0
biases = tf.Variable(bias_init_val, trainable=True, name='b') # 将bias_init_val转成可训练的参数
z = tf.nn.bias_add(conv, biases) # 将卷