tensorfloa学习(一)——有关tensorflow不同层的使用(tf.nn 和tf.layers以及tf.contrib.layers)的简单区别

版权声明:转载需注明出处 https://blog.csdn.net/holmes_MX/article/details/82317742

小trick: 对于使用tf.layers建立的神经网络,如果想要对loss函数进行正则话,可以采用如下方式[1]:

但是该方法不适用于编程者自己定义不同层的正则化。

 l2 = tf.add_n([tf.nn.l2_loss(var) for var in tf.trainable_variables()])

注意:本文中tensorflow ver=1.8

0. 写作目的

好记性不如烂笔头。及时更新。

1. 不同层的介绍

tf.nn是最基础的层,如tf.nn.conv2d, tf.nn.max_pool等,需要编程者自己定义权重。下面给出自己定义的Conv2d函数:

(注意: 这里统一使用tf.variable_scope()来管理范围)


def myConv2d(input_tensor, conv_size, stride_size ,
output_channel, name, regu=None, padding='SAME', act=tf.nn.relu, reuse=False):
    with tf.variable_scope(name, reuse=reuse):
        input_channel = input_tensor.get_shape()[-1].value
        weights = tf.get_variable(name='weights', shape=[conv_size, conv_size, input_channel, output_channel],
                                  dtype=tf.float32,
                                  initializer=tf.truncated_normal_initializer(stddev=0.1))
        biases = tf.get_variable(name='biases', shape=[output_channel], dtype=tf.float32,
                                 initializer=tf.constant_initializer(0.001))
        conv = tf.nn.conv2d(input=input_tensor, filter=weights, strides=[1, stride_size, stride_size, 1], padding=padding,
                            use_cudnn_on_gpu=True, name=name)
        if regu != None and reuse != True:  
            tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regu)(weights))
        print_Layer(conv)
        if act == None:
            return tf.nn.bias_add(value=conv, bias=biases)
        conv_relu = act(tf.nn.bias_add(value=conv, bias=biases))
        print_Layer(conv_relu)
        return conv_relu

tf.layers是基于tf.nn封装的高级函数[2],如果自己定义Conv2d,只需要一个函数即可,如下

tf.layers.conv2d(
    inputs,
    filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    data_format='channels_last',
    dilation_rate=(1, 1),
    activation=None,
    use_bias=True,
    kernel_initializer=None,
    bias_initializer=tf.zeros_initializer(),
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    trainable=True,
    name=None,
    reuse=None
)

tf.contrib.layers.conv2d也是封装完好的高级函数[3],具体为:

tf.contrib.layers.conv2d(
    inputs,
    num_outputs,
    kernel_size,
    stride=1,
    padding='SAME',
    data_format=None,
    rate=1,
    activation_fn=tf.nn.relu,
    normalizer_fn=None,
    normalizer_params=None,
    weights_initializer=initializers.xavier_initializer(),
    weights_regularizer=None,
    biases_initializer=tf.zeros_initializer(),
    biases_regularizer=None,
    reuse=None,
    variables_collections=None,
    outputs_collections=None,
    trainable=True,
    scope=None
)

2. tensorflow中相同功能不同函数的使用对比

2.1 对于初学者

 1) 如果只是想快速了解一下大概,不建议使用tf.nn.conv2d类似的函数,可以使用tf.layers和tf.contrib.layers高级函数

 2) 当有了一定的基础后,如果想在该领域进行深入学习,建议使用tf.nn.conv2d搭建神经网络,此时会帮助你深入理解网络中参数的具体功能与作用,而且对于loss函数需要进行正则化的时候很便于修改。

且能很清晰地知道修改的地方。而如果采用tf.layers和tf.contrib.layers高级函数,由于函数内部有正则项,此时,不利于深入理解。而且如果编写者想自定义loss,此时比较困难,如如果读者想共享参数时,此时计算loss函数中的正则项时,应该只计算一次,如果采用高级函数可能不清楚到底如何计算的。

 

[Reference]

[1] 小trick来源: https://github.com/LaurentMazare/deep-models/blob/master/densenet/densenet.py

[2] tensroflow官网:https://www.tensorflow.org/versions/r1.8/api_docs/python/tf/layers/conv2d

[3] tensroflow官网:https://www.tensorflow.org/versions/r1.8/api_docs/python/tf/contrib/layers/conv2d

 

 

猜你喜欢

转载自blog.csdn.net/holmes_MX/article/details/82317742
今日推荐