深度学习实战(四)——TensorFlow卷积层的定义方式

一、最底层的方式: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 分类器​​​​​​​

二、tensorflow.contrib.slim模型

  在 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

你可能感兴趣的:(TransorFlow笔记,深度学习)