tf.nn
模块 tf.get_variable:
声明各种权重和偏置变量,该函数在变量没有定义时会创建变量,如果变量已经定义好了则会获取该变量的值,正可用于变量迭代过程。关于 tf.get_variable函数及里面参数的介绍见这里。
conv1_weights = tf.get_variable('conv1_weights', shape=[3, 3, num_channels, 32],dtype=tf.float32) #权重定义
conv1_biases = tf.get_variable('conv1_biases', shape=[32], dtype=tf.float32) #定义偏置
tf.nn.conv2d:卷积操作
net = tf.nn.conv2d(net, conv2_weights, strides=[1, 1, 1, 1], padding='SAME')
tf.nn.relu:
激活函数都使用整流线性单元
net = tf.nn.relu(tf.nn.bias_add(net, conv2_biases))
tf.nn.max_pool
:最大池化
net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
tf.add(tf.matmul(·, ·), ·):
全连接层
net = tf.add(tf.matmul(net, fc9_weights), fc9_biases)
tf.nn.softmax
函数:分类。直接选取最大概率的类标号
def postprocess(self, prediction_dict):
"""Convert predicted output tensors to final forms.
Args:
prediction_dict: A dictionary holding prediction tensors.
**params: Additional keyword arguments for specific implementations
of specified models.
Returns:
A dictionary containing the postprocessed results.
"""
logits = prediction_dict['logits']
logits = tf.nn.softmax(logits)
classes = tf.cast(tf.argmax(logits, axis=1), dtype=tf.int32)
postprecessed_dict = {'classes': classes}
return postprecessed_dict
使用该方法创建的CNN模型见:TensorFlow 训练 CNN 分类器
在 tf.contrib.slim
模块中卷积层的定义通过函数:
slim.conv2d(inputs,
num_outputs, #特征映射个数
kernel_size, #指定核的大小
stride=1, #卷积步幅
padding='SAME', #填充方式,‘SAME’:全零填充;‘’:不填充
data_format=None,
rate=1,
activation_fn=nn.relu, #激活函数
normalizer_fn=None, #正则化方式
normalizer_params=None,
weights_initializer=initializers.xavier_initializer(), #权重的初始化方式
weights_regularizer=None,
biases_initializer=init_ops.zeros_initializer(), #偏置的初始化方式
biases_regularizer=None,
reuse=None,
variables_collections=None,
outputs_collections=None,
trainable=True,
scope=None)
使用 slim 模块来定义卷积层不需要事先额外声明权重和偏置变量,也不需要再额外的显式的进行激活和正则化操作,这些都已经在模块里内置了。
实现相应功能对应的函数:
slim.fully_connected:全连接层
logits = slim.fully_connected(net, num_outputs=self.num_classes,activation_fn=None, scope='Predict')
slim.max_pool2d:池化
slim.batch_norm:批标准化
slim.dropout:dropout
slim.flatten:平铺
更便利的是,如果要重复堆叠多个相同的层,则既可以用循环,比如要重复卷积层 3 次:
for i in range(3):
net = slim.conv2d(net, 256, [3, 3], scope='conv1_{}'.format(i))
来实现,也可以用更简单的函数:
net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv1')
来实现。函数:
slim.repeat(inputs, repetitions, layer, *args, **kwargs)
将使得构建大型神经网络变得更加紧凑和方便。以上这些函数的封装出现使得 TensorFlow 构建卷积神经网络的便捷性大大提高,甚至不输于 Keras。
用该模块创建的CNN模型见:TensorFlow-slim 训练 CNN 分类模型
参考博客:
TensorFlow 训练 CNN 分类器:https://www.jianshu.com/p/9afc598fda2d
TensorFlow-slim 训练 CNN 分类模型:https://www.jianshu.com/p/84c0e2f7f1a5