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

本文详细对比了TensorFlow中tf.nn、tf.layers及tf.contrib.layers下卷积层的使用方法,介绍了不同层的特性与适用场景,尤其针对神经网络正则化技巧进行了深入探讨。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.youkuaiyun.com/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
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值